mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-21 02:32:06 +00:00
xlink: use getopt(3) instead of hand-rolled flag parsing
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user