case DOTL:
d = ".l";
break;
+ case CR_ABSCOUNT:
+ d = "^^abscount";
+ break;
case CR_DATE:
d = "^^date";
break;
//
char * GetNextMacroLine(void)
{
- unsigned source_addr;
+// unsigned source_addr;
IMACRO * imacro = cur_inobj->inobj.imacro;
// LONG * strp = imacro->im_nextln;
// Pop IFENT levels until we reach the conditional assembly context we
// were at when the input object was entered.
while (ifent != inobj->in_ifent)
- d_endif();
+ {
+ if (d_endif() != 0) // Something bad happened during endif parsing?
+ return -1; // If yes, bail instead of getting stuck in a loop
+ }
tok = inobj->in_otok; // Restore tok and otok
etok = inobj->in_etok;
if ((ln = GetNextLine()) == NULL)
{
if (verb_flag) printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n");
- fpop(); // Pop input level
- goto retry; // Try for more lines
+ if (fpop() == 0) // Pop input level
+ goto retry; // Try for more lines
+ else
+ {
+ ifent->if_prev = (IFENT *) - 1; //Signal Assemble() that we have reached EOF with unbalanced if/endifs
+ return TKEOF;
+ }
}
curlineno++; // Bump line number
case SRC_IMACRO:
if ((ln = GetNextMacroLine()) == NULL)
{
- ExitMacro(); // Exit macro (pop args, do fpop(), etc)
- goto retry; // Try for more lines...
+ if (ExitMacro() == 0) // Exit macro (pop args, do fpop(), etc)
+ goto retry; // Try for more lines...
+ else
+ return TKEOF; // Oops, we got a non zero return code, signal EOF
}
lntag = '@';
// Compare names (sleazo string compare)
// This string compare is not right. Doesn't check for lengths.
// (actually it does, but in a crappy, unclear way.)
-#warning "!!! Bad string comparison !!!"
+WARNING(!!!! Bad string comparison !!!)
s1 = sym;
// s2 = (char *)(defln + 1) + 1;
s2 = defln->line;
printf("[DOTI]");
else if (*t == ENDEXPR)
printf("[ENDEXPR]");
+ else if (*t == CR_ABSCOUNT)
+ printf("[CR_ABSCOUNT]");
else if (*t == CR_DEFINED)
printf("[CR_DEFINED]");
else if (*t == CR_REFERENCED)