uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit 6ac22a1e1a2b8c6fe8464a9cdb7ed91ce83b6cd3
parent d96902b2d75a861cd95251f535a23d7542c37de6
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date:   Mon, 25 Mar 2024 20:41:02 -0700

findlabel can find sublabels

Diffstat:
Msrc/uxnasm.c | 11+++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git 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;