mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
use getopt(3) instead of our hand-rolled flag parsing
Simplify and standardize the code by using the standard getopt() function for parsing command-line flags. This is a backwards-incompatible change.
This commit is contained in:
163
src/fix/main.c
163
src/fix/main.c
@@ -224,6 +224,9 @@ MBC_String(unsigned char mbc_type)
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int ch;
|
||||||
|
char *ep;
|
||||||
|
|
||||||
int argn = 1;
|
int argn = 1;
|
||||||
char filename[512];
|
char filename[512];
|
||||||
char cartname[32];
|
char cartname[32];
|
||||||
@@ -239,97 +242,81 @@ main(int argc, char *argv[])
|
|||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
PrintUsage();
|
PrintUsage();
|
||||||
|
|
||||||
while (argn < argc) {
|
while ((ch = getopt(argc, argv, "b:cdjk:m:op:qrst:v")) != -1) {
|
||||||
if (argv[argn][0] == '-') {
|
switch (ch) {
|
||||||
switch (argv[argn][1]) {
|
case 'd':
|
||||||
case '?':
|
ulOptions |= OPTF_DEBUG;
|
||||||
case 'h':
|
break;
|
||||||
PrintUsage();
|
case 'm':
|
||||||
break;
|
ulOptions |= OPTF_RAMSIZE;
|
||||||
case 'd':
|
ram_size = strtoul(optarg, &ep, 0);
|
||||||
ulOptions |= OPTF_DEBUG;
|
if (optarg[0] == '\0' || *ep != '\0')
|
||||||
break;
|
FatalError("Invalid argument for option 'm'");
|
||||||
case 'm':
|
if (ram_size < 0 || ram_size > 0xFF)
|
||||||
ulOptions |= OPTF_RAMSIZE;
|
FatalError("Argument for option 'm' must be between 0 and 0xFF");
|
||||||
if (strlen(argv[argn] + 2) > 0 && strlen(argv[argn] + 2) <= 2) {
|
break;
|
||||||
int result;
|
case 'j':
|
||||||
result = sscanf(argv[argn] + 2,"%x", &ram_size);
|
ulOptions |= OPTF_JAPAN;
|
||||||
if (!((result == EOF) || (result == 1))) {
|
break;
|
||||||
FatalError("Invalid argument for option 'm'");
|
case 'b':
|
||||||
}
|
ulOptions |= OPTF_MBCTYPE;
|
||||||
} else if (strlen(argv[argn] + 2) > 0) {
|
mbc_type = strtoul(optarg, &ep, 0);
|
||||||
FatalError("RAM size must be between 0 and FF");
|
if (optarg[0] == '\0' || *ep != '\0')
|
||||||
} else {
|
FatalError("Invalid argument for option 'b'");
|
||||||
FatalError("Invalid argument for option 'm'");
|
if (mbc_type < 0 || mbc_type > 0xFF)
|
||||||
}
|
FatalError("Argument for option 'b' must be between 0 and 0xFF");
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'p':
|
||||||
ulOptions |= OPTF_JAPAN;
|
ulOptions |= OPTF_PAD;
|
||||||
break;
|
pad_value = strtoul(optarg, &ep, 0);
|
||||||
case 'b':
|
if (optarg[0] == '\0' || *ep != '\0')
|
||||||
ulOptions |= OPTF_MBCTYPE;
|
FatalError("Invalid argument for option 'p'");
|
||||||
if (strlen(argv[argn] + 2) > 0 && strlen(argv[argn] + 2) <= 2) {
|
if (pad_value < 0 || pad_value > 0xFF)
|
||||||
int result;
|
FatalError("Argument for option 'p' must be between 0 and 0xFF");
|
||||||
result = sscanf(argv[argn] + 2, "%x", &mbc_type);
|
break;
|
||||||
if (!((result == EOF) || (result == 1))) {
|
case 'r':
|
||||||
FatalError("Invalid argument for option 'b'");
|
ulOptions |= OPTF_TRUNCATE;
|
||||||
}
|
break;
|
||||||
} else if (strlen(argv[argn] + 2) > 0) {
|
case 'v':
|
||||||
FatalError("MBC type must be between 0 and FF");
|
ulOptions |= OPTF_VALIDATE;
|
||||||
} else {
|
break;
|
||||||
FatalError("Invalid argument for option 'b'");
|
case 't':
|
||||||
}
|
strncpy(cartname, optarg, 16);
|
||||||
break;
|
ulOptions |= OPTF_TITLE;
|
||||||
case 'p':
|
break;
|
||||||
ulOptions |= OPTF_PAD;
|
case 'k':
|
||||||
if (strlen(argv[argn] + 2) > 0 && strlen(argv[argn] + 2) <= 2) {
|
strncpy(nlicensee, optarg, 2);
|
||||||
int result;
|
ulOptions |= OPTF_NLICENSEE;
|
||||||
result = sscanf(argv[argn] + 2, "%x", &pad_value);
|
break;
|
||||||
if (!((result == EOF) || (result == 1))) {
|
case 'q':
|
||||||
FatalError("Invalid argument for option 'p'");
|
ulOptions |= OPTF_QUIET;
|
||||||
}
|
break;
|
||||||
}
|
case 'o':
|
||||||
break;
|
if (ulOptions & OPTF_GBCMODE) {
|
||||||
case 'r':
|
FatalError("-c and -o can't be used together");
|
||||||
ulOptions |= OPTF_TRUNCATE;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
ulOptions |= OPTF_VALIDATE;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
strncpy(cartname, argv[argn] + 2, 16);
|
|
||||||
ulOptions |= OPTF_TITLE;
|
|
||||||
break;
|
|
||||||
case 'k':
|
|
||||||
strncpy(nlicensee, argv[argn] + 2, 2);
|
|
||||||
ulOptions |= OPTF_NLICENSEE;
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
ulOptions |= OPTF_QUIET;
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
if (ulOptions & OPTF_GBCMODE) {
|
|
||||||
FatalError("-c and -o can't be used together");
|
|
||||||
}
|
|
||||||
ulOptions |= OPTF_GBCMODE;
|
|
||||||
gbc_mode = 0xC0;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
if (ulOptions & OPTF_GBCMODE) {
|
|
||||||
FatalError("-c and -o can't be used together");
|
|
||||||
}
|
|
||||||
ulOptions |= OPTF_GBCMODE;
|
|
||||||
gbc_mode = 0x80;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
ulOptions |= OPTF_SGBMODE;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
ulOptions |= OPTF_GBCMODE;
|
||||||
|
gbc_mode = 0xC0;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
if (ulOptions & OPTF_GBCMODE) {
|
||||||
|
FatalError("-c and -o can't be used together");
|
||||||
|
}
|
||||||
|
ulOptions |= OPTF_GBCMODE;
|
||||||
|
gbc_mode = 0x80;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
ulOptions |= OPTF_SGBMODE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PrintUsage();
|
||||||
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
argn++;
|
}
|
||||||
}
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
if (argv[argc - 1][0] == '-')
|
if (argc == 0)
|
||||||
PrintUsage();
|
PrintUsage();
|
||||||
|
|
||||||
strcpy(filename, argv[argc - 1]);
|
strcpy(filename, argv[argc - 1]);
|
||||||
|
|||||||
Reference in New Issue
Block a user