PS2SDK
PS2 Homebrew Libraries
main.c
1 /*
2  main.c - Main program file.
3 */
4 
5 #include <errno.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <sys/stat.h>
9 #include <unistd.h>
10 #include <ctype.h>
11 
12 #include "romimg.h"
13 
14 static void DisplayROMImgDetails(const ROMIMG *ROMImg)
15 {
16  unsigned int i, TotalSize;
17  struct FileEntry *file;
18  char filename[11];
19  if (ROMImg->date != 0)
20  printf("ROM datestamp:\t%04x/%02x/%02x\n", ((unsigned short int *)&ROMImg->date)[1], ((unsigned char *)&ROMImg->date)[1], ((unsigned char *)&ROMImg->date)[0]);
21  if (ROMImg->comment != NULL)
22  printf("ROM comment:\t%s\n", ROMImg->comment);
23 
24  printf("File list:\n"
25  GREEN"Name"DEFCOL" \tSize\n"
26  "-----------------------------\n");
27  for (i = 0, file = ROMImg->files, TotalSize = 0; i < ROMImg->NumFiles; TotalSize += file->RomDir.size, i++, file++) {
28  snprintf(filename, sizeof(filename), "%.*s", (int)sizeof(file->RomDir.name), file->RomDir.name);
29  printf(GREEN"%-10s"DEFCOL"\t%u\n", filename, file->RomDir.size);
30  }
31 
32  printf("\nTotal size: %u bytes.\n", TotalSize);
33 }
34 
35 static void DisplaySyntaxHelp(void)
36 {
37  printf("Syntax:\n"
38  "ROMIMG -c <ROM image> <files>\n\tCreate ROM image *\n"
39  "ROMIMG -l <ROM image>\n\tList files in ROM image\n"
40  "ROMIMG -a <ROM image> <file(s)>\n\tAdd file(s) to ROM image *\n"
41  "ROMIMG -d <ROM image> <file(s)>\n\tDelete file(s) from ROM image\n"
42  "ROMIMG -x <ROM image>\n\tExtract all files from ROM image\n"
43  "ROMIMG -x <ROM image> <file>\n\tExtract file from ROM image\n"
44  "\n note*: write the switch in uppercase to perform filename transformation (eg: 'ioman.irx' > 'IOMAN')\n"
45  );
46 }
47 
48 static void DisplayAddDeleteOperationResult(int result, const char *InvolvedFile)
49 {
50  switch (result) {
51  case 0: // No error.
52  printf(GRNBOLD"done!"DEFCOL"\n");
53  break;
54  case ENOENT:
55  printf(YELBOLD"file not found."DEFCOL"\n");
56  break;
57  case EIO:
58  printf(REDBOLD"Error writing to file: %s"DEFCOL"\n", InvolvedFile);
59  break;
60  case EEXIST:
61  printf(YELBOLD"File already exists."DEFCOL"\n");
62  break;
63  default:
64  printf(REDBOLD"failed! code: %d"DEFCOL"\n", result);
65  }
66 }
67 
68 int main(int argc, char **argv)
69 {
70  int result;
71  FILE *OutputFile;
72  ROMIMG ROMImg;
73  unsigned int i, FilesAffected;
74  char filename[11];
75  struct FileEntry *file;
76 
77  printf("PlayStation 2 ROM image generator v1.12\n"
78  "Compiled on " __DATE__ " - " __TIME__ "\n"
79  "---------------------------------------\n\n");
80  for (result = 0; result < argc; result++)
81  DPRINTF("\t -- argv[%d] = %s\n", result, argv[result]);
82 
83  if (argc < 2) {
84  DisplaySyntaxHelp();
85  return EINVAL;
86  }
87 
88  if (argc >= 4 && strcasecmp(argv[1], "-c") == 0) {
89  if ((result = CreateBlankROMImg(argv[2], &ROMImg)) == 0) {
90  for (FilesAffected = 0, i = 0; i < argc - 3; i++) {
91  printf("Adding file '%s'", argv[3 + i]);
92  if ((result = AddFile(&ROMImg, argv[3 + i], isupper(argv[1][1]))) == 0)
93  FilesAffected++;
94  printf(result == 0 ? GRNBOLD" done!"DEFCOL"\n" : REDBOLD" failed!"DEFCOL"\n");
95  }
96 
97  if (FilesAffected > 0) {
98  printf("Writing image... ");
99  printf("%s", (result = WriteROMImg(argv[2], &ROMImg)) == 0 ? GRNBOLD"done!"DEFCOL"\n" : REDBOLD"failed!"DEFCOL"\n");
100  }
101  UnloadROMImg(&ROMImg);
102  } else
103  ERROR("(Internal fault) Can't create blank image file: %d (%s). Please report.\n", result, strerror(result));
104  } else if (argc >= 4 && strcasecmp(argv[1], "-a") == 0) {
105  if ((result = LoadROMImg(&ROMImg, argv[2])) == 0) {
106  for (i = 0, FilesAffected = 0; i < argc - 3; i++) {
107  printf("Adding file '%s'", argv[3 + i]);
108  if ((result = AddFile(&ROMImg, argv[3 + i], isupper(argv[1][1]))) == 0)
109  FilesAffected++;
110  DisplayAddDeleteOperationResult(result, argv[3 + i]);
111  }
112 
113  if (FilesAffected > 0) {
114  printf("Writing image... ");
115  printf("%s", (result = WriteROMImg(argv[2], &ROMImg)) == 0 ? GRNBOLD"done!"DEFCOL"\n" : REDBOLD"failed!"DEFCOL"\n");
116  }
117  UnloadROMImg(&ROMImg);
118  } else
119  ERROR("Can't load image file: %s\n", argv[2]);
120  } else if (argc >= 4 && strcmp(argv[1], "-d") == 0) {
121  if ((result = LoadROMImg(&ROMImg, argv[2])) == 0) {
122  for (i = 0, FilesAffected = 0; i < argc - 3; i++) {
123  printf("Removing file %s...", argv[3 + i]);
124  if ((result = DeleteFile(&ROMImg, argv[3 + i])) == 0)
125  FilesAffected++;
126  DisplayAddDeleteOperationResult(result, argv[3 + i]);
127  }
128 
129  if (FilesAffected > 0) {
130  printf("Writing image...");
131  printf("%s", (result = WriteROMImg(argv[2], &ROMImg)) == 0 ? GRNBOLD"done!"DEFCOL"\n" : REDBOLD"failed!"DEFCOL"\n");
132  }
133  UnloadROMImg(&ROMImg);
134  } else
135  ERROR("Can't load image file: %s\n", argv[2]);
136  } else if (argc == 3 && strcmp(argv[1], "-l") == 0) {
137  if ((result = LoadROMImg(&ROMImg, argv[2])) == 0) {
138  DisplayROMImgDetails(&ROMImg);
139  UnloadROMImg(&ROMImg);
140  } else
141  ERROR("Can't load image file: %s\n", argv[2]);
142  } else if ((argc == 3 || argc == 4) && strcmp(argv[1], "-x") == 0) {
143  if ((result = LoadROMImg(&ROMImg, argv[2])) == 0) {
144  if (argc == 3) {
145  char FOLDER[256];
146  snprintf(FOLDER, sizeof(FOLDER), "ext_%s", argv[2]);
147 #if defined(_WIN32) || defined(WIN32)
148  mkdir(FOLDER);
149 #else
150  mkdir(FOLDER, 0755);
151 #endif
152  if (chdir(FOLDER)) {
153  ERROR("Can't change directory to %s\n", FOLDER);
154  UnloadROMImg(&ROMImg);
155  return EINVAL;
156  }
157 
158  printf("File list:\n"
159  GREEN"Name"DEFCOL" \tSize\n"
160  "-----------------------------\n");
161  for (i = 0, file = ROMImg.files; i < ROMImg.NumFiles; i++, file++) {
162  snprintf(filename, sizeof(filename), "%.*s", (int)sizeof(file->RomDir.name), file->RomDir.name);
163  printf(GREEN"%-10s"DEFCOL"\t%u\n", filename, file->RomDir.size);
164 
165  if (file->RomDir.size > 0) {
166  if ((OutputFile = fopen(filename, "wb")) != NULL) {
167  if (fwrite(file->FileData, 1, file->RomDir.size, OutputFile) != file->RomDir.size) {
168  ERROR("Error writing to file %s\n", filename);
169  }
170  fclose(OutputFile);
171  } else {
172  ERROR("Can't create file: %s\n", filename);
173  }
174  }
175  }
176  } else {
177  printf("Extracting file %s...", argv[3]);
178  DisplayAddDeleteOperationResult(result = ExtractFile(&ROMImg, argv[3], argv[3]), argv[3]);
179  }
180 
181  UnloadROMImg(&ROMImg);
182  } else
183  ERROR("Can't load image file: %s\n", argv[2]);
184  } else {
185  WARNING("Unrecognized command or incorrect syntax: %s\n", argv[1]);
186  DisplaySyntaxHelp();
187  result = EINVAL;
188  }
189 
190  return result;
191 }
EIO
#define EIO
Definition: errno.h:29
FileEntry
Definition: romimg.h:50
ENOENT
#define ENOENT
Definition: errno.h:23
ctype.h
stdio.h
EEXIST
#define EEXIST
Definition: errno.h:53
EINVAL
#define EINVAL
Definition: errno.h:63
ImageStructure
Definition: romimg.h:57
errno.h