diff options
Diffstat (limited to 'assembler.c')
-rw-r--r-- | assembler.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/assembler.c b/assembler.c index 142870f..685fcf6 100644 --- a/assembler.c +++ b/assembler.c @@ -1,54 +1,77 @@ #include <stdio.h> #include <stdint.h> +#include <string.h> #include "lex.h" #include "parse.h" #include "instruction.h" #include "output.h" +void print_help(const char *argv0) +{ + fprintf(stderr, "Syntax: %s <in.asm> <out.bin>\n", argv0); +} + int main(int argc, char **argv) { + int error_ret = 1; int ret = 0; + const char *path_in = NULL; + const char *path_out = NULL; FILE *fin = NULL; FILE *fout = NULL; if (argc < 3) { - fprintf(stderr, "Syntax: %s <in.asm> <out.bin>\n", argv[0]); + print_help(argv[0]); return 1; } - if ((fin = fopen(argv[1], "r")) == NULL) { - fprintf(stderr, "Error opening %s: ", argv[1]); + if (strcmp(argv[1], "-q") == 0) { + if (argc != 4) { + print_help(argv[0]); + return 0; + } + error_ret = 0; + path_in = argv[2]; + path_out = argv[3]; + } else { + path_in = argv[1]; + path_out = argv[2]; + } + + + if ((fin = fopen(path_in, "r")) == NULL) { + fprintf(stderr, "Error opening %s: ", path_in); perror("fopen"); - return 1; + return error_ret; } - if ((fout = fopen(argv[2], "wb")) == NULL) { - fprintf(stderr, "Error opening %s: ", argv[2]); + if ((fout = fopen(path_out, "wb")) == NULL) { + fprintf(stderr, "Error opening %s: ", path_out); perror("fopen"); - return 1; + return error_ret; } /****/ struct token *tokens = NULL; size_t tok_count = 0; - if ((tokens = lex(argv[1], fin, &tok_count)) == NULL) - return 2; + if ((tokens = lex(path_in, fin, &tok_count)) == NULL) + return error_ret; /* FIXME package these things into `tok_result`, `parse_result` etc */ struct instruction *insts; size_t insts_count; struct label *labels; size_t labels_count; - if (ret = parse(argv[1], fin, &labels, &labels_count, tokens, tok_count, &insts, &insts_count)) - return ret; + if (ret = parse(path_in, fin, &labels, &labels_count, tokens, tok_count, &insts, &insts_count)) + return error_ret && ret; /* FIXME insert pass for sanity checking identifiers, sizes of values */ /* FIXME insert optional pass for optimisation */ if (ret = output(fout, labels, labels_count, insts, insts_count)) - return ret; + return error_ret && ret; return 0; } |