From 0afb7989d3ffb6d95133d62939edb688246f5cc0 Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 20 Apr 2006 20:24:00 +0000 Subject: 64-bit safe (from plan9) --- src/cmd/lex/ldefs.h | 2 ++ src/cmd/lex/lmain.c | 1 + src/cmd/lex/parser.y | 9 +++++---- src/cmd/lex/sub1.c | 35 +++++++++++++++++++++++++++++------ src/cmd/lex/sub2.c | 8 ++++---- 5 files changed, 41 insertions(+), 14 deletions(-) (limited to 'src/cmd/lex') diff --git a/src/cmd/lex/ldefs.h b/src/cmd/lex/ldefs.h index ea95fb51..b976669b 100644 --- a/src/cmd/lex/ldefs.h +++ b/src/cmd/lex/ldefs.h @@ -90,6 +90,7 @@ extern int *name; extern int *left; extern int *right; extern int *parent; +extern uchar **ptr; extern uchar *nullstr; extern int tptr; extern uchar pushc[TOKENSIZE]; @@ -152,6 +153,7 @@ extern void lgate(void); extern int lookup(uchar *, uchar **); extern int member(int, uchar *); extern void mkmatch(void); +extern int mnp(int, void*); extern int mn0(int); extern int mn1(int, int); extern int mn2(int, int, int); diff --git a/src/cmd/lex/lmain.c b/src/cmd/lex/lmain.c index a31b3422..122a5f5e 100644 --- a/src/cmd/lex/lmain.c +++ b/src/cmd/lex/lmain.c @@ -45,6 +45,7 @@ int *left; int *right; int *parent; uchar *nullstr; +uchar **ptr; int tptr; uchar pushc[TOKENSIZE]; uchar slist[STARTSIZE]; diff --git a/src/cmd/lex/parser.y b/src/cmd/lex/parser.y index 8e7285d0..2d57e3f3 100644 --- a/src/cmd/lex/parser.y +++ b/src/cmd/lex/parser.y @@ -120,13 +120,13 @@ r: CHAR } else p = psave; - $$.i = mn1(RCCL,(int)p); + $$.i = mnp(RCCL,p); cclinter(1); } | CCL - ={ $$.i = mn1(RCCL,$1.i); } + ={ $$.i = mnp(RCCL,$1.cp); } | NCCL - ={ $$.i = mn1(RNCCL,$1.i); } + ={ $$.i = mnp(RNCCL,$1.cp); } | r '*' ={ $$.i = mn1(STAR,$1.i); } | r '+' @@ -253,7 +253,8 @@ yylex(void) right = myalloc(treesize,sizeof(*right)); nullstr = myalloc(treesize,sizeof(*nullstr)); parent = myalloc(treesize,sizeof(*parent)); - if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0) + ptr = myalloc(treesize,sizeof(*ptr)); + if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0 || ptr == 0) error("Too little core for parse tree"); return(freturn(DELIM)); case 'p': case 'P': /* has overridden number of positions */ diff --git a/src/cmd/lex/sub1.c b/src/cmd/lex/sub1.c index cb393a46..3996d219 100644 --- a/src/cmd/lex/sub1.c +++ b/src/cmd/lex/sub1.c @@ -287,6 +287,7 @@ gch(void){ if(c == Beof) { eof = TRUE; Bterm(fin); + fin = 0; return(0); } if(c == '\n')yyline++; @@ -331,17 +332,35 @@ mn2(int a, int d, int c) } int -mn1(int a, int d) +mnp(int a, void *p) { name[tptr] = a; - left[tptr] = d; + left[tptr] = 0; parent[tptr] = 0; nullstr[tptr] = 0; + ptr[tptr] = p; switch(a){ case RCCL: case RNCCL: - if(strlen((char *)d) == 0) nullstr[tptr] = TRUE; + if(strlen(p) == 0) nullstr[tptr] = TRUE; break; + default: + error("bad switch mnp %d %P", a, p); + break; + } + if(tptr > treesize) + error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); + return(tptr++); +} + +int +mn1(int a, int d) +{ + name[tptr] = a; + left[tptr] = d; + parent[tptr] = 0; + nullstr[tptr] = 0; + switch(a){ case STAR: case QUEST: nullstr[tptr] = TRUE; @@ -421,7 +440,9 @@ dupl(int n) switch(i){ case RNULLS: return(mn0(i)); - case RCCL: case RNCCL: case FINAL: case S1FINAL: case S2FINAL: + case RCCL: case RNCCL: + return(mnp(i,ptr[n])); + case FINAL: case S1FINAL: case S2FINAL: return(mn1(i,left[n])); case STAR: case QUEST: case PLUS: case CARAT: return(mn1(i,dupl(left[n]))); @@ -441,6 +462,8 @@ dupl(int n) void allprint(int c) { + if(c < 0) + c += 256; /* signed char */ switch(c){ case 014: print("\\f"); @@ -531,11 +554,11 @@ treedump(void) break; case RCCL: print("ccl "); - strpt(left[t]); + allprint(ptr[t]); break; case RNCCL: print("nccl "); - strpt(left[t]); + allprint(ptr[t]); break; case DIV: print("/ %d %d",left[t],right[t]); diff --git a/src/cmd/lex/sub2.c b/src/cmd/lex/sub2.c index f9950a8d..bcd3fee5 100644 --- a/src/cmd/lex/sub2.c +++ b/src/cmd/lex/sub2.c @@ -22,7 +22,7 @@ cfoll(int v) else if(i == RCCL || i == RNCCL){ /* compress ccl list */ for(j=1; j pchar + pchlen) error("Too many packed character classes"); - left[v] = (int)p; + ptr[v] = p; name[v] = RCCL; /* RNCCL eliminated */ # ifdef DEBUG if(debug && *p){ @@ -238,7 +238,7 @@ cgoto(void) else switch(name[curpos]){ case RCCL: tryit = TRUE; - q = (uchar *)left[curpos]; + q = ptr[curpos]; while(*q){ for(j=1;j