char lntag; // Line tag
char * curfname; // Current filename
char tolowertab[128]; // Uppercase ==> lowercase
-char hextab[128]; // Table of hex values
+int8_t hextab[128]; // Table of hex values
char dotxtab[128]; // Table for ".b", ".s", etc.
char irbuf[LNSIZ]; // Text for .rept block line
char lnbuf[LNSIZ]; // Text of current line
{
// Pop IFENT levels until we reach the conditional assembly context we
// were at when the input object was entered.
+ int numUnmatched = 0;
+
while (ifent != inobj->in_ifent)
{
- if (d_endif() != 0) // Something bad happened during endif parsing?
- return -1; // If yes, bail instead of getting stuck in a loop
+ if (d_endif() != 0) // Something bad happened during endif parsing?
+ return -1; // If yes, bail instead of getting stuck in a loop
+
+ numUnmatched++;
}
- tok = inobj->in_otok; // Restore tok and otok
+ // Give a warning to the user that we had to wipe their bum for them
+ if (numUnmatched > 0)
+ warni("missing %d .endif(s)", numUnmatched);
+
+ tok = inobj->in_otok; // Restore tok and otok
etok = inobj->in_etok;
switch (inobj->in_type)
{
- case SRC_IFILE: // Pop and release an IFILE
+ case SRC_IFILE: // Pop and release an IFILE
if (debug)
printf("[Leaving: %s]\n", curfname);
if ((ln = GetNextLine()) == NULL)
{
if (debug) printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n");
- if (fpop()==0) // Pop input level
+ if (fpop() == 0) // Pop input level
goto retry; // Try for more lines
else
{
*p++ = EOS;
continue;
case '$': // $, hex constant
- if ((int)chrtab[*ln] & HDIGIT)
+ if (chrtab[*ln] & HDIGIT)
{
v = 0;
// Parse the hex value
- while ((int)hextab[*ln] >= 0)
+ while (hextab[*ln] >= 0)
v = (v << 4) + (int)hextab[*ln++];
// ggn: Okay, some comments here are in order I think....