=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/scanner.c,v retrieving revision 1.4 retrieving revision 1.11 diff -u -p -r1.4 -r1.11 --- OpenXM/src/kan96xx/Kan/scanner.c 2001/05/04 01:06:25 1.4 +++ OpenXM/src/kan96xx/Kan/scanner.c 2020/10/06 11:33:47 1.11 @@ -1,10 +1,12 @@ -/*$OpenXM: OpenXM/src/kan96xx/Kan/scanner.c,v 1.3 2000/03/20 01:53:46 takayama Exp $*/ +/*$OpenXM: OpenXM/src/kan96xx/Kan/scanner.c,v 1.10 2018/09/07 00:15:44 takayama Exp $*/ /* scanner.c (SM StackMachine) */ /* export: struct tokens getokenSM(actionType kind,char *str); scanner.c is used to get tokens from streams. files: none */ #include +#include +#include #include "datatype.h" #include "stackm.h" struct tokens lookupTokens(struct tokens t); @@ -60,41 +62,49 @@ static int FileStackP = 0; /**************** end of declaration part of lexical analizer ******/ static int getSM(); -static putSM(); +static void putSM(); static struct tokens flushSM(); -static isSpaceSM(); -static isDollarSM(); -static isBraceSM(); -static isKakkoSM(); -static isSymbolSM(); -static mygetchar(); -static myungetchar(); +static int isSpaceSM(); +static int isDollarSM(); +static int isBraceSM(); +static int isKakkoSM(); +static int isSymbolSM(); +static int mygetchar(); +static int myungetchar(); +int ScannerWhich = 0; +unsigned char ScannerBuf[SCANNERBUF_SIZE]; +int ScannerPt = 0; /* static mygetchar() { + return( getc(Cfp) ); } */ -static mygetchar() +static int mygetchar() { int c; + c = getc(Cfp); + if (c > 0) { /* ungetchar is ignored */ + ScannerPt++; if (ScannerPt >= SCANNERBUF_SIZE) ScannerPt = 0; + ScannerBuf[ScannerPt] = c; + } if (EchoInScanner) { - c = getc(Cfp); if (c==EOF) { - printf("\n%% EOF of file %x\n",(int) Cfp); + printf("\n%% EOF of file %p\n",Cfp); }else{ printf("%c",c); } return( c ); }else{ - return( getc(Cfp) ); + return( c ); } } -static myungetchar(c) +static int myungetchar(c) int c; { return( ungetc(c,Cfp) ); @@ -105,13 +115,22 @@ static int getSM() /* get a letter from StringSM */ { int c; + + if ((StrpSM > 0) && (StringSM[StrpSM] == ',') && (StringSM[StrpSM-1] == ',')) { int i; + fprintf(stderr,"Warning: ,, is found."); + for (i=(StrpSM-30>0?StrpSM-30:0); i<=StrpSM; i++) { + fprintf(stderr,"%c",StringSM[i]); + } + fprintf(stderr,"\n"); + } + c = StringSM[StrpSM++]; if (c == '\0') { StrpSM--;return(EOF); } else return(c); } -static putSM(c) +static void putSM(c) int c; /* put a letter on BufSM */ { @@ -146,6 +165,7 @@ static struct tokens flushSM() strcpy(token,BufSM); r.token = token; r.kind = TypeSM; + r.tflag = 0; if (r.kind == ID) { if (isLiteral(r.token)) { r.object = lookupLiteralString(r.token); @@ -156,35 +176,35 @@ static struct tokens flushSM() return(r); } -static isSpaceSM(c) +static int isSpaceSM(c) int c; { - if ((c <= ' ') && (c!= EOF)) return(1); + if (((c <= ' ') || c == ',') && (c!= EOF)) return(1); else return(0); } -static isDollarSM(c) +static int isDollarSM(c) int c; { if (c == '$') return(1); else return(0); } -static isBraceSM(c) +static int isBraceSM(c) int c; { if (c == '{') return(1); else return(0); } -static isKakkoSM(c) +static int isKakkoSM(c) int c; { if (c == '(') return(1); else return(0); } -static isSymbolSM(c) +static int isSymbolSM(c) int c; { if ((c == '{') || @@ -207,6 +227,10 @@ struct tokens getokenSM(kind,str) char fname[1024]; if (kind == INIT) { + ScannerWhich = 2; + ScannerPt = 0; + ScannerBuf[0] = 0; + StrpSM = 0; ExistSM = 0; @@ -392,7 +416,7 @@ main() { char *getLOAD_SM1_PATH() { char *p; char *p2; - char *getenv(char *s); + char *getenv(const char *s); p = getenv("LOAD_SM1_PATH"); if (p == NULL) { p = getenv("OpenXM_HOME"); @@ -418,4 +442,39 @@ char *getLOAD_SM1_PATH() { strcpy(p2,p); strcat(p2,"/"); return(p2); } +} + +char *traceShowScannerBuf() { + char *s; + int i,k; + s = NULL; + /* + printf("ScannerPt=%d\n",ScannerPt); + for (i=0; i 0) && (ScannerBuf[0] == 0)) { + s = sGC_malloc(ScannerPt+1); + for (i=1; i<=ScannerPt; i++) { + s[i-1] = ScannerBuf[i]; s[i] = 0; + } + return s; + } + if (ScannerBuf[0] != 0) { + s = sGC_malloc(SCANNERBUF_SIZE+1); + k = ScannerPt+1; + if (k >= SCANNERBUF_SIZE) k = 0; + for (i=0; i= SCANNERBUF_SIZE) k = 0; + } + return s; + } + return s; }