From 5c20d687c495f2cb3f3a390d04854dcceb2ef74e Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 21 Oct 2021 11:17:15 -0700 Subject: feat(rc): expanded tree printing --- sys/cmd/rc/io.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 99 insertions(+), 21 deletions(-) (limited to 'sys/cmd/rc/io.c') diff --git a/sys/cmd/rc/io.c b/sys/cmd/rc/io.c index 7f2d869..f033031 100644 --- a/sys/cmd/rc/io.c +++ b/sys/cmd/rc/io.c @@ -216,6 +216,10 @@ printval(Io *io, Word *a) } } +#define C0 t->child[0] +#define C1 t->child[1] +#define C2 t->child[2] + static void printtree(Io *io, Tree *t) @@ -224,42 +228,116 @@ printtree(Io *io, Tree *t) return; switch(t->type){ - case Tword: - print(io,"{%s}",t->str); - break; - - case Tbasic: - print(io, ">%t", t->child[0]); - break; + 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&",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 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: case Targs: - if(!t->child[0]) - print(io, "%t", t->child[1]); - else if(!t->child[1]) - print(io, "%t", t->child[0]); + if(!C0) + print(io, "%t", C1); + else if(!C1) + print(io, "%t", C0); else - print(io, "[%t %t]", t->child[0], t->child[1]); + print(io, "%t %t", C0, C1); break; case ';': - if(t->child[0]){ - if(t->child[1]) - print(io, ";[%t %t]", t->child[0], t->child[1]); + if(C0){ + if(C1) + print(io, "%t;%t", C0, C1); else - print(io, "%t", t->child[0]); + print(io, "%t", C0); }else - print(io, "%t", t->child[1]); + print(io, "%t", C1); break; - case '&': - print(io, "&(%t)", t->child[0]); + case Twords: + if(C0) + print(io, "%t", C0); + print(io, "%t", C1); + + case Tword: + if(t->quoted) + print(io, "%Q", t->str); + print(io, "%q", t->str); + break; + + case '=': + print(io, "%t=%t", C0, C1); + if(C2) + print(io, " %t", C2); break; - default: - print(io, "bad(%d)[%p %p %p]", t->type, t->child[0], t->child[1], t->child[2]); + case Tdup: + if(t->redir.type == Rdupfd) + print(io, ">[%d=%d]", t->redir.fd[1], t->redir.fd[0]); + else + print(io, ">[%d=]", t->redir.fd[0]); + print(io, "%t", C1); + break; + + case Tredir: + switch(t->redir.type){ + case Rhere: + printchar(io, '<'); + case Rread: + printchar(io, '<'); + goto readfd; + case Rrdwr: + printchar(io, '<'); + printchar(io, '>'); + readfd: + if(t->redir.fd[0]!=0) + print(io, "[%d]", t->redir.fd[0]); + break; + case Rappend: + printchar(io, '>'); + goto writefd; + case Rwrite: + printchar(io, '>'); + printchar(io, '>'); + writefd: + if(t->redir.fd[0]!=1) + print(io, "[%d]", t->redir.fd[0]); + break; + } + print(io, "%t", C0); + if(C1) + print(io, " %t", C1); + break; + + case Tpipe: + print(io, "%t|", C0); + if(t->redir.fd[1]==0){ + if(t->redir.fd[0]!=1) + print(io, "[%d]", t->redir.fd[0]); + } + else + print(io, "[%d=%d]", t->redir.fd[0], t->redir.fd[1]); + print(io, "%t", C1); + break; } } +#undef C0 +#undef C1 +#undef C2 + // ----------------------------------------------------------------------- // exports -- cgit v1.2.1