xlink: use getopt(3) instead of hand-rolled flag parsing

This commit is contained in:
bentley
2010-01-15 00:23:59 -07:00
parent 0017a93a13
commit c5ce3ae178

View File

@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "asmotor.h" #include "asmotor.h"
@@ -119,30 +120,28 @@ ProcessLinkfile(char *tzLinkfile)
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int ch;
char *ep;
SLONG argn = 0; SLONG argn = 0;
argc -= 1; if (argc == 1)
argn += 1;
if (argc == 0)
PrintUsage(); PrintUsage();
while (*argv[argn] == '-') { while ((ch = getopt(argc, argv, "m:n:s:t:z:")) != -1) {
char opt; switch (ch) {
argc -= 1;
switch (opt = argv[argn++][1]) {
case '?':
case 'h':
PrintUsage();
break;
case 'm': case 'm':
SetMapfileName(argv[argn - 1] + 2); SetMapfileName(optarg);
break; break;
case 'n': case 'n':
SetSymfileName(argv[argn - 1] + 2); SetSymfileName(optarg);
break;
case 's':
options |= OPT_SMART_C_LINK;
strcpy(smartlinkstartsymbol, optarg);
break; break;
case 't': case 't':
switch (opt = argv[argn - 1][2]) { switch (optarg[0]) {
case 'g': case 'g':
outputtype = OUTPUT_GBROM; outputtype = OUTPUT_GBROM;
break; break;
@@ -154,42 +153,31 @@ main(int argc, char *argv[])
outputtype = OUTPUT_PSION2; outputtype = OUTPUT_PSION2;
break; break;
default: default:
errx(5, "Unknown option 't%c'", errx(5, "Invalid argument to option t");
opt);
break; break;
} }
break; break;
case 'z': case 'z':
if (strlen(argv[argn - 1] + 2) <= 2) { if (optarg[0] == '?')
if (strcmp(argv[argn - 1] + 2, "?") == 0) {
fillchar = -1; fillchar = -1;
} else { else {
int result; fillchar = strtoul(optarg, &ep, 0);
if (optarg[0] == '\0' || *ep != '\0')
result =
sscanf(argv[argn - 1] + 2, "%lx",
&fillchar);
if (!((result == EOF) || (result == 1))) {
errx(5,
"Invalid argument for option 'z'");
}
}
} else {
errx(5, "Invalid argument for option 'z'"); errx(5, "Invalid argument for option 'z'");
if (fillchar < 0 || fillchar > 0xFF)
errx(5, "Argument for option 'z' must be between 0 and 0xFF");
} }
break; break;
case 's':
options |= OPT_SMART_C_LINK;
strcpy(smartlinkstartsymbol, argv[argn - 1] + 2);
break;
default: default:
errx(5, "Unknown option '%c'", opt); PrintUsage();
break; /* NOTREACHED */
} }
} }
argc -= optind;
argv += optind;
if (argc == 1) { if (argc == 1) {
ProcessLinkfile(argv[argn++]); ProcessLinkfile(argv[argc - 1]);
AddNeededModules(); AddNeededModules();
AssignSections(); AssignSections();
CreateSymbolTable(); CreateSymbolTable();