aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/pcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rc/pcmd.c')
-rw-r--r--src/cmd/rc/pcmd.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/cmd/rc/pcmd.c b/src/cmd/rc/pcmd.c
index 8caf60a2..26bd883b 100644
--- a/src/cmd/rc/pcmd.c
+++ b/src/cmd/rc/pcmd.c
@@ -145,3 +145,118 @@ pcmd(io *f, tree *t)
break;
}
}
+
+void
+pcmdu(io *f, tree *t) /* unambiguous */
+{
+ if(t==0) {
+ pfmt(f, "<nil>");
+ return;
+ }
+
+ switch(t->type){
+ default: pfmt(f, "(bad %d %p %p %p)", t->type, c0, c1, c2);
+ break;
+ case '$': pfmt(f, "($ %u)", c0);
+ break;
+ case '"': pfmt(f, "($\" %u)", c0);
+ break;
+ case '&': pfmt(f, "(& %u)", c0);
+ break;
+ case '^': pfmt(f, "(^ %u %u)", c0, c1);
+ break;
+ case '`': pfmt(f, "(` %u)", c0);
+ break;
+ case ANDAND: pfmt(f, "(&& %u %u)", c0, c1);
+ break;
+ case BANG: pfmt(f, "(! %u)", c0);
+ break;
+ case BRACE: pfmt(f, "(brace %u)", c0);
+ break;
+ case COUNT: pfmt(f, "($# %u)", c0);
+ break;
+ case FN: pfmt(f, "(fn %u %u)", c0, c1);
+ break;
+ case IF: pfmt(f, "(if %u %u)", c0, c1);
+ break;
+ case NOT: pfmt(f, "(if not %u)", c0);
+ break;
+ case OROR: pfmt(f, "(|| %u %u)", c0, c1);
+ break;
+ case PCMD:
+ case PAREN: pfmt(f, "(paren %u)", c0);
+ break;
+ case SUB: pfmt(f, "($sub %u %u)", c0, c1);
+ break;
+ case SIMPLE: pfmt(f, "(simple %u)", c0);
+ break;
+ case SUBSHELL: pfmt(f, "(@ %u)", c0);
+ break;
+ case SWITCH: pfmt(f, "(switch %u %u)", c0, c1);
+ break;
+ case TWIDDLE: pfmt(f, "(~ %u %u)", c0, c1);
+ break;
+ case WHILE: pfmt(f, "(while %u %u)", c0, c1);
+ break;
+ case ARGLIST:
+ pfmt(f, "(arglist %u %u)", c0, c1);
+ break;
+ case ';':
+ pfmt(f, "(; %u %u)", c0, c1);
+ break;
+ case WORDS:
+ pfmt(f, "(words %u %u)", c0, c1);
+ break;
+ case FOR:
+ pfmt(f, "(for %u %u %u)", c0, c1, c2);
+ break;
+ case WORD:
+ if(t->quoted)
+ pfmt(f, "%Q", t->str);
+ else pdeglob(f, t->str);
+ break;
+ case DUP:
+ if(t->rtype==DUPFD)
+ pfmt(f, "(>[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
+ else
+ pfmt(f, "(>[%d=]", t->fd0); /*)*/
+ pfmt(f, " %u)", c1);
+ break;
+ case PIPEFD:
+ case REDIR:
+ pfmt(f, "(");
+ switch(t->rtype){
+ case HERE:
+ pchr(f, '<');
+ case READ:
+ case RDWR:
+ pchr(f, '<');
+ if(t->rtype==RDWR)
+ pchr(f, '>');
+ if(t->fd0!=0)
+ pfmt(f, "[%d]", t->fd0);
+ break;
+ case APPEND:
+ pchr(f, '>');
+ case WRITE:
+ pchr(f, '>');
+ if(t->fd0!=1)
+ pfmt(f, "[%d]", t->fd0);
+ break;
+ }
+ pfmt(f, "%u %u)", c0, c1);
+ break;
+ case '=':
+ pfmt(f, "(%u=%u %u)", c0, c1, c2);
+ break;
+ case PIPE:
+ pfmt(f, "(|");
+ if(t->fd1==0){
+ if(t->fd0!=1)
+ pfmt(f, "[%d]", t->fd0);
+ }
+ else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
+ pfmt(f, " %u %u", c0, c1);
+ break;
+ }
+}