//
#include "token.h"
+
+#include <errno.h>
#include "direct.h"
#include "error.h"
#include "macro.h"
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
// 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;
// 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);
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)
{
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
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
else if ((int)chrtab[*(ln + 1)] & DIGIT)
{
// Hey, more digits after the dot, so we assume it's a
- // floating point number of some kind
-#if 0
- double fract = 10;
- ln++;
- f = (double)v;
-
- while ((int)chrtab[*ln] & DIGIT)
- {
- f = f + (double)(*ln++ - '0') / fract;
- fract *= 10;
- }
-#else
- // Here we parse the whole floating point number
-#include <errno.h>
+ // floating point number of some kind... numEnd will point
+ // to the first non-float character after it's done
char * numEnd;
errno = 0;
double f = strtod(numStart, &numEnd);
if (errno != 0)
return error("floating point parse error");
-#endif
+ // N.B.: We use the C compiler's internal double
+ // representation for all internal float calcs and
+ // are reasonably sure that the size of said double
+ // is 8 bytes long (which we check for in fltpoint.c)
*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;
}
}
// 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;
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");
printf("[COLON]");
else if (t == CONST)
printf("[CONST]");
+ else if (t == FCONST)
+ printf("[FCONST]");
else if (t == ACONST)
printf("[ACONST]");
else if (t == STRING)
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 == FCONST)
+ {
+ PTR tp;
+ tp.u32 = t + 1;
+ printf("[FCONST: $%lX]", *tp.u64);
t += 2;
}
else if (*t == ACONST)