diff options
author | rsc <devnull@localhost> | 2006-04-20 20:24:00 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2006-04-20 20:24:00 +0000 |
commit | 0afb7989d3ffb6d95133d62939edb688246f5cc0 (patch) | |
tree | fb95b4bc9b31aade19e67d14abf286dde87f2712 /src/cmd/lex/sub1.c | |
parent | 4515de8f502e7784d7901ef42ca3e4cecae07a09 (diff) | |
download | plan9port-0afb7989d3ffb6d95133d62939edb688246f5cc0.tar.gz plan9port-0afb7989d3ffb6d95133d62939edb688246f5cc0.tar.bz2 plan9port-0afb7989d3ffb6d95133d62939edb688246f5cc0.zip |
64-bit safe (from plan9)
Diffstat (limited to 'src/cmd/lex/sub1.c')
-rw-r--r-- | src/cmd/lex/sub1.c | 35 |
1 files changed, 29 insertions, 6 deletions
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]); |