Browse code

(uxnasm) Allow returning errors from writebyte().

Andrew Alderwick authored on 19/02/2022 00:26:55
Showing 1 changed files
... ...
@@ -186,37 +186,39 @@ makereference(char *scope, char *label, Uint16 addr)
186 186
 	return 1;
187 187
 }
188 188
 
189
-static void
189
+static int
190 190
 writebyte(Uint8 b)
191 191
 {
192
-	if(p.ptr < TRIM)
192
+	if(p.ptr < TRIM) {
193 193
 		fprintf(stderr, "-- Writing in zero-page: %02x\n", b);
194
+		return 0;
195
+	}
194 196
 	p.data[p.ptr++] = b;
195 197
 	p.length = p.ptr;
196 198
 	litlast = 0;
199
+	return 1;
197 200
 }
198 201
 
199
-static void
202
+static int
200 203
 writeshort(Uint16 s, int lit)
201 204
 {
202 205
 	if(lit)
203
-		writebyte(findopcode("LIT2"));
204
-	writebyte(s >> 8);
205
-	writebyte(s & 0xff);
206
+		if(!writebyte(findopcode("LIT2"))) return 0;
207
+	return writebyte(s >> 8) && writebyte(s & 0xff);
206 208
 }
207 209
 
208
-static void
210
+static int
209 211
 writelitbyte(Uint8 b)
210 212
 {
211 213
 	if(litlast) { /* combine literals */
212 214
 		Uint8 hb = p.data[p.ptr - 1];
213 215
 		p.ptr -= 2;
214
-		writeshort((hb << 8) + b, 1);
215
-		return;
216
+		return writeshort((hb << 8) + b, 1);
216 217
 	}
217
-	writebyte(findopcode("LIT"));
218
-	writebyte(b);
218
+	if(!writebyte(findopcode("LIT"))) return 0;
219
+	if(!writebyte(b)) return 0;
219 220
 	litlast = 1;
221
+	return 1;
220 222
 }
221 223
 
222 224
 static int
... ...
@@ -288,47 +290,52 @@ parse(char *w, FILE *f)
288 290
 	case '#': /* literals hex */
289 291
 		if(!sihx(w + 1) || (slen(w) != 3 && slen(w) != 5))
290 292
 			return error("Invalid hex literal", w);
291
-		if(slen(w) == 3)
292
-			writelitbyte(shex(w + 1));
293
-		else if(slen(w) == 5)
294
-			writeshort(shex(w + 1), 1);
293
+		if(slen(w) == 3) {
294
+			if(!writelitbyte(shex(w + 1))) return 0;
295
+		}
296
+		else if(slen(w) == 5) {
297
+			if(!writeshort(shex(w + 1), 1)) return 0;
298
+		}
295 299
 		break;
296 300
 	case '.': /* literal byte zero-page */
297 301
 		makereference(p.scope, w, p.ptr - litlast);
298
-		writelitbyte(0xff);
302
+		if(!writelitbyte(0xff)) return 0;
299 303
 		break;
300 304
 	case ',': /* literal byte relative */
301 305
 		makereference(p.scope, w, p.ptr - litlast);
302
-		writelitbyte(0xff);
306
+		if(!writelitbyte(0xff)) return 0;
303 307
 		break;
304 308
 	case ';': /* literal short absolute */
305 309
 		makereference(p.scope, w, p.ptr);
306
-		writeshort(0xffff, 1);
310
+		if(!writeshort(0xffff, 1)) return 0;
307 311
 		break;
308 312
 	case ':': /* raw short absolute */
309 313
 		makereference(p.scope, w, p.ptr);
310
-		writeshort(0xffff, 0);
314
+		if(!writeshort(0xffff, 0)) return 0;
311 315
 		break;
312 316
 	case '\'': /* raw char */
313
-		writebyte((Uint8)w[1]);
317
+		if(!writebyte((Uint8)w[1])) return 0;
314 318
 		break;
315 319
 	case '"': /* raw string */
316 320
 		i = 0;
317 321
 		while((c = w[++i]))
318
-			writebyte(c);
322
+			if(!writebyte(c)) return 0;
319 323
 		break;
320 324
 	case '[': break; /* ignored */
321 325
 	case ']': break; /* ignored */
322 326
 	default:
323 327
 		/* opcode */
324
-		if(findopcode(w) || scmp(w, "BRK", 4))
325
-			writebyte(findopcode(w));
328
+		if(findopcode(w) || scmp(w, "BRK", 4)) {
329
+			if(!writebyte(findopcode(w))) return 0;
330
+		}
326 331
 		/* raw byte */
327
-		else if(sihx(w) && slen(w) == 2)
328
-			writebyte(shex(w));
332
+		else if(sihx(w) && slen(w) == 2) {
333
+			if(!writebyte(shex(w))) return 0;
334
+		}
329 335
 		/* raw short */
330
-		else if(sihx(w) && slen(w) == 4)
331
-			writeshort(shex(w), 0);
336
+		else if(sihx(w) && slen(w) == 4) {
337
+			if(!writeshort(shex(w), 0)) return 0;
338
+		}
332 339
 		/* macro */
333 340
 		else if((m = findmacro(w))) {
334 341
 			for(i = 0; i < m->len; i++)