X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=9754f4e4220750a0b0e92886eb414a60ace3bb8d;hp=2e6c4563df05517a7e8cbb3e4bfcdb565d9fda4e;hb=c2caacfdc844e2f8b5d05b0699fbacc04b4ce8ea;hpb=f3c7d186a15b89c39e360b9cc89545a0d24bd6a4 diff --git a/token.c b/token.c index 2e6c456..9754f4e 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); @@ -1639,7 +1645,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 +1674,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 +1810,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)