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))