aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/io.c')
-rw-r--r--sys/cmd/rc/io.c120
1 files changed, 99 insertions, 21 deletions
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