]> Shamusworld >> Repos - rmac/blobdiff - token.c
Add support for 64-bit evaluations.
[rmac] / token.c
diff --git a/token.c b/token.c
index 1722f63ee5bf8c4d8785fb7d551fda4528796f53..4ceaa579abb3e232931c1aae68533408f6ff746b 100644 (file)
--- a/token.c
+++ b/token.c
@@ -568,7 +568,8 @@ DEBUG { printf("ExM: SYMBOL=\"%s\"", d); }
 //         to choke on legitimate code... Need to investigate this further
 //         before changing anything else here!
                                                        case CONST:
-                                                               sprintf(numbuf, "$%lx", (long unsigned int)*tk++);
+                                                               tk++;   // Skip the hi LONG...
+                                                               sprintf(numbuf, "$%lx", (uint64_t)*tk++);
                                                                d = numbuf;
                                                                break;
                                                        case DEQUALS:
@@ -949,7 +950,7 @@ int TokenizeLine(void)
        int state = 0;                          // State for keyword detector
        int j = 0;                                      // Var for keyword detector
        uint8_t c;                                      // Random char
-       VALUE v;                                        // Random value
+       uint64_t v;                                     // Random value
        uint8_t * nullspot = NULL;      // Spot to clobber for SYMBOL termination
        int stuffnull;                          // 1:terminate SYMBOL '\0' at *nullspot
        uint8_t c1;
@@ -1133,7 +1134,7 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                                if (((chrtab[*ln] & DOT) == 0) || (dotxtab[*ln] == 0))
                                        return error("[bwsl] must follow '.' in symbol");
 
-                               v = (VALUE)dotxtab[*ln++];
+                               v = (uint32_t)dotxtab[*ln++];
 
                                if (chrtab[*ln] & CTSYM)
                                        return error("misuse of '.'; not allowed in symbols");
@@ -1292,6 +1293,11 @@ dostring:
                                                case '\\':
                                                        c = '\\';
                                                        break;
+                                               case '!':
+                                                       // If we're evaluating a macro
+                                                       // this is valid and expands to
+                                                       // "dot-size"
+                                                       break;
                                                default:
                                                        warn("bad backslash code in string");
                                                        ln--;
@@ -1332,13 +1338,15 @@ dostring:
                                                        }
                                                        else if ((*(ln + 1) & 0xDF) == 'L')
                                                        {
+                                                               v &= 0xFFFFFFFF;
                                                                ln += 2;
                                                        }
                                                }
                                        }
 
                                        *tk++ = CONST;
-                                       *tk++ = v;
+                                       *tk++ = v >> 32;                // High LONG of 64-bit value
+                                       *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value
 
                                        if (obj_format == ALCYON)
                                        {
@@ -1443,12 +1451,14 @@ dostring:
 
                                        if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L'))
                                        {
+                                               v &= 0xFFFFFFFF;
                                                ln += 2;
                                        }
                                }
 
                                *tk++ = CONST;
-                               *tk++ = v;
+                               *tk++ = v >> 32;                // High LONG of 64-bit value
+                               *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value
                                continue;
                        case '@':               // @ or octal constant
                                if (*ln < '0' || *ln > '7')
@@ -1478,12 +1488,14 @@ dostring:
 
                                        if ((*(ln+1) == 'l') || (*(ln+1) == 'L'))
                                        {
+                                               v &= 0xFFFFFFFF;
                                                ln += 2;
                                        }
                                }
 
                                *tk++ = CONST;
-                               *tk++ = v;
+                               *tk++ = v >> 32;                // High LONG of 64-bit value
+                               *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value
                                continue;
                        case '^':               // ^ or ^^ <operator-name>
                                if (*ln != '^')
@@ -1557,20 +1569,37 @@ dostring:
                                {
                                        v &= 0x000000FF;
                                        ln += 2;
+                                       *tk++ = CONST;
+                                       *tk++ = 0;                      // Hi LONG of 64-bits
+                                       *tk++ = v;
+                                       *tk++ = DOTB;
                                }
                                else if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W'))
                                {
                                        v &= 0x0000FFFF;
                                        ln += 2;
+                                       *tk++ = CONST;
+                                       *tk++ = 0;                      // Hi LONG of 64-bits
+                                       *tk++ = v;
+                                       *tk++ = DOTW;
                                }
                                else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L'))
                                {
+                                       v &= 0xFFFFFFFF;
                                        ln += 2;
+                                       *tk++ = CONST;
+                                       *tk++ = 0;                      // Hi LONG of 64-bits
+                                       *tk++ = v;
+                                       *tk++ = DOTL;
                                }
                        }
+                       else
+                       {
+                               *tk++ = CONST;
+                               *tk++ = v >> 32;                // High LONG of 64-bit value
+                               *tk++ = v & 0xFFFFFFFF; // Low LONG of 64-bit value
+                       }
 
-                       *tk++ = CONST;
-                       *tk++ = v;
 //printf("CONST: %i\n", v);
                        continue;
                }
@@ -1668,8 +1697,8 @@ void DumpTokenBuffer(void)
                        printf("[COLON]");
                else if (*t == CONST)
                {
-                       t++;
-                       printf("[CONST: $%X]", (uint32_t)*t);
+                       printf("[CONST: $%lX]", ((uint64_t)t[1] << 32) | (uint64_t)t[2]);
+                       t += 2;
                }
                else if (*t == ACONST)
                {