diff options
| author | Andrew Chambers <[email protected]> | 2021-10-14 21:35:15 +1300 |
|---|---|---|
| committer | Andrew Chambers <[email protected]> | 2021-10-14 21:35:15 +1300 |
| commit | eefef08f5a465eefe1eaf3d86950af6f6c30ee46 (patch) | |
| tree | 7d19c38f9288367286a9e6c25578dbb327a1c644 | |
| parent | 9fad209177414598f40241f1b2f2c4034b587e2d (diff) | |
Use different style arg parsing.
| -rw-r--r-- | main.c | 50 | ||||
| -rw-r--r-- | minias.h | 23 | ||||
| -rw-r--r-- | parse.c | 2 |
3 files changed, 32 insertions, 43 deletions
@@ -1201,43 +1201,53 @@ static void outelf(void) { } static void usage(char *argv0) { - fprintf(stderr, "usage: %s [-o OUT] [input]\n", argv0); + fprintf(stderr, "usage: %s [-o out] [input]\n", argv0); exit(2); } -int main(int argc, char *argv[]) { - - char *argv0, *outfname; +static void parseargs(int argc, char *argv[]) { + char *a, *argv0, *outfname; argv0 = argv[0]; - ARGBEGIN { - case 'o': - outfname = EARGF(usage(argv0)); - if (!freopen(outfname, "w", stdout)) - fatal("unable to open %s:", outfname); - break; - default: - usage(argv[0]); + for (++argv; *argv; argv++) { + if (argv[0][0] != '-') + break; + for (a = &argv[0][1]; *a; a++) { + switch (*a) { + case 'h': + usage(argv0); + break; + case 'o': + if (argv[1] == NULL) + usage(argv0); + outfname = *++argv; + if (!freopen(outfname, "w", stdout)) + fatal("unable to open %s:", outfname); + break; + default: + usage(argv0); + } + } } - ARGEND - - if (argc >= 2) - usage(argv0); - if (argc == 1) { - infilename = argv[argc - 1]; + if (argv[0]) { + if (argv[1]) + usage(argv0); + infilename = argv[0]; if (!freopen(infilename, "r", stdin)) fatal("unable to open %s:", infilename); } +} +int main(int argc, char *argv[]) { symbols = mkhtab(256); - allasm = parse(); + parseargs(argc, argv); + allasm = parseasm(); initsections(); assemble(); fillsymtab(); handlerelocs(); outelf(); - return 0; }
\ No newline at end of file @@ -338,31 +338,10 @@ struct AsmLine { AsmLine *next; }; -AsmLine *parse(void); +AsmLine *parseasm(void); /* util.c */ -#define ARGBEGIN \ - for (;;) { \ - if (argc > 0) \ - ++argv, --argc; \ - if (argc == 0 || (*argv)[0] != '-') \ - break; \ - if ((*argv)[1] == '-' && !(*argv)[2]) { \ - ++argv, --argc; \ - break; \ - } \ - for (char *opt_ = &(*argv)[1], done_ = 0; !done_ && *opt_; ++opt_) { \ - switch (*opt_) - -#define ARGEND \ - } \ - } - -#define EARGF(x) \ - (done_ = 1, opt_[1] ? ++opt_ : argv[1] ? --argc, \ - *++argv : ((x), abort(), (char *)0)) - void vwarn(const char *fmt, va_list ap); void fatal(const char *fmt, ...); void unreachable(void); @@ -117,7 +117,7 @@ static String decodestring(char *s) { #define YY_CTX_MEMBERS Parsev v; #include "asm.peg.inc" -AsmLine *parse(void) { +AsmLine *parseasm(void) { AsmLine *result, *l, *prevl; yycontext ctx; |
