4 char nl='\n'; /* change to semicolon for bourne-proofing */
8 void pdeglob(io *f, char *s)
15 void pcmd(io *f, tree *t)
19 default: pfmt(f, "bad %d %p %p %p", t->type, c0, c1, c2); break;
20 case '$': pfmt(f, "$%t", c0); break;
21 case '"': pfmt(f, "$\"%t", c0); break;
22 case '&': pfmt(f, "%t&", c0); break;
23 case '^': pfmt(f, "%t^%t", c0, c1); break;
24 case '`': pfmt(f, "`%t", c0); break;
25 case ANDAND: pfmt(f, "%t && %t", c0, c1); break;
26 case BANG: pfmt(f, "! %t", c0); break;
27 case BRACE: pfmt(f, "{%t}", c0); break;
28 case COUNT: pfmt(f, "$#%t", c0); break;
29 case FN: pfmt(f, "fn %t %t", c0, c1); break;
30 case IF: pfmt(f, "if%t%t", c0, c1); break;
31 case NOT: pfmt(f, "if not %t", c0); break;
32 case OROR: pfmt(f, "%t || %t", c0, c1); break;
34 case PAREN: pfmt(f, "(%t)", c0); break;
35 case SUB: pfmt(f, "$%t(%t)", c0, c1); break;
36 case SIMPLE: pfmt(f, "%t", c0); break;
37 case SUBSHELL: pfmt(f, "@ %t", c0); break;
38 case SWITCH: pfmt(f, "switch %t %t", c0, c1); break;
39 case TWIDDLE: pfmt(f, "~ %t %t", c0, c1); break;
40 case WHILE: pfmt(f, "while %t%t", c0, c1); break;
47 pfmt(f, "%t %t", c0, c1);
51 if(c1) pfmt(f, "%t%c%t", c0, nl, c1);
52 else pfmt(f, "%t", c0);
54 else pfmt(f, "%t", c1);
57 if(c0) pfmt(f, "%t ", c0);
61 pfmt(f, "for(%t", c0);
62 if(c1) pfmt(f, " in %t", c1);
66 if(t->quoted) pfmt(f, "%Q", t->str);
67 else pdeglob(f, t->str);
71 pfmt(f, ">[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
73 pfmt(f, ">[%d=]", t->fd0);
83 if(t->fd0!=0) pfmt(f, "[%d]", t->fd0);
89 if(t->fd0!=1) pfmt(f, "[%d]", t->fd0);
93 if(c1) pfmt(f, " %t", c1);
96 pfmt(f, "%t=%t", c0, c1);
97 if(c2) pfmt(f, " %t", c2);
102 if(t->fd0!=1) pfmt(f, "[%d]", t->fd0);
104 else pfmt(f, "[%d=%d]", t->fd0, t->fd1);