commit 436e579
Devine Lu Linvega
·
2024-08-25 17:18:44 +0000 UTC
parent 63f1cf6
(uxnasm) Check against label/macro overlaps
1 files changed,
+21,
-17
+21,
-17
1@@ -22,7 +22,7 @@ typedef struct { int line; char *path; } Context;
2 typedef struct { char *name, rune, *data; Uint16 addr, refs, line; } Item;
3
4 static int ptr, length;
5-static char token[0x40], scope[0x40], lambda[0x05];
6+static char token[0x30], scope[0x40], lambda[0x05];
7 static char dict[0x8000], *dictnext = dict;
8 static Uint8 data[0x10000], lambda_stack[0x100], lambda_ptr, lambda_len;
9 static Uint16 labels_len, refs_len, macro_len;
10@@ -123,14 +123,16 @@ static int
11 walkmacro(Item *m, Context *ctx)
12 {
13 unsigned char c;
14- char *dataptr = m->data, *cptr = token;
15+ char *dataptr = m->data, *_token = token;
16 while((c = *dataptr++)) {
17 if(c < 0x21) {
18- *cptr++ = 0x00;
19+ *_token++ = 0x00;
20 if(token[0] && !parse(token, NULL, ctx)) return 0;
21- cptr = token;
22- } else
23- *cptr++ = c;
24+ _token = token;
25+ } else if(_token - token < 0x2f)
26+ *_token++ = c;
27+ else
28+ return error_asm("Token size exceeded");
29 }
30 return 1;
31 }
32@@ -139,19 +141,19 @@ static int
33 walkfile(FILE *f, Context *ctx)
34 {
35 unsigned char c;
36- char *cptr = token;
37+ char *_token = token;
38 while(f && fread(&c, 1, 1, f)) {
39 if(c < 0x21) {
40- *cptr++ = 0x00;
41+ *_token++ = 0x00;
42 if(token[0] && !parse(token, f, ctx)) return 0;
43 if(c == 0xa) ctx->line++;
44- cptr = token;
45- } else if(cptr - token < 0x3f)
46- *cptr++ = c;
47+ _token = token;
48+ } else if(_token - token < 0x2f)
49+ *_token++ = c;
50 else
51- return error_asm("Token too long");
52+ return error_asm("Token size exceeded");
53 }
54- *cptr++ = 0;
55+ *_token++ = 0;
56 return parse(token, f, ctx);
57 }
58
59@@ -172,8 +174,9 @@ makemacro(char *name, FILE *f, Context *ctx)
60 char c;
61 Item *m;
62 if(macro_len >= 0x100) return error_asm("Macros limit exceeded");
63- if(isinvalid(name)) return error_asm("Macro is invalid");
64- if(findmacro(name)) return error_asm("Macro is duplicate");
65+ if(isinvalid(name)) return error_asm("Macro invalid");
66+ if(findmacro(name)) return error_asm("Macro duplicate");
67+ if(findlabel(name)) return error_asm("Label duplicate");
68 m = ¯os[macro_len++];
69 m->name = push(name, 0);
70 m->data = dictnext;
71@@ -201,6 +204,7 @@ makelabel(char *name, int setscope, Context *ctx)
72 name = join(scope, '/', name + 1);
73 if(labels_len >= 0x400) return error_asm("Labels limit exceeded");
74 if(isinvalid(name)) return error_asm("Label invalid");
75+ if(findmacro(name)) return error_asm("Label duplicate");
76 if(findlabel(name)) return error_asm("Label duplicate");
77 l = &labels[labels_len++];
78 l->name = push(name, 0);
79@@ -294,7 +298,7 @@ assemble(char *filename)
80 ctx.line = 1;
81 ctx.path = push(filename, 0);
82 if(!(f = fopen(filename, "r")))
83- return error_top("Source missing", filename);
84+ return error_top("File missing", filename);
85 res = walkfile(f, &ctx);
86 fclose(f);
87 return res;
88@@ -348,7 +352,7 @@ resolve(char *filename)
89 case ',':
90 *rom = rel = l->addr - r->addr - 2;
91 if((Sint8)data[r->addr] != rel)
92- return error_ref("Relative reference too far");
93+ return error_ref("Reference too far");
94 break;
95 case '-':
96 case '.':