summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-08-11 00:41:32 +0300
committerOxore <oxore@protonmail.com>2023-08-11 00:41:32 +0300
commitd68014816affd9a44458969c47c1803f8d5bbac9 (patch)
treede4a9f40e4ae77b18ce7d3538519e2d1de309d81
parent12169534d91f9fe5f0887c86cef3636a94448b33 (diff)
Fix printing raw tokens of directives
-rw-r--r--main.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/main.c b/main.c
index 5798c68..6132e50 100644
--- a/main.c
+++ b/main.c
@@ -412,6 +412,7 @@ struct instruction {
struct directive {
enum directive_type type;
+ size_t name_token; /// Directive self first token
size_t first_token, num_tokens; /// Directive arguments tokens span
};
@@ -1991,13 +1992,16 @@ static int pars_finish_directive(
if (ret != OK) {
return ret;
}
+ // First token of the directive precedes token of it's arguments, that's why
+ // we subtract 1 here
+ const size_t first_token = label_id ? label_id : directive.name_token;
const struct stmt stmt = {
.type = ST_DIRECTIVE,
.directive = directive,
.label_token = label_id,
.comment_token = comment_id,
- .first_token = label_id,
- .num_tokens = self->cur_tok_id - label_id,
+ .first_token = first_token,
+ .num_tokens = self->cur_tok_id - first_token,
};
fwrite_stmt(&stmt, self->stmttab_stream);
return OK;
@@ -2008,6 +2012,7 @@ static int pars_directive_skip(
const enum directive_type drc,
const size_t label_id)
{
+ const size_t name_token = self->cur_tok_id - 1;
const size_t first_token = self->cur_tok_id;
size_t num_tokens = 0;
while (1) {
@@ -2020,7 +2025,7 @@ static int pars_directive_skip(
pars_commit(self);
num_tokens++;
}
- const struct directive directive = { drc, first_token, num_tokens };
+ const struct directive directive = { drc, name_token, first_token, num_tokens };
return pars_finish_directive(self, label_id, directive);
}
@@ -2029,6 +2034,7 @@ static int pars_directive_handler_def(
const enum directive_type drc,
const size_t label_id)
{
+ const size_t name_token = self->cur_tok_id - 1;
const struct token token = pars_peek(self);
if (token.type != TT_ID) {
return pars_yield_error(self, self->cur_tok_id, E_ID);
@@ -2037,7 +2043,7 @@ static int pars_directive_handler_def(
return pars_yield_error_msg(self, self->cur_tok_id, E_NESTED_DEF);
}
self->in_sat = true;
- const struct directive directive = { drc, pars_commit(self), 1 };
+ const struct directive directive = { drc, name_token, pars_commit(self), 1 };
return pars_finish_directive(self, label_id, directive);
}
@@ -2050,7 +2056,8 @@ static int pars_directive_handler_endef(
return pars_yield_error_msg(self, self->cur_tok_id, E_NMATCH_ENDEF);
}
self->in_sat = false;
- const struct directive directive = { drc, 0, 0 };
+ const size_t name_token = self->cur_tok_id - 1;
+ const struct directive directive = { drc, name_token, 0, 0 };
return pars_finish_directive(self, label_id, directive);
}