Browse code

(uxnasm) Warn for refs size limit

neauoire authored on 27/11/2021 22:44:28
Showing 1 changed files
... ...
@@ -72,6 +72,12 @@ error(const char *name, const char *msg)
72 72
 	return 0;
73 73
 }
74 74
 
75
+static char *
76
+sublabel(char *src, char *scope, char *name)
77
+{
78
+	return scat(scat(scpy(scope, src, 64), "/"), name);
79
+}
80
+
75 81
 static Macro *
76 82
 findmacro(char *name)
77 83
 {
... ...
@@ -161,6 +167,23 @@ makelabel(char *name)
161 167
 	return 1;
162 168
 }
163 169
 
170
+static int
171
+makereference(char *scope, char *label, Uint16 addr)
172
+{
173
+	char subw[64];
174
+	Reference *r;
175
+	if(p.rlen == 2048)
176
+		return error("Too many references", label);
177
+	r = &p.refs[p.rlen++];
178
+	if(label[1] == '&')
179
+		scpy(sublabel(subw, scope, label + 2), r->name, 64);
180
+	else
181
+		scpy(label + 1, r->name, 64);
182
+	r->rune = label[0];
183
+	r->addr = addr;
184
+	return 1;
185
+}
186
+
164 187
 static void
165 188
 writebyte(Uint8 b)
166 189
 {
... ...
@@ -192,25 +215,6 @@ writelitbyte(Uint8 b)
192 215
 	litlast = 1;
193 216
 }
194 217
 
195
-static char *
196
-sublabel(char *src, char *scope, char *name)
197
-{
198
-	return scat(scat(scpy(scope, src, 64), "/"), name);
199
-}
200
-
201
-static void
202
-prefill(char *scope, char *label, Uint16 addr)
203
-{
204
-	char subw[64];
205
-	Reference *r = &p.refs[p.rlen++];
206
-	if(label[1] == '&')
207
-		scpy(sublabel(subw, scope, label + 2), r->name, 64);
208
-	else
209
-		scpy(label + 1, r->name, 64);
210
-	r->rune = label[0];
211
-	r->addr = addr;
212
-}
213
-
214 218
 static int
215 219
 doinclude(const char *filename)
216 220
 {
... ...
@@ -274,19 +278,19 @@ tokenize(char *w, FILE *f)
274 278
 			writeshort(shex(w + 1), 1);
275 279
 		break;
276 280
 	case '.': /* literal byte zero-page */
277
-		prefill(p.scope, w, p.ptr - litlast);
281
+		makereference(p.scope, w, p.ptr - litlast);
278 282
 		writelitbyte(0xff);
279 283
 		break;
280 284
 	case ',': /* literal byte relative */
281
-		prefill(p.scope, w, p.ptr - litlast);
285
+		makereference(p.scope, w, p.ptr - litlast);
282 286
 		writelitbyte(0xff);
283 287
 		break;
284 288
 	case ';': /* literal short absolute */
285
-		prefill(p.scope, w, p.ptr);
289
+		makereference(p.scope, w, p.ptr);
286 290
 		writeshort(0xffff, 1);
287 291
 		break;
288 292
 	case ':': /* raw short absolute */
289
-		prefill(p.scope, w, p.ptr);
293
+		makereference(p.scope, w, p.ptr);
290 294
 		writeshort(0xffff, 0);
291 295
 		break;
292 296
 	case '\'': /* raw char */