summaryrefslogtreecommitdiff
path: root/asmcat.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmcat.c')
-rw-r--r--asmcat.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/asmcat.c b/asmcat.c
new file mode 100644
index 0000000..2791443
--- /dev/null
+++ b/asmcat.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "lex.h"
+#include "parse.h"
+#include "instruction.h"
+#include "output_asm.h"
+
+void print_help(const char *argv0)
+{
+ fprintf(stderr, "Syntax: %s <in.asm> <out.asm>\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) {
+ print_help(argv[0]);
+ return 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 error_ret;
+ }
+
+ if ((fout = fopen(path_out, "wb")) == NULL) {
+ fprintf(stderr, "Error opening %s: ", path_out);
+ perror("fopen");
+ return error_ret;
+ }
+/****/
+ struct token *tokens = NULL;
+ size_t tok_count = 0;
+
+ 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(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_asm(fout, labels, labels_count, insts, insts_count)))
+ return error_ret && ret;
+
+ return 0;
+}