X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=4ceaa579abb3e232931c1aae68533408f6ff746b;hp=1722f63ee5bf8c4d8785fb7d551fda4528796f53;hb=ff8188b7e279f99cf11ac8a283c4146af324d26f;hpb=49eac9eff9d177e717de7bc8799a632c46b79237 diff --git a/token.c b/token.c index 1722f63..4ceaa57 100644 --- a/token.c +++ b/token.c @@ -568,7 +568,8 @@ DEBUG { printf("ExM: SYMBOL=\"%s\"", d); } // to choke on legitimate code... Need to investigate this further // before changing anything else here! case CONST: - sprintf(numbuf, "$%lx", (long unsigned int)*tk++); + tk++; // Skip the hi LONG... + sprintf(numbuf, "$%lx", (uint64_t)*tk++); d = numbuf; break; case DEQUALS: @@ -949,7 +950,7 @@ int TokenizeLine(void) int state = 0; // State for keyword detector int j = 0; // Var for keyword detector uint8_t c; // Random char - VALUE v; // Random value + uint64_t v; // Random value uint8_t * nullspot = NULL; // Spot to clobber for SYMBOL termination int stuffnull; // 1:terminate SYMBOL '\0' at *nullspot uint8_t c1; @@ -1133,7 +1134,7 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); } if (((chrtab[*ln] & DOT) == 0) || (dotxtab[*ln] == 0)) return error("[bwsl] must follow '.' in symbol"); - v = (VALUE)dotxtab[*ln++]; + v = (uint32_t)dotxtab[*ln++]; if (chrtab[*ln] & CTSYM) return error("misuse of '.'; not allowed in symbols"); @@ -1292,6 +1293,11 @@ dostring: case '\\': c = '\\'; break; + case '!': + // If we're evaluating a macro + // this is valid and expands to + // "dot-size" + break; default: warn("bad backslash code in string"); ln--; @@ -1332,13 +1338,15 @@ dostring: } else if ((*(ln + 1) & 0xDF) == 'L') { + v &= 0xFFFFFFFF; ln += 2; } } } *tk++ = CONST; - *tk++ = v; + *tk++ = v >> 32; // High LONG of 64-bit value + *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value if (obj_format == ALCYON) { @@ -1443,12 +1451,14 @@ dostring: if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) { + v &= 0xFFFFFFFF; ln += 2; } } *tk++ = CONST; - *tk++ = v; + *tk++ = v >> 32; // High LONG of 64-bit value + *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value continue; case '@': // @ or octal constant if (*ln < '0' || *ln > '7') @@ -1478,12 +1488,14 @@ dostring: if ((*(ln+1) == 'l') || (*(ln+1) == 'L')) { + v &= 0xFFFFFFFF; ln += 2; } } *tk++ = CONST; - *tk++ = v; + *tk++ = v >> 32; // High LONG of 64-bit value + *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value continue; case '^': // ^ or ^^ if (*ln != '^') @@ -1557,20 +1569,37 @@ dostring: { v &= 0x000000FF; ln += 2; + *tk++ = CONST; + *tk++ = 0; // Hi LONG of 64-bits + *tk++ = v; + *tk++ = DOTB; } else if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W')) { v &= 0x0000FFFF; ln += 2; + *tk++ = CONST; + *tk++ = 0; // Hi LONG of 64-bits + *tk++ = v; + *tk++ = DOTW; } else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) { + v &= 0xFFFFFFFF; ln += 2; + *tk++ = CONST; + *tk++ = 0; // Hi LONG of 64-bits + *tk++ = v; + *tk++ = DOTL; } } + else + { + *tk++ = CONST; + *tk++ = v >> 32; // High LONG of 64-bit value + *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value + } - *tk++ = CONST; - *tk++ = v; //printf("CONST: %i\n", v); continue; } @@ -1668,8 +1697,8 @@ void DumpTokenBuffer(void) printf("[COLON]"); else if (*t == CONST) { - t++; - printf("[CONST: $%X]", (uint32_t)*t); + printf("[CONST: $%lX]", ((uint64_t)t[1] << 32) | (uint64_t)t[2]); + t += 2; } else if (*t == ACONST) {