From 9cb8e4f83b49355610134b152df129b2f68ce9fe Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Sat, 8 May 2021 12:22:25 -0400 Subject: Start implementing whole file lexing. This will eventually replace the per-line lexer. --- asmmon.c | 32 ++++++++++++++++++++++++++++++++ asmmon.h | 12 ++++++++++-- assemble.c | 25 +++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/asmmon.c b/asmmon.c index 81edff2..75e331b 100644 --- a/asmmon.c +++ b/asmmon.c @@ -23,6 +23,9 @@ symbol *last_sym = 0; fixup *fixups = 0; fixup *last_fix = 0; +strln *first_strln = 0; +strln *last_strln = 0; + static char tstr[2048]; void viewmem(uint64_t address) { @@ -347,6 +350,30 @@ void list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t addr, u } while (s != e && s); } +strln *make_strln(char *str, int blanks) { + strln *new_strln = malloc(sizeof(strln)); + + if (new_strln == NULL) { + return NULL; + } + + new_strln->next = NULL; + new_strln->prev = NULL; + new_strln->str = str; + new_strln->blanks = blanks; + + if (last_strln == NULL) { + first_strln = new_strln; + } else { + new_strln->prev = last_strln; + last_strln->next = new_strln; + } + + last_strln = new_strln; + + return new_strln; +} + int asmmon(const char *fn) { FILE *fp = NULL; FILE *fp2 = NULL; @@ -616,6 +643,11 @@ int asmmon(const char *fn) { default : break; } if (!is_valid) { + size_t len = strlen(lex_line); + char *tmp = malloc(len+1); + memcpy(tmp, lex_line, len); + tmp[len] = '\0'; + strln *dummy = make_strln(tmp, bline); address = lex(lex_line, address, bline, dbg); bline = 0; } diff --git a/asmmon.h b/asmmon.h index beda687..1be290d 100644 --- a/asmmon.h +++ b/asmmon.h @@ -10,6 +10,7 @@ typedef struct sym symbol; typedef struct fix fixup; typedef struct inst instruction; typedef struct expr expr; +typedef struct strln strln; struct tok { @@ -47,8 +48,6 @@ struct ln { uint64_t addr; /* The address of this line. */ }; - - struct fix { fixup *next; symbol *s; @@ -89,6 +88,12 @@ struct expr { } value; }; +struct strln { + strln *next; + strln *prev; + char *str; + int blanks; +}; extern char lexeme[]; extern char *string[]; @@ -105,6 +110,9 @@ extern symbol *last_loc; extern fixup *fixups; extern fixup *last_fix; +extern strln *first_strln; +extern strln *last_strln; + extern uint8_t lex_type; enum dir { diff --git a/assemble.c b/assemble.c index b51fd5c..cdd82d6 100644 --- a/assemble.c +++ b/assemble.c @@ -1304,6 +1304,23 @@ static void free_fixups(fixup *f) { } } +void free_strlns(strln *root) { + strln *line; + if (root != NULL) { + line = root; + root = root->next; + if (line->str != NULL) { + free(line->str); + } + line->blanks = 0; + line->prev = NULL; + line->next = NULL; + free(line); + line = NULL; + free_strlns(root); + } +} + uint64_t get_tokmem(token *t) { uint64_t i = 0; for (; t; t = t->next, i++); @@ -1324,15 +1341,23 @@ void cleanup() { /*fix_symtree(lines);*/ free_lines(lines); lines = NULL; + last_line = NULL; } if (symbols) { /*print_symtree(symbols, 0);*/ free_symbols(symbols); symbols = NULL; + last_sym = NULL; } if (fixups) { free_fixups(fixups); fixups = NULL; + last_fix = NULL; + } + if (first_strln) { + free_strlns(first_strln); + first_strln = NULL; + last_strln = NULL; } while (i < stridx || i < comidx) { if (i < stridx && string[i]) { -- cgit v1.2.3-13-gbd6f