diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-05-22 23:09:56 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-05-22 23:09:56 +0100 |
commit | 5c6d23c0fee17ded445315a0b0ed7afadbf9455f (patch) | |
tree | b81d5888f7b830d36fd86acf2da57fa9a03d2ba0 /tr8as.c | |
parent | db37956d3b98b27726035286afc4dd2fd13506b5 (diff) | |
download | tr8vm-5c6d23c0fee17ded445315a0b0ed7afadbf9455f.tar.gz tr8vm-5c6d23c0fee17ded445315a0b0ed7afadbf9455f.zip |
wlen wasn't needed
Diffstat (limited to 'tr8as.c')
-rw-r--r-- | tr8as.c | 211 |
1 files changed, 52 insertions, 159 deletions
@@ -178,32 +178,33 @@ static char * skip_whitespace(char *c) return c; } -static uint8_t next_string(As *as, char **c, char *word, uint8_t *wlen) +static uint8_t next_string(As *as, char **c, char *word) { + uint8_t wlen = 0; + *c = skip_whitespace(*c); - *wlen = 0; if (**c != '"') return 0; (*c)++; while (**c && **c != '"') { - word[(*wlen)++] = **c; + word[wlen++] = **c; (*c)++; - if (*wlen == MAX_ID) + if (wlen == MAX_ID) { - word[*wlen - 1] = 0; - *wlen = 0; + word[wlen - 1] = 0; return error_l("String is too long", &as->loc, word); } } - word[*wlen] = 0; + word[wlen] = 0; /* the closing quote */ - (*c)++; + if (**c == '"') + (*c)++; - return 1; + return wlen > 0; } static uint8_t isspecial(char c) @@ -245,25 +246,25 @@ static uint8_t new_define(As *as, char *id, char *value) return 1; } -static uint8_t next_word(As *as, char **c, char *word, uint8_t *wlen) +static uint8_t next_word(As *as, char **c, char *word) { + uint8_t wlen = 0; + *c = skip_whitespace(*c); - *wlen = 0; while (**c && (isalnum(**c) || isspecial(**c))) { - word[(*wlen)++] = **c; + word[wlen++] = **c; (*c)++; - if (*wlen == MAX_ID) + if (wlen == MAX_ID) { - word[*wlen - 1] = 0; - *wlen = 0; + word[wlen - 1] = 0; return error_l("Invalid input (too long)", &as->loc, word); } } - word[*wlen] = 0; + word[wlen] = 0; - return 1; + return wlen > 0; } static uint8_t next_imm(As *as, char *word, uint16_t *n) @@ -496,14 +497,10 @@ static uint8_t emit_imm(As *as, uint16_t imm) static uint8_t parse_org(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; /* .org imm */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (!next_imm(as, word, &as->addr)) @@ -521,7 +518,6 @@ static uint8_t parse_include(As *as, char **c) { /* XXX: may be support longer filenames */ char word[MAX_ID + 1]; - uint8_t wlen; char line[MAX_LINE]; Location old; FILE *fd; @@ -529,10 +525,7 @@ static uint8_t parse_include(As *as, char **c) /* .include "filename" */ - if (!next_string(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_string(as, c, word)) return error_l("Syntax error", &as->loc, "expected string"); fd = fopen(word, "rb"); @@ -570,17 +563,13 @@ static uint8_t parse_incpng(As *as, char **c) { /* XXX: may be support longer filenames */ char word[MAX_ID + 1]; - uint8_t wlen; /* .incpng "filename" */ - if (!next_string(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_string(as, c, word)) return error_l("Syntax error", &as->loc, "expected string"); - if (strcasecmp(word + wlen - 4, ".png")) + if (strcasecmp(word + strlen(word) - 4, ".png")) return error_l("Invalid input", &as->loc, "expected PNG file"); int x, y, n; @@ -629,16 +618,12 @@ static uint8_t parse_incbin(As *as, char **c) { /* XXX: may be support longer filenames */ char word[MAX_ID + 1]; - uint8_t wlen; FILE *fd; size_t size; /* .incbin "filename" */ - if (!next_string(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_string(as, c, word)) return error_l("Syntax error", &as->loc, "expected string"); fd = fopen(word, "rb"); @@ -676,20 +661,13 @@ static uint8_t parse_equ(As *as, char **c) { char id[MAX_ID + 1]; char value[MAX_ID + 1]; - uint8_t wlen; /* .equ label imm */ - if (!next_word(as, c, id, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, id)) return error_l("Syntax error", &as->loc, "expected id"); - if (!next_word(as, c, value, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, value)) return error_l("Syntax error", &as->loc, "expected value"); return new_define(as, id, value); @@ -730,17 +708,13 @@ static uint8_t parse_str(As *as, char **c) static uint8_t parse_db(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t imm = 0xff; /* .db imm [, imm] */ while (1) { - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (next_imm(as, word, &imm)) @@ -772,17 +746,13 @@ static uint8_t parse_db(As *as, char **c) static uint8_t parse_dw(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t imm; /* .dw imm [, imm] */ while (1) { - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (!next_imm(as, word, &imm) @@ -811,15 +781,11 @@ static uint8_t parse_dw(As *as, char **c) static uint8_t parse_ds(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t count = 0xff, imm = 0xff; /* .ds count, imm */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected count"); if (!next_imm(as, word, &count)) @@ -830,10 +796,7 @@ static uint8_t parse_ds(As *as, char **c) return error_l("Syntax error", &as->loc, "expected ,"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (next_imm(as, word, &imm)) @@ -919,13 +882,9 @@ static uint8_t parse_ret(As *as, char **c) static uint8_t parse_r1_r2_or_imm(As *as, char **c, uint8_t *r1, uint8_t *r2, uint16_t *imm) { char word[MAX_ID + 1]; - uint8_t wlen; /* ? r1, ? */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); *r1 = parse_register(word); @@ -937,10 +896,7 @@ static uint8_t parse_r1_r2_or_imm(As *as, char **c, uint8_t *r1, uint8_t *r2, ui return error_l("Syntax error", &as->loc, "expected ,"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register or immediate"); /* ? r1, r2 */ @@ -964,13 +920,9 @@ static uint8_t parse_r1_r2_or_imm(As *as, char **c, uint8_t *r1, uint8_t *r2, ui static uint8_t parse_r1_imm(As *as, char **c, uint8_t *r1, uint16_t *imm) { char word[MAX_ID + 1]; - uint8_t wlen; /* ? r1, imm */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); *r1 = parse_register(word); @@ -982,10 +934,7 @@ static uint8_t parse_r1_imm(As *as, char **c, uint8_t *r1, uint16_t *imm) return error_l("Syntax error", &as->loc, "expected ,"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (!isdigit(*word)) @@ -1171,14 +1120,10 @@ static uint8_t parse_rol(As *as, char **c) static uint8_t parse_push(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1; /* PUSH r1 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1196,14 +1141,10 @@ static uint8_t parse_push(As *as, char **c) static uint8_t parse_port(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1, r2; /* PORT r1, r2 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1215,10 +1156,7 @@ static uint8_t parse_port(As *as, char **c) return error_l("Syntax error", &as->loc, "expected ,"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r2 = parse_register(word); @@ -1231,14 +1169,10 @@ static uint8_t parse_port(As *as, char **c) static uint8_t parse_pop(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1; /* POP r1 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1256,14 +1190,10 @@ static uint8_t parse_pop(As *as, char **c) static uint8_t parse_xsp(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1; /* XSP r1 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1276,14 +1206,10 @@ static uint8_t parse_xsp(As *as, char **c) static uint8_t parse_inc(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1; /* INC r1 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1296,14 +1222,10 @@ static uint8_t parse_inc(As *as, char **c) static uint8_t parse_dec(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t r1; /* DEC r1 */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1376,13 +1298,9 @@ static uint8_t parse_bni(As *as, char **c) static uint8_t parse_indirect(As *as, char **c, uint8_t *r1, uint8_t *r2, uint16_t *imm) { char word[MAX_ID + 1]; - uint8_t wlen; /* [r1:r2] */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); *r1 = parse_register(word); @@ -1399,10 +1317,7 @@ static uint8_t parse_indirect(As *as, char **c, uint8_t *r1, uint8_t *r2, uint16 return error_l("Syntax error", &as->loc, "expected +"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected immediate"); if (!next_imm(as, word, imm)) @@ -1427,10 +1342,7 @@ static uint8_t parse_indirect(As *as, char **c, uint8_t *r1, uint8_t *r2, uint16 return error_l("Syntax error", &as->loc, "expected :"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); *r2 = parse_register(word); @@ -1448,7 +1360,6 @@ static uint8_t parse_indirect(As *as, char **c, uint8_t *r1, uint8_t *r2, uint16 static uint8_t parse_jmp(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t imm = 0xffff; uint8_t r1, r2; @@ -1464,10 +1375,7 @@ static uint8_t parse_jmp(As *as, char **c) return emit(as, 9, r1, 0, (r2 << 6) | FL); } - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected label or immediate"); /* JMP imm */ @@ -1482,7 +1390,6 @@ static uint8_t parse_jmp(As *as, char **c) static uint8_t parse_call(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t imm = 0xffff; uint8_t r1, r2; @@ -1498,10 +1405,7 @@ static uint8_t parse_call(As *as, char **c) return emit(as, 9, r1, 0, (r2 << 6)); } - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected label or immediate"); /* CALL imm */ @@ -1516,7 +1420,6 @@ static uint8_t parse_call(As *as, char **c) static uint8_t parse_ld(As *as, char **c) { char word[MAX_ID + 1]; - uint8_t wlen; uint16_t imm = 0xff; uint8_t r1, r2, r3; @@ -1536,10 +1439,7 @@ static uint8_t parse_ld(As *as, char **c) return error_l("Syntax error", &as->loc, "expected ,"); (*c)++; - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r3 = parse_register(word); @@ -1553,10 +1453,7 @@ static uint8_t parse_ld(As *as, char **c) } /* LD r1, ? */ - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register"); r1 = parse_register(word); @@ -1583,10 +1480,7 @@ static uint8_t parse_ld(As *as, char **c) return emit(as, 2, r2, r3, r1 << 6); } - if (!next_word(as, c, word, &wlen)) - return 0; - - if (wlen == 0) + if (!next_word(as, c, word)) return error_l("Syntax error", &as->loc, "expected register or immediate"); /* LD r1, r2 */ @@ -1664,7 +1558,6 @@ static InstParse insts[] = static uint8_t parse(As *as, char *c) { char word[MAX_ID + 1]; - uint8_t wlen; uint8_t i; c = skip_whitespace(c); @@ -1673,13 +1566,13 @@ static uint8_t parse(As *as, char *c) if (*c == ';') return 1; - if (!next_word(as, &c, word, &wlen)) - return 0; - /* empty line */ - if (wlen == 0) + if (!*c) return 1; + if (!next_word(as, &c, word)) + return 0; + /* new label */ if (*c == ':') { |