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:
anthony
2010-01-12 14:25:54 -07:00
parent 8f5e767615
commit 16c7a49ffa

View File

@@ -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]);