aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c50
-rw-r--r--minias.h23
-rw-r--r--parse.c2
3 files changed, 32 insertions, 43 deletions
diff --git a/main.c b/main.c
index 64101d2..c3ebf98 100644
--- a/main.c
+++ b/main.c
@@ -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
diff --git a/minias.h b/minias.h
index de6f2c8..3f89ef0 100644
--- a/minias.h
+++ b/minias.h
@@ -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);
diff --git a/parse.c b/parse.c
index c34923d..8704298 100644
--- a/parse.c
+++ b/parse.c
@@ -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;