commit df7cdd1

Devine Lu Linvega  ·  2023-01-22 02:25:15 +0000 UTC
parent 7616af7
Increased limit of refs
1 files changed,  +13, -6
+13, -6
 1@@ -39,7 +39,7 @@ typedef struct {
 2 	Uint16 llen, mlen, rlen;
 3 	Label labels[0x400];
 4 	Macro macros[0x100];
 5-	Reference refs[0x800];
 6+	Reference refs[0x1000];
 7 	char scope[0x40];
 8 } Program;
 9 
10@@ -76,6 +76,10 @@ error(const char *name, const char *msg)
11 static char *
12 sublabel(char *src, char *scope, char *name)
13 {
14+	if(slen(scope) + slen(name) >= 0x3f) {
15+		error("Sublabel length too long", name);
16+		return NULL;
17+	}
18 	return scat(scat(scpy(scope, src, 0x40), "/"), name);
19 }
20 
21@@ -175,12 +179,14 @@ makereference(char *scope, char *label, Uint16 addr)
22 {
23 	char subw[0x40], parent[0x40];
24 	Reference *r;
25-	if(p.rlen == 0x800)
26+	if(p.rlen == 0x1000)
27 		return error("References limit exceeded", label);
28 	r = &p.refs[p.rlen++];
29-	if(label[1] == '&')
30-		scpy(sublabel(subw, scope, label + 2), r->name, 0x40);
31-	else {
32+	if(label[1] == '&') {
33+		if(!sublabel(subw, scope, label + 2))
34+			return error("Invalid sublabel", label);
35+		scpy(subw, r->name, 0x40);
36+	} else {
37 		int pos = spos(label + 1, '/');
38 		if(pos > 0) {
39 			Label *l;
40@@ -287,7 +293,7 @@ parse(char *w, FILE *f)
41 		scpy(w + 1, p.scope, 0x40);
42 		break;
43 	case '&': /* sublabel */
44-		if(!makelabel(sublabel(subw, p.scope, w + 1)))
45+		if(!sublabel(subw, p.scope, w + 1) || !makelabel(subw))
46 			return error("Invalid sublabel", w);
47 		break;
48 	case '#': /* literals hex */
49@@ -408,6 +414,7 @@ static int
50 assemble(FILE *f)
51 {
52 	char w[0x40];
53+	p.ptr = 0x100;
54 	scpy("on-reset", p.scope, 0x40);
55 	while(fscanf(f, "%62s", w) == 1)
56 		if(slen(w) > 0x3d || !parse(w, f))