summaryrefslogtreecommitdiff
path: root/assembler.c
diff options
context:
space:
mode:
Diffstat (limited to 'assembler.c')
-rw-r--r--assembler.c47
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;
}