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 = &macros[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 '.':