uxn

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

commit 553e559e4ed895f74d2ba9b6b769549d9f7ef945
parent e6325792435db5b2762483235eb41c7593ef0fdb
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date:   Tue, 26 Mar 2024 10:45:25 -0700

(uxnasm) Abstracted tokenizer

Diffstat:
Msrc/uxnasm.c | 49+++++++++++++++++++++++++++----------------------
1 file changed, 27 insertions(+), 22 deletions(-)

diff --git a/src/uxnasm.c b/src/uxnasm.c @@ -218,11 +218,10 @@ makepad(char *w) int rel = w[0] == '$' ? p.ptr : 0; if(sihx(w + 1)) p.ptr = shex(w + 1) + rel; - else { - if(!(l = findlabel(w + 1))) - return error_asm("Invalid label"); + else if((l = findlabel(w + 1))) p.ptr = l->addr + rel; - } + else + return error_asm("Invalid padding"); return 1; } @@ -275,6 +274,29 @@ writeshort(Uint16 s, int lit) } static int +tokenize(FILE *f) +{ + unsigned int buf; + char *cptr = token; + while(fread(&buf, 1, 1, f)) { + char c = (char)buf; + if(c < 0x21) { + *cptr++ = 0x00; + if(c == 0x0a) + p.line++; + if(token[0]) + if(!parse(token, f)) + return 0; + cptr = token; + } else if(cptr - token < 0x3f) + *cptr++ = c; + else + return error_asm("Token too long"); + } + return 1; +} + +static int doinclude(char *filename) { FILE *f; @@ -443,26 +465,9 @@ resolve(void) static int assemble(FILE *f) { - unsigned int buf; - char *cptr = token; p.ptr = 0x100; scpy("on-reset", p.scope, 0x40); - while(fread(&buf, 1, 1, f)) { - char c = (char)buf; - if(c < 0x21) { - *cptr++ = 0x00; - if(c == 0x0a) - p.line++; - if(token[0]) - if(!parse(token, f)) - return 0; - cptr = token; - } else if(cptr - token < 0x3f) - *cptr++ = c; - else - return error_asm("Token too long"); - } - return resolve(); + return tokenize(f) && resolve(); } static void