aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/lex/sub1.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-04-20 20:24:00 +0000
committerrsc <devnull@localhost>2006-04-20 20:24:00 +0000
commit0afb7989d3ffb6d95133d62939edb688246f5cc0 (patch)
treefb95b4bc9b31aade19e67d14abf286dde87f2712 /src/cmd/lex/sub1.c
parent4515de8f502e7784d7901ef42ca3e4cecae07a09 (diff)
downloadplan9port-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.c35
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]);