diff options
author | Oxore <oxore@protonmail.com> | 2023-06-28 09:31:59 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-06-28 09:31:59 +0300 |
commit | 43d1ce1201bb1f86345a9f74bbcf53e492f1dc70 (patch) | |
tree | a68201c59ac432bffec09af0254fb13decefae40 | |
parent | f77ac6908cca9fb2be32d04fd6387d417cbc9c39 (diff) |
Add all directives and ignore them
-rw-r--r-- | main.c | 158 |
1 files changed, 147 insertions, 11 deletions
@@ -289,7 +289,60 @@ enum mnemonic { enum directive_type { DT_NONE = 0, DT_ALIGN, + DT_ASCII, + DT_BIN, + DT_BSECTION, + DT_BSS, + DT_BYTE, + DT_CMNT, + DT_COMM, + DT_DATA, + DT_DEF, + DT_DIM, + DT_DOUBLE, + DT_DSECTION, + DT_ECHO, + DT_ELIFDEF, + DT_ELSE, + DT_END, + DT_ENDC, + DT_ENDEF, + DT_ENDIF, + DT_ENDS, + DT_EXTEND, + DT_EXTERN, DT_FILE, + DT_FILL, + DT_FLOAT, + DT_FPDATA, + DT_GLOBL, + DT_IFDEF, + DT_IFNDEF, + DT_INCLUDE, + DT_LCOMM, + DT_LINE, + DT_LN, + DT_LONG, + DT_OPT, + DT_ORG, + DT_PACKED, + DT_PAGE, + DT_REORG, + DT_SCL, + DT_SECTION, + DT_SHORT, + DT_SINGLE, + DT_SIZE, + DT_SPACE, + DT_STRUCT, + DT_TAG, + DT_TEXT, + DT_TSECTION, + DT_TYPE, + DT_VAL, + DT_WORD, + DT_XDEF, + DT_XREF, DIRECTIVES_COUNT, }; @@ -584,16 +637,70 @@ const struct mnemonic_meta { { "unlk", ARGS_COUNT_1 }, }; -static int pars_directive_handler_align(struct pars *, size_t); -static int pars_directive_handler_file(struct pars *, size_t); +static int pars_directive_skip(struct pars *, enum directive_type, size_t); +static int pars_directive_handler_align(struct pars *, enum directive_type, size_t); +static int pars_directive_handler_file(struct pars *, enum directive_type, size_t); const struct directive_description { const char *str; - int (*handler)(struct pars *, size_t lable_id); + int (*handler)(struct pars *, enum directive_type, size_t lable_id); } g_directives[DIRECTIVES_COUNT] = { - { "", NULL, }, - { "align", pars_directive_handler_align, }, - { "file", pars_directive_handler_file, }, + { "", NULL, }, + { "align", pars_directive_handler_align, }, + { "ascii", pars_directive_skip, }, + { "bin", pars_directive_skip, }, + { "bsection", pars_directive_skip, }, + { "bss", pars_directive_skip, }, + { "byte", pars_directive_skip, }, + { "cmnt", pars_directive_skip, }, + { "comm", pars_directive_skip, }, + { "data", pars_directive_skip, }, + { "def", pars_directive_skip, }, + { "dim", pars_directive_skip, }, + { "double", pars_directive_skip, }, + { "dsection", pars_directive_skip, }, + { "echo", pars_directive_skip, }, + { "elifdef", pars_directive_skip, }, + { "else", pars_directive_skip, }, + { "end", pars_directive_skip, }, + { "endc", pars_directive_skip, }, + { "endef", pars_directive_skip, }, + { "endif", pars_directive_skip, }, + { "ends", pars_directive_skip, }, + { "extend", pars_directive_skip, }, + { "extern", pars_directive_skip, }, + { "file", pars_directive_handler_file, }, + { "fill", pars_directive_skip, }, + { "float", pars_directive_skip, }, + { "fpdata", pars_directive_skip, }, + { "globl", pars_directive_skip, }, + { "ifdef", pars_directive_skip, }, + { "ifndef", pars_directive_skip, }, + { "include", pars_directive_skip, }, + { "lcomm", pars_directive_skip, }, + { "line", pars_directive_skip, }, + { "ln", pars_directive_skip, }, + { "long", pars_directive_skip, }, + { "opt", pars_directive_skip, }, + { "org", pars_directive_skip, }, + { "packed", pars_directive_skip, }, + { "page", pars_directive_skip, }, + { "reorg", pars_directive_skip, }, + { "scl", pars_directive_skip, }, + { "section", pars_directive_skip, }, + { "short", pars_directive_skip, }, + { "single", pars_directive_skip, }, + { "size", pars_directive_skip, }, + { "space", pars_directive_skip, }, + { "struct", pars_directive_skip, }, + { "tag", pars_directive_skip, }, + { "text", pars_directive_skip, }, + { "tsection", pars_directive_skip, }, + { "type", pars_directive_skip, }, + { "val", pars_directive_skip, }, + { "word", pars_directive_skip, }, + { "xdef", pars_directive_skip, }, + { "xref", pars_directive_skip, }, }; static bool should_be_escaped(const int c) @@ -1854,8 +1961,35 @@ static int pars_finish_directive( return OK; } +static int pars_directive_skip( + struct pars *const self, + const enum directive_type drc, + const size_t label_id) +{ + const size_t first_token = self->cur_tok_id; + size_t num_tokens = 0; + while (1) { + const struct token token = pars_peek(self); + const bool is_end = token.type == TT_COMMENT_SEMICOLON || + token.type == TT_NEWLINE || token.type == TT_ESCAPE; + if (is_end) { + break; + } + pars_commit(self); + num_tokens++; + } + const struct directive directive = { + .type = drc, + .first_token = first_token, + .num_tokens = num_tokens, + }; + return pars_finish_directive(self, label_id, directive); +} + static int pars_directive_handler_align( - struct pars *const self, const size_t label_id) + struct pars *const self, + const enum directive_type drc, + const size_t label_id) { struct expr_tokens_span expr; const int ret = pars_parse_expr(self, &expr); @@ -1863,7 +1997,7 @@ static int pars_directive_handler_align( return ret; } const struct directive directive = { - .type = DT_ALIGN, + .type = drc, .first_token = expr.first_token, .num_tokens = expr.num_tokens, }; @@ -1871,7 +2005,9 @@ static int pars_directive_handler_align( } static int pars_directive_handler_file( - struct pars *const self, const size_t label_id) + struct pars *const self, + const enum directive_type drc, + const size_t label_id) { const struct token filename = pars_peek(self); if (filename.type != TT_STRING) { @@ -1879,7 +2015,7 @@ static int pars_directive_handler_file( } const size_t first_token = pars_commit(self); const struct directive directive = { - .type = DT_FILE, + .type = drc, .first_token = first_token, .num_tokens = 1 }; @@ -1897,7 +2033,7 @@ static int pars_parse_direc(struct pars *const self, const size_t label_id) return pars_yield_error_msg(self, self->cur_tok_id, E_UNKNOWN_DRC); } pars_commit(self); - return g_directives[d].handler(self, label_id); + return g_directives[d].handler(self, d, label_id); } static int pars_parse_arg_after_prefix_expr( |