X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=token.c;h=53f76a98c2e283e4e9042c4987aac4d081201e54;hp=f30db090dc2d217907ee2a7b09a70413bf02e728;hb=bb94015a443a0aebaa93ee62f9f2738fa3a96784;hpb=daf2f61a3664329ae7f9609e1e14da2b8780fd10 diff --git a/token.c b/token.c index f30db09..53f76a9 100644 --- a/token.c +++ b/token.c @@ -16,6 +16,7 @@ #define DEF_KW // Declare keyword values #include "kwtab.h" // Incl generated keyword tables & defs + int lnsave; // 1; strcpy() text of current line int curlineno; // Current line number int totlines; // Total # of lines @@ -116,19 +117,34 @@ static char * riscregname[] = { }; -// -// Make `fnum' the Current `curfname' -// -void setfnum(WORD fnum) +void SetFilenameForErrorReporting(void) { - FILEREC * fr; + WORD fnum = cfileno; - for(fr=filerec; fr!=NULL && fnum--; fr=fr->frec_next); + // Check for absolute top filename (this should never happen) + if (fnum == -1) + { + curfname = "(*top*)"; + return; + } + + FILEREC * fr = filerec; + + // Advance to the correct record... + while (fr != NULL && fnum != 0) + { + fr = fr->frec_next; + fnum--; + } + // Check for file # record not found (this should never happen either) if (fr == NULL) - curfname = "(*top*)"; - else - curfname = fr->frec_name; + { + curfname = "(*NOT FOUND*)"; + return; + } + + curfname = fr->frec_name; } @@ -563,6 +579,8 @@ 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 @@ -586,6 +604,7 @@ char * getmln(void) mjump_align = 1; } +#endif return imacro->im_lnbuf; } @@ -612,7 +631,7 @@ char * getrln(void) return NULL; } - strp = irept->ir_nextln; //strp + strp = irept->ir_nextln; } strcpy(irbuf, (char *)(irept->ir_nextln + 1)); @@ -634,7 +653,7 @@ int include(int handle, char * fname) // Verbose mode if (verb_flag) - printf("[Including: %s]\n", fname); + printf("[include: %s, cfileno=%u]\n", fname, cfileno); // Alloc and initialize include-descriptors inobj = a_inobj(SRC_IFILE); @@ -645,12 +664,14 @@ int include(int handle, char * fname) ifile->ifoldlineno = curlineno; // Save old line number ifile->ifoldfname = curfname; // Save old filename ifile->ifno = cfileno; // Save old file number - cfileno = filecount++; // Compute new file number + +// cfileno = filecount++; // Compute new file number + // NB: This *must* be preincrement, we're adding one to the filecount here! + cfileno = ++filecount; // Compute NEW file number curfname = strdup(fname); // Set current filename (alloc storage) curlineno = 0; // Start on line zero // Add another file to the file-record -// fr = (FILEREC *)amem((LONG)sizeof(FILEREC)); fr = (FILEREC *)malloc(sizeof(FILEREC)); fr->frec_next = NULL; fr->frec_name = curfname; @@ -661,6 +682,7 @@ int include(int handle, char * fname) last_fr->frec_next = fr; // Append to list of filerecs last_fr = fr; + DEBUG printf("[include: curfname: %s, cfileno=%u]\n", curfname, cfileno); return OK; } @@ -747,10 +769,14 @@ int fpop(void) ifile->if_link = f_ifile; f_ifile = ifile; close(ifile->ifhandle); // Close source file +if (verb_flag) printf("[fpop (pre): curfname=%s]\n", curfname); curfname = ifile->ifoldfname; // Set current filename +if (verb_flag) printf("[fpop (post): curfname=%s]\n", curfname); +if (verb_flag) printf("[fpop: (pre) cfileno=%d ifile->ifno=%d]\n", (int)cfileno, (int)ifile->ifno); curlineno = ifile->ifoldlineno; // Set current line# DEBUG printf("cfileno=%d ifile->ifno=%d\n", (int)cfileno, (int)ifile->ifno); cfileno = ifile->ifno; // Restore current file number +if (verb_flag) printf("[fpop: (post) cfileno=%d ifile->ifno=%d]\n", (int)cfileno, (int)ifile->ifno); break; case SRC_IMACRO: // Pop and release an IMACRO imacro = inobj->inobj.imacro; @@ -899,6 +925,7 @@ int tokln(void) case SRC_IFILE: if ((ln = getln()) == NULL) { +if (verb_flag) printf("tokln: Calling fpop() from SRC_IFILE...\n"); fpop(); // Pop input level goto retry; // Try for more lines } @@ -945,6 +972,7 @@ int tokln(void) case SRC_IREPT: if ((ln = getrln()) == NULL) { +if (verb_flag) printf("tokln: Calling fpop() from SRC_IREPT...\n"); fpop(); goto retry; } @@ -1530,6 +1558,7 @@ int d_goto(WORD unused) return error("goto label not found"); } + void DumpTokenBuffer(void) { TOKEN * t; @@ -1618,3 +1647,4 @@ void DumpTokenBuffer(void) printf("[EOL]\n"); } +