aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rc/io.c')
-rw-r--r--src/cmd/rc/io.c66
1 files changed, 46 insertions, 20 deletions
diff --git a/src/cmd/rc/io.c b/src/cmd/rc/io.c
index dc81c2e..5152627 100644
--- a/src/cmd/rc/io.c
+++ b/src/cmd/rc/io.c
@@ -74,8 +74,7 @@ terminate(Io *io)
efree((char *)io);
}
-static
-int
+static int
refill(Io *io)
{
int n;
@@ -224,28 +223,55 @@ static
void
printtree(Io *io, Tree *t)
{
+ Tree *c, *nc;
if(!t)
return;
switch(t->type){
- default: print(io, "bad(%d)[%p %p %p]", t->type, C0, C1, C2); break;
- case '$': print(io,"$%t",C0); break;
- case '&': print(io,"%t&",C0); break;
- case '^': print(io,"%t^%t",C0,C1); break;
- case '`': print(io,"`%t",C0); break;
-
- case Tbasic: print(io, "%t", C0); break;
- case Tbang: print(io, "!%t", C0); break;
- case Tblock: print(io, "{%t}", C0); break;
- case Tcount: print(io, "$#%t", C0); break;
- case Tparen: print(io, "(%t)", C0); break;
- case Tjoin: print(io,"$\"%t",C0); break;
- case Tindex: print(io, "%t(%t)",C0); break;
- case Tsubshell: print(io, "@ %t",C0); break;
- //case Ttwiddle: print(io, "~ %t %t", C0, C1); break;
-
- case Toror:
- case Tandand:
+ default:
+ print(io, "bad(%d)[%p %p %p]", t->type, C0, C1, C2);
+ break;
+
+ case '$': print(io,"$%t",C0); break;
+ case '&': print(io,"%t&",C0); break;
+ case '^': print(io,"%t^%t",C0,C1); break;
+ case '`': print(io,"`%t",C0); break;
+ case Tbasic: print(io, "%t", C0); break;
+ case Tbang: print(io, "!%t", C0); break;
+ case Tblock: print(io, "{%t}", C0); break;
+ case Tcount: print(io, "$#%t", C0); break;
+ case Tparen: print(io, "(%t)", C0); break;
+ case Tjoin: print(io,"$\"%t",C0); break;
+ case Tindex: print(io, "%t(%t)",C0); break;
+ case Tsubshell: print(io, "@ %t",C0); break;
+ case Ttwiddle: print(io, "~ %t %t", C0, C1); break;
+ case Toror: print(io, "%t || %t", C0, C1); break;
+ case Tandand: print(io, "%t && %t", C0, C1); break;
+ case Twhile: print(io, "while %t%t", C0, C1); break;
+ case Tcase: print(io, "case %t;%t",C0, C1); break;
+ case Tfunc: print(io, "func %t %t",C0, C1); break;
+ case Tswitch:
+ print(io, "switch %t {", C0);
+ c = C1;
+ cases:
+ if(c->type == ';'){
+ nc = c->child[1], c = c->child[0];
+ print(io,"%t",c);
+ c = nc;
+ assert(c);
+ goto cases;
+ }else{
+ print(io,"%t",c);
+ }
+ print(io, "}");
+ break;
+
+ case Tfor:
+ print(io, "for(%t", C0);
+ if(C1)
+ print(io, "in %t", C1);
+ print(io, ")%t", C2);
+ break;
case Targs:
if(!C0)