summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-06-28 09:31:59 +0300
committerOxore <oxore@protonmail.com>2023-06-28 09:31:59 +0300
commit43d1ce1201bb1f86345a9f74bbcf53e492f1dc70 (patch)
treea68201c59ac432bffec09af0254fb13decefae40
parentf77ac6908cca9fb2be32d04fd6387d417cbc9c39 (diff)
Add all directives and ignore them
-rw-r--r--main.c158
1 files changed, 147 insertions, 11 deletions
diff --git a/main.c b/main.c
index 15cdd87..51be920 100644
--- a/main.c
+++ b/main.c
@@ -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(