From 6ac22a1e1a2b8c6fe8464a9cdb7ed91ce83b6cd3 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Mon, 25 Mar 2024 20:41:02 -0700 Subject: [PATCH] findlabel can find sublabels --- src/uxnasm.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/uxnasm.c b/src/uxnasm.c index f5adbc7..4f1d8b4 100644 --- a/src/uxnasm.c +++ b/src/uxnasm.c @@ -43,6 +43,7 @@ typedef struct { Reference refs[0x1000]; } Program; +char sublabel[0x40]; char token[0x40]; Program p; @@ -70,6 +71,7 @@ static char *scat(char *dst, const char *src) { char *ptr = dst + slen(dst); whi /* clang-format on */ static int parse(char *w, FILE *f); +static char *makesublabel(char *src, char *scope, char *name); static int error_top(const char *name, const char *msg) @@ -107,6 +109,8 @@ static Label * findlabel(char *name) { int i; + if(name[0] == '&') + name = makesublabel(sublabel, p.scope, name + 1); for(i = 0; i < p.label_len; i++) if(scmp(p.labels[i].name, name, 0x40)) return &p.labels[i]; @@ -218,16 +222,11 @@ makesublabel(char *src, char *scope, char *name) static int makepad(char *w) { - char subw[0x40]; Label *l; int rel = w[0] == '$' ? p.ptr : 0; if(sihx(w + 1)) p.ptr = shex(w + 1) + rel; - else if(w[1] == '&') { - if(!makesublabel(subw, p.scope, w + 2) || !(l = findlabel(subw))) - return error_asm("Invalid sublabel"); - p.ptr = l->addr + rel; - } else { + else { if(!(l = findlabel(w + 1))) return error_asm("Invalid label"); p.ptr = l->addr + rel;