diff options
Diffstat (limited to 'src/cmd/rc/io.c')
-rw-r--r-- | src/cmd/rc/io.c | 66 |
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) |