X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=34c4a52ceda455b030d7d9a4023d3c5d0ea15f07;hp=2e6c4563df05517a7e8cbb3e4bfcdb565d9fda4e;hb=4ca28ba07da9f3848c2e3db0e2e9cbcaa787dd29;hpb=f3c7d186a15b89c39e360b9cc89545a0d24bd6a4 diff --git a/token.c b/token.c index 2e6c456..34c4a52 100644 --- a/token.c +++ b/token.c @@ -7,6 +7,8 @@ // #include "token.h" + +#include #include "direct.h" #include "error.h" #include "macro.h" @@ -32,7 +34,7 @@ char irbuf[LNSIZ]; // Text for .rept block line char lnbuf[LNSIZ]; // Text of current line WORD filecount; // Unique file number counter WORD cfileno; // Current file number -TOKENPTR tok; // Ptr to current token +TOKEN * tok; // Ptr to current token TOKEN * etok; // Ptr past last token in tokbuf[] TOKEN tokeol[1] = {EOL}; // Bailout end-of-line token char * string[TOKBUFSIZE*2];// Token buffer string pointer storage @@ -305,7 +307,7 @@ INOBJ * a_inobj(int typ) // Install INOBJ on top of input stack inobj->in_ifent = ifent; // Record .if context on entry inobj->in_type = (WORD)typ; - inobj->in_otok = tok.u32; + inobj->in_otok = tok; inobj->in_etok = etok; inobj->in_link = cur_inobj; cur_inobj = inobj; @@ -714,6 +716,11 @@ char * GetNextRepeatLine(void) // strp = irept->ir_nextln; } + // Mark the current macro line in the irept object + // This is probably overkill - a global variable + // would suffice here (it only gets used during + // error reporting anyway) + irept->lineno = irept->ir_nextln->lineno; // strcpy(irbuf, (char *)(irept->ir_nextln + 1)); strcpy(irbuf, irept->ir_nextln->line); @@ -791,7 +798,7 @@ int fpop(void) if (numUnmatched > 0) warn("missing %d .endif(s)", numUnmatched); - tok.u32 = inobj->in_otok; // Restore tok and otok + tok = inobj->in_otok; // Restore tok and otok etok = inobj->in_etok; switch (inobj->in_type) @@ -946,7 +953,7 @@ int TokenizeLine(void) { uint8_t * ln = NULL; // Ptr to current position in line uint8_t * p; // Random character ptr - TOKENPTR tk; // Token-deposit ptr + PTR tk; // Token-deposit ptr int state = 0; // State for keyword detector int j = 0; // Var for keyword detector uint8_t c; // Random char @@ -1047,7 +1054,7 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); } strcpy(lnbuf, ln); // General housekeeping - tok.u32 = tokeol; // Set "tok" to EOL in case of error + tok = tokeol; // Set "tok" to EOL in case of error tk.u32 = etok; // Reset token ptr stuffnull = 0; // Don't stuff nulls totlines++; // Bump total #lines assembled @@ -1606,7 +1613,6 @@ dostring: } #else // Here we parse the whole floating point number -#include char * numEnd; errno = 0; double f = strtod(numStart, &numEnd); @@ -1618,7 +1624,8 @@ dostring: *tk.u32++ = FCONST; // Shamus: Well, this is all kinds of icky--not the least of which is that unlike uintNN_t types, we have no guarantees of any kind when it comes to the size of floating point numbers in C (as far as I know of). If there is, we need to use those kinds here, or else figure out at runtime what sizes we're dealing with and act accordingly. To be fair, this is OK as long as the double type is less than 64 bits wide, but again, there's no guarantee that it isn't. :-/ - *tk.u64++ = f; + *tk.dp = f; + tk.u64++; continue; } } @@ -1639,7 +1646,7 @@ dostring: // Terminate line of tokens and return "success." goteol: - tok.u32 = etok; // Set tok to beginning of line + tok = etok; // Set tok to beginning of line if (stuffnull) // Terminate last SYMBOL *nullspot = EOS; @@ -1668,11 +1675,11 @@ goteol: int d_goto(WORD unused) { // Setup for the search - if (*tok.u32 != SYMBOL) + if (*tok != SYMBOL) return error("missing label"); - char * sym = string[tok.u32[1]]; - tok.u32 += 2; + char * sym = string[tok[1]]; + tok += 2; if (cur_inobj->in_type != SRC_IMACRO) return error("goto not in macro"); @@ -1804,8 +1811,9 @@ void DumpTokenBuffer(void) printf("[COLON]"); else if (*t == CONST) { - TOKENPTR tp = (TOKENPTR)(t + 1); - printf("[CONST: $%lX]", (uint64_t)(*tp.u64)); + PTR tp; + tp.u32 = t + 1; + printf("[CONST: $%lX]", *tp.u64); t += 2; } else if (*t == ACONST)