X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=4a06efedcbebf1a0fdb72aec48857e74d6286b5a;hp=53f76a98c2e283e4e9042c4987aac4d081201e54;hb=6c1bc379012b1c1ca369e71e39509f3538042382;hpb=11a78647f7f170e6ea39dd04a3734a359151debb diff --git a/token.c b/token.c index 53f76a9..4a06efe 100644 --- a/token.c +++ b/token.c @@ -117,6 +117,57 @@ static char * riscregname[] = { }; +// +// Initialize Tokenizer +// +void InitTokenizer(void) +{ + int i; // Iterator + char * htab = "0123456789abcdefABCDEF"; // Hex character table + + lnsave = 0; // Don't save lines + curfname = ""; // No file, empty filename + filecount = (WORD)-1; + cfileno = (WORD)-1; // cfileno gets bumped to 0 + curlineno = 0; + totlines = 0; + etok = tokbuf; + f_inobj = NULL; + f_ifile = NULL; + f_imacro = NULL; + cur_inobj = NULL; + filerec = NULL; + last_fr = NULL; + lntag = SPACE; + + // Initialize hex, "dot" and tolower tables + for(i=0; i<128; i++) + { + hextab[i] = -1; + dotxtab[i] = 0; + tolowertab[i] = (char)i; + } + + for(i=0; htab[i]!=EOS; i++) + hextab[htab[i]] = (char)((i < 16) ? i : i - 6); + + for(i='A'; i<='Z'; i++) + tolowertab[i] |= 0x20; + + // These characters are legal immediately after a period + dotxtab['b'] = DOTB; // .b .B .s .S + dotxtab['B'] = DOTB; + dotxtab['s'] = DOTB; + dotxtab['S'] = DOTB; + dotxtab['w'] = DOTW; // .w .W + dotxtab['W'] = DOTW; + dotxtab['l'] = DOTL; // .l .L + dotxtab['L'] = DOTL; + dotxtab['i'] = DOTI; // .i .I (???) + dotxtab['I'] = DOTI; +} + + void SetFilenameForErrorReporting(void) { WORD fnum = cfileno; @@ -563,7 +614,7 @@ overflow: // // Get Next Line of Text from a Macro // -char * getmln(void) +char * GetNextMacroLine(void) { unsigned source_addr; @@ -579,33 +630,6 @@ char * getmln(void) // ExpandMacro((char *)(strp + 1), imacro->im_lnbuf, LNSIZ); ExpandMacro(strp->line, imacro->im_lnbuf, LNSIZ); -// bollocks -#if 0 - if (!strcmp(imacro->im_macro->sname, "mjump") && !mjump_align) - { - // if we need to adjust the alignment of the jump source address to - // meet the rules of gpu main execution we need to skip the first nop - // of the macro. This is simpler than trying to insert nop's mid macro. - source_addr = (orgactive ? orgaddr : sloc); - source_addr += 8; - - if (source_addr % 4) - { - strp = imacro->im_nextln; - - if (strp == NULL) - return NULL; - -// imacro->im_nextln = (LONG *)*strp; -// ExpandMacro((char *)(strp + 1), imacro->im_lnbuf, LNSIZ); - imacro->im_nextln = strp->next; - ExpandMacro(strp->line, imacro->im_lnbuf, LNSIZ); - } - - mjump_align = 1; - } -#endif - return imacro->im_lnbuf; } @@ -613,7 +637,7 @@ char * getmln(void) // // Get Next Line of Text from a Repeat Block // -char * getrln(void) +char * GetNextRepeatLine(void) { IREPT * irept = cur_inobj->inobj.irept; @@ -688,57 +712,6 @@ int include(int handle, char * fname) } -// -// Initialize Tokenizer -// -void init_token(void) -{ - int i; // Iterator - char * htab = "0123456789abcdefABCDEF"; // Hex character table - - lnsave = 0; // Don't save lines - curfname = ""; // No file, empty filename - filecount = (WORD)-1; - cfileno = (WORD)-1; // cfileno gets bumped to 0 - curlineno = 0; - totlines = 0; - etok = tokbuf; - f_inobj = NULL; - f_ifile = NULL; - f_imacro = NULL; - cur_inobj = NULL; - filerec = NULL; - last_fr = NULL; - lntag = SPACE; - - // Initialize hex, "dot" and tolower tables - for(i=0; i<128; i++) - { - hextab[i] = -1; - dotxtab[i] = 0; - tolowertab[i] = (char)i; - } - - for(i=0; htab[i]!=EOS; i++) - hextab[htab[i]] = (char)((i < 16) ? i : i - 6); - - for(i='A'; i<='Z'; i++) - tolowertab[i] |= 0x20; - - // These characters are legal immediately after a period - dotxtab['b'] = DOTB; // .b .B .s .S - dotxtab['B'] = DOTB; - dotxtab['s'] = DOTB; - dotxtab['S'] = DOTB; - dotxtab['w'] = DOTW; // .w .W - dotxtab['W'] = DOTW; - dotxtab['l'] = DOTL; // .l .L - dotxtab['L'] = DOTL; - dotxtab['I'] = DOTI; // .l .L - dotxtab['I'] = DOTI; -} - - // // Pop the Current Input Level // @@ -809,7 +782,7 @@ if (verb_flag) printf("[fpop: (post) cfileno=%d ifile->ifno=%d]\n", (int)cfileno // Get line from file into buf, return NULL on EOF or ptr to the start of a // null-term line // -char * getln(void) +char * GetNextLine(void) { int i, j; char * p, * d; @@ -894,7 +867,7 @@ char * getln(void) // // Tokenize a Line // -int tokln(void) +int TokenizeLine(void) { char * ln = NULL; // Ptr to current position in line char * p; // Random character ptr @@ -908,7 +881,7 @@ int tokln(void) char c1; int stringNum = 0; // Pointer to string locations in tokenized line - retry: +retry: if (cur_inobj == NULL) // Return EOF if input stack is empty return TKEOF; @@ -923,9 +896,9 @@ int tokln(void) // o tag the listing-line with a space; // o kludge lines generated by Alcyon C. case SRC_IFILE: - if ((ln = getln()) == NULL) + if ((ln = GetNextLine()) == NULL) { -if (verb_flag) printf("tokln: Calling fpop() from SRC_IFILE...\n"); +if (verb_flag) printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); fpop(); // Pop input level goto retry; // Try for more lines } @@ -958,7 +931,7 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IFILE...\n"); // o Handle end-of-macro; // o tag the listing-line with an at (@) sign. case SRC_IMACRO: - if ((ln = getmln()) == NULL) + if ((ln = GetNextMacroLine()) == NULL) { ExitMacro(); // Exit macro (pop args, do fpop(), etc) goto retry; // Try for more lines... @@ -970,9 +943,9 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IFILE...\n"); // o Handle end-of-repeat-block; // o tag the listing-line with a pound (#) sign. case SRC_IREPT: - if ((ln = getrln()) == NULL) + if ((ln = GetNextRepeatLine()) == NULL) { -if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); +if (verb_flag) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); fpop(); goto retry; } @@ -1081,6 +1054,12 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); j = -1; } + // Make j = -1 if user tries to use a RISC register while in 68K mode + if (!(rgpu || rdsp) && ((TOKEN)j >= KW_R0 && (TOKEN)j <= KW_R31)) + { + j = -1; + } + //make j = -1 if time, date etc with no preceeding ^^ //defined, referenced, streq, macdef, date and time switch ((TOKEN)j) @@ -1092,9 +1071,10 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); case 120: // time case 121: // date j = -1; - break; +// break; } + // If not tokenized keyword OR token was not found if (j < 0 || state < 0) { *tk++ = SYMBOL; @@ -1200,7 +1180,7 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); break; default: warn("bad backslash code in string"); - --ln; + ln--; break; } } @@ -1223,19 +1203,19 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); if (*ln == '.') { - if ((*(ln+1) == 'b') || (*(ln+1) == 'B')) + if ((*(ln + 1) == 'b') || (*(ln + 1) == 'B')) { v &= 0x000000FF; ln += 2; } - if ((*(ln+1) == 'w') || (*(ln+1) == 'W')) + if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W')) { v &= 0x0000FFFF; ln += 2; } - if ((*(ln+1) == 'l') || (*(ln+1) == 'L')) + if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) { ln += 2; } @@ -1292,11 +1272,11 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); { case '>': *tk++ = SHR; - ++ln; + ln++; continue; case '=': *tk++ = GE; - ++ln; + ln++; continue; default: *tk++ = '>'; @@ -1437,22 +1417,20 @@ if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); while ((int)chrtab[*ln] & DIGIT) v = (v * 10) + *ln++ - '0'; - // See if there's a .[bwl] after the constant, & deal with it + // See if there's a .[bwl] after the constant & deal with it if so if (*ln == '.') { - if ((*(ln+1) == 'b') || (*(ln+1) == 'B')) + if ((*(ln + 1) == 'b') || (*(ln + 1) == 'B')) { v &= 0x000000FF; ln += 2; } - - if ((*(ln+1) == 'w') || (*(ln+1) == 'W')) + else if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W')) { v &= 0x0000FFFF; ln += 2; } - - if ((*(ln+1) == 'l') || (*(ln+1) == 'L')) + else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L')) { ln += 2; } @@ -1530,6 +1508,7 @@ int d_goto(WORD unused) { // 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 !!!" s1 = sym; // s2 = (char *)(defln + 1) + 1;