Blame


1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "io.h"
3 f08fdedc 2003-11-23 devnull #include "fns.h"
4 f08fdedc 2003-11-23 devnull char nl='\n'; /* change to semicolon for bourne-proofing */
5 f08fdedc 2003-11-23 devnull #define c0 t->child[0]
6 f08fdedc 2003-11-23 devnull #define c1 t->child[1]
7 f08fdedc 2003-11-23 devnull #define c2 t->child[2]
8 c8f53842 2007-03-26 devnull
9 c8f53842 2007-03-26 devnull void
10 c8f53842 2007-03-26 devnull pdeglob(io *f, char *s)
11 f08fdedc 2003-11-23 devnull {
12 f08fdedc 2003-11-23 devnull while(*s){
13 c8f53842 2007-03-26 devnull if(*s==GLOB)
14 c8f53842 2007-03-26 devnull s++;
15 f08fdedc 2003-11-23 devnull pchr(f, *s++);
16 f08fdedc 2003-11-23 devnull }
17 f08fdedc 2003-11-23 devnull }
18 c8f53842 2007-03-26 devnull
19 c8f53842 2007-03-26 devnull void
20 c8f53842 2007-03-26 devnull pcmd(io *f, tree *t)
21 f08fdedc 2003-11-23 devnull {
22 c8f53842 2007-03-26 devnull if(t==0)
23 c8f53842 2007-03-26 devnull return;
24 f08fdedc 2003-11-23 devnull switch(t->type){
25 c8f53842 2007-03-26 devnull default: pfmt(f, "bad %d %p %p %p", t->type, c0, c1, c2);
26 c8f53842 2007-03-26 devnull break;
27 c8f53842 2007-03-26 devnull case '$': pfmt(f, "$%t", c0);
28 c8f53842 2007-03-26 devnull break;
29 c8f53842 2007-03-26 devnull case '"': pfmt(f, "$\"%t", c0);
30 c8f53842 2007-03-26 devnull break;
31 c8f53842 2007-03-26 devnull case '&': pfmt(f, "%t&", c0);
32 c8f53842 2007-03-26 devnull break;
33 c8f53842 2007-03-26 devnull case '^': pfmt(f, "%t^%t", c0, c1);
34 c8f53842 2007-03-26 devnull break;
35 c8f53842 2007-03-26 devnull case '`': pfmt(f, "`%t", c0);
36 c8f53842 2007-03-26 devnull break;
37 c8f53842 2007-03-26 devnull case ANDAND: pfmt(f, "%t && %t", c0, c1);
38 c8f53842 2007-03-26 devnull break;
39 c8f53842 2007-03-26 devnull case BANG: pfmt(f, "! %t", c0);
40 c8f53842 2007-03-26 devnull break;
41 c8f53842 2007-03-26 devnull case BRACE: pfmt(f, "{%t}", c0);
42 c8f53842 2007-03-26 devnull break;
43 c8f53842 2007-03-26 devnull case COUNT: pfmt(f, "$#%t", c0);
44 c8f53842 2007-03-26 devnull break;
45 c8f53842 2007-03-26 devnull case FN: pfmt(f, "fn %t %t", c0, c1);
46 c8f53842 2007-03-26 devnull break;
47 c8f53842 2007-03-26 devnull case IF: pfmt(f, "if%t%t", c0, c1);
48 c8f53842 2007-03-26 devnull break;
49 c8f53842 2007-03-26 devnull case NOT: pfmt(f, "if not %t", c0);
50 c8f53842 2007-03-26 devnull break;
51 c8f53842 2007-03-26 devnull case OROR: pfmt(f, "%t || %t", c0, c1);
52 c8f53842 2007-03-26 devnull break;
53 f08fdedc 2003-11-23 devnull case PCMD:
54 c8f53842 2007-03-26 devnull case PAREN: pfmt(f, "(%t)", c0);
55 c8f53842 2007-03-26 devnull break;
56 c8f53842 2007-03-26 devnull case SUB: pfmt(f, "$%t(%t)", c0, c1);
57 c8f53842 2007-03-26 devnull break;
58 c8f53842 2007-03-26 devnull case SIMPLE: pfmt(f, "%t", c0);
59 c8f53842 2007-03-26 devnull break;
60 c8f53842 2007-03-26 devnull case SUBSHELL: pfmt(f, "@ %t", c0);
61 c8f53842 2007-03-26 devnull break;
62 c8f53842 2007-03-26 devnull case SWITCH: pfmt(f, "switch %t %t", c0, c1);
63 c8f53842 2007-03-26 devnull break;
64 c8f53842 2007-03-26 devnull case TWIDDLE: pfmt(f, "~ %t %t", c0, c1);
65 c8f53842 2007-03-26 devnull break;
66 c8f53842 2007-03-26 devnull case WHILE: pfmt(f, "while %t%t", c0, c1);
67 c8f53842 2007-03-26 devnull break;
68 f08fdedc 2003-11-23 devnull case ARGLIST:
69 f08fdedc 2003-11-23 devnull if(c0==0)
70 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c1);
71 f08fdedc 2003-11-23 devnull else if(c1==0)
72 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c0);
73 f08fdedc 2003-11-23 devnull else
74 f08fdedc 2003-11-23 devnull pfmt(f, "%t %t", c0, c1);
75 f08fdedc 2003-11-23 devnull break;
76 f08fdedc 2003-11-23 devnull case ';':
77 f08fdedc 2003-11-23 devnull if(c0){
78 c8f53842 2007-03-26 devnull if(c1)
79 c8f53842 2007-03-26 devnull pfmt(f, "%t%c%t", c0, nl, c1);
80 f08fdedc 2003-11-23 devnull else pfmt(f, "%t", c0);
81 f08fdedc 2003-11-23 devnull }
82 f08fdedc 2003-11-23 devnull else pfmt(f, "%t", c1);
83 f08fdedc 2003-11-23 devnull break;
84 f08fdedc 2003-11-23 devnull case WORDS:
85 c8f53842 2007-03-26 devnull if(c0)
86 c8f53842 2007-03-26 devnull pfmt(f, "%t ", c0);
87 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c1);
88 f08fdedc 2003-11-23 devnull break;
89 f08fdedc 2003-11-23 devnull case FOR:
90 f08fdedc 2003-11-23 devnull pfmt(f, "for(%t", c0);
91 c8f53842 2007-03-26 devnull if(c1)
92 c8f53842 2007-03-26 devnull pfmt(f, " in %t", c1);
93 f08fdedc 2003-11-23 devnull pfmt(f, ")%t", c2);
94 f08fdedc 2003-11-23 devnull break;
95 f08fdedc 2003-11-23 devnull case WORD:
96 c8f53842 2007-03-26 devnull if(t->quoted)
97 c8f53842 2007-03-26 devnull pfmt(f, "%Q", t->str);
98 f08fdedc 2003-11-23 devnull else pdeglob(f, t->str);
99 f08fdedc 2003-11-23 devnull break;
100 f08fdedc 2003-11-23 devnull case DUP:
101 f08fdedc 2003-11-23 devnull if(t->rtype==DUPFD)
102 f08fdedc 2003-11-23 devnull pfmt(f, ">[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
103 f08fdedc 2003-11-23 devnull else
104 f08fdedc 2003-11-23 devnull pfmt(f, ">[%d=]", t->fd0);
105 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c1);
106 f08fdedc 2003-11-23 devnull break;
107 f08fdedc 2003-11-23 devnull case PIPEFD:
108 f08fdedc 2003-11-23 devnull case REDIR:
109 f08fdedc 2003-11-23 devnull switch(t->rtype){
110 f08fdedc 2003-11-23 devnull case HERE:
111 f08fdedc 2003-11-23 devnull pchr(f, '<');
112 f08fdedc 2003-11-23 devnull case READ:
113 c8f53842 2007-03-26 devnull case RDWR:
114 f08fdedc 2003-11-23 devnull pchr(f, '<');
115 c8f53842 2007-03-26 devnull if(t->rtype==RDWR)
116 c8f53842 2007-03-26 devnull pchr(f, '>');
117 c8f53842 2007-03-26 devnull if(t->fd0!=0)
118 c8f53842 2007-03-26 devnull pfmt(f, "[%d]", t->fd0);
119 f08fdedc 2003-11-23 devnull break;
120 f08fdedc 2003-11-23 devnull case APPEND:
121 f08fdedc 2003-11-23 devnull pchr(f, '>');
122 f08fdedc 2003-11-23 devnull case WRITE:
123 f08fdedc 2003-11-23 devnull pchr(f, '>');
124 c8f53842 2007-03-26 devnull if(t->fd0!=1)
125 c8f53842 2007-03-26 devnull pfmt(f, "[%d]", t->fd0);
126 f08fdedc 2003-11-23 devnull break;
127 f08fdedc 2003-11-23 devnull }
128 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c0);
129 c8f53842 2007-03-26 devnull if(c1)
130 c8f53842 2007-03-26 devnull pfmt(f, " %t", c1);
131 f08fdedc 2003-11-23 devnull break;
132 f08fdedc 2003-11-23 devnull case '=':
133 f08fdedc 2003-11-23 devnull pfmt(f, "%t=%t", c0, c1);
134 c8f53842 2007-03-26 devnull if(c2)
135 c8f53842 2007-03-26 devnull pfmt(f, " %t", c2);
136 f08fdedc 2003-11-23 devnull break;
137 f08fdedc 2003-11-23 devnull case PIPE:
138 f08fdedc 2003-11-23 devnull pfmt(f, "%t|", c0);
139 f08fdedc 2003-11-23 devnull if(t->fd1==0){
140 c8f53842 2007-03-26 devnull if(t->fd0!=1)
141 c8f53842 2007-03-26 devnull pfmt(f, "[%d]", t->fd0);
142 f08fdedc 2003-11-23 devnull }
143 f08fdedc 2003-11-23 devnull else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
144 f08fdedc 2003-11-23 devnull pfmt(f, "%t", c1);
145 f08fdedc 2003-11-23 devnull break;
146 f08fdedc 2003-11-23 devnull }
147 f08fdedc 2003-11-23 devnull }
148 47d4646e 2020-05-05 rsc
149 47d4646e 2020-05-05 rsc void
150 47d4646e 2020-05-05 rsc pcmdu(io *f, tree *t) /* unambiguous */
151 47d4646e 2020-05-05 rsc {
152 47d4646e 2020-05-05 rsc if(t==0) {
153 47d4646e 2020-05-05 rsc pfmt(f, "<nil>");
154 47d4646e 2020-05-05 rsc return;
155 47d4646e 2020-05-05 rsc }
156 47d4646e 2020-05-05 rsc
157 47d4646e 2020-05-05 rsc switch(t->type){
158 47d4646e 2020-05-05 rsc default: pfmt(f, "(bad %d %p %p %p)", t->type, c0, c1, c2);
159 47d4646e 2020-05-05 rsc break;
160 47d4646e 2020-05-05 rsc case '$': pfmt(f, "($ %u)", c0);
161 47d4646e 2020-05-05 rsc break;
162 47d4646e 2020-05-05 rsc case '"': pfmt(f, "($\" %u)", c0);
163 47d4646e 2020-05-05 rsc break;
164 47d4646e 2020-05-05 rsc case '&': pfmt(f, "(& %u)", c0);
165 47d4646e 2020-05-05 rsc break;
166 47d4646e 2020-05-05 rsc case '^': pfmt(f, "(^ %u %u)", c0, c1);
167 47d4646e 2020-05-05 rsc break;
168 47d4646e 2020-05-05 rsc case '`': pfmt(f, "(` %u)", c0);
169 47d4646e 2020-05-05 rsc break;
170 47d4646e 2020-05-05 rsc case ANDAND: pfmt(f, "(&& %u %u)", c0, c1);
171 47d4646e 2020-05-05 rsc break;
172 47d4646e 2020-05-05 rsc case BANG: pfmt(f, "(! %u)", c0);
173 47d4646e 2020-05-05 rsc break;
174 47d4646e 2020-05-05 rsc case BRACE: pfmt(f, "(brace %u)", c0);
175 47d4646e 2020-05-05 rsc break;
176 47d4646e 2020-05-05 rsc case COUNT: pfmt(f, "($# %u)", c0);
177 47d4646e 2020-05-05 rsc break;
178 47d4646e 2020-05-05 rsc case FN: pfmt(f, "(fn %u %u)", c0, c1);
179 47d4646e 2020-05-05 rsc break;
180 47d4646e 2020-05-05 rsc case IF: pfmt(f, "(if %u %u)", c0, c1);
181 47d4646e 2020-05-05 rsc break;
182 47d4646e 2020-05-05 rsc case NOT: pfmt(f, "(if not %u)", c0);
183 47d4646e 2020-05-05 rsc break;
184 47d4646e 2020-05-05 rsc case OROR: pfmt(f, "(|| %u %u)", c0, c1);
185 47d4646e 2020-05-05 rsc break;
186 47d4646e 2020-05-05 rsc case PCMD:
187 47d4646e 2020-05-05 rsc case PAREN: pfmt(f, "(paren %u)", c0);
188 47d4646e 2020-05-05 rsc break;
189 47d4646e 2020-05-05 rsc case SUB: pfmt(f, "($sub %u %u)", c0, c1);
190 47d4646e 2020-05-05 rsc break;
191 47d4646e 2020-05-05 rsc case SIMPLE: pfmt(f, "(simple %u)", c0);
192 47d4646e 2020-05-05 rsc break;
193 47d4646e 2020-05-05 rsc case SUBSHELL: pfmt(f, "(@ %u)", c0);
194 47d4646e 2020-05-05 rsc break;
195 47d4646e 2020-05-05 rsc case SWITCH: pfmt(f, "(switch %u %u)", c0, c1);
196 47d4646e 2020-05-05 rsc break;
197 47d4646e 2020-05-05 rsc case TWIDDLE: pfmt(f, "(~ %u %u)", c0, c1);
198 47d4646e 2020-05-05 rsc break;
199 47d4646e 2020-05-05 rsc case WHILE: pfmt(f, "(while %u %u)", c0, c1);
200 47d4646e 2020-05-05 rsc break;
201 47d4646e 2020-05-05 rsc case ARGLIST:
202 47d4646e 2020-05-05 rsc pfmt(f, "(arglist %u %u)", c0, c1);
203 47d4646e 2020-05-05 rsc break;
204 47d4646e 2020-05-05 rsc case ';':
205 47d4646e 2020-05-05 rsc pfmt(f, "(; %u %u)", c0, c1);
206 47d4646e 2020-05-05 rsc break;
207 47d4646e 2020-05-05 rsc case WORDS:
208 47d4646e 2020-05-05 rsc pfmt(f, "(words %u %u)", c0, c1);
209 47d4646e 2020-05-05 rsc break;
210 47d4646e 2020-05-05 rsc case FOR:
211 47d4646e 2020-05-05 rsc pfmt(f, "(for %u %u %u)", c0, c1, c2);
212 47d4646e 2020-05-05 rsc break;
213 47d4646e 2020-05-05 rsc case WORD:
214 47d4646e 2020-05-05 rsc if(t->quoted)
215 47d4646e 2020-05-05 rsc pfmt(f, "%Q", t->str);
216 47d4646e 2020-05-05 rsc else pdeglob(f, t->str);
217 47d4646e 2020-05-05 rsc break;
218 47d4646e 2020-05-05 rsc case DUP:
219 47d4646e 2020-05-05 rsc if(t->rtype==DUPFD)
220 47d4646e 2020-05-05 rsc pfmt(f, "(>[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
221 47d4646e 2020-05-05 rsc else
222 47d4646e 2020-05-05 rsc pfmt(f, "(>[%d=]", t->fd0); /*)*/
223 47d4646e 2020-05-05 rsc pfmt(f, " %u)", c1);
224 47d4646e 2020-05-05 rsc break;
225 47d4646e 2020-05-05 rsc case PIPEFD:
226 47d4646e 2020-05-05 rsc case REDIR:
227 47d4646e 2020-05-05 rsc pfmt(f, "(");
228 47d4646e 2020-05-05 rsc switch(t->rtype){
229 47d4646e 2020-05-05 rsc case HERE:
230 47d4646e 2020-05-05 rsc pchr(f, '<');
231 47d4646e 2020-05-05 rsc case READ:
232 47d4646e 2020-05-05 rsc case RDWR:
233 47d4646e 2020-05-05 rsc pchr(f, '<');
234 47d4646e 2020-05-05 rsc if(t->rtype==RDWR)
235 47d4646e 2020-05-05 rsc pchr(f, '>');
236 47d4646e 2020-05-05 rsc if(t->fd0!=0)
237 47d4646e 2020-05-05 rsc pfmt(f, "[%d]", t->fd0);
238 47d4646e 2020-05-05 rsc break;
239 47d4646e 2020-05-05 rsc case APPEND:
240 47d4646e 2020-05-05 rsc pchr(f, '>');
241 47d4646e 2020-05-05 rsc case WRITE:
242 47d4646e 2020-05-05 rsc pchr(f, '>');
243 47d4646e 2020-05-05 rsc if(t->fd0!=1)
244 47d4646e 2020-05-05 rsc pfmt(f, "[%d]", t->fd0);
245 47d4646e 2020-05-05 rsc break;
246 47d4646e 2020-05-05 rsc }
247 3caf5c23 2020-05-05 rsc if(t->rtype == HERE)
248 3caf5c23 2020-05-05 rsc pfmt(f, "HERE %u)", c1);
249 3caf5c23 2020-05-05 rsc else
250 3caf5c23 2020-05-05 rsc pfmt(f, "%u %u)", c0, c1);
251 47d4646e 2020-05-05 rsc break;
252 47d4646e 2020-05-05 rsc case '=':
253 47d4646e 2020-05-05 rsc pfmt(f, "(%u=%u %u)", c0, c1, c2);
254 47d4646e 2020-05-05 rsc break;
255 47d4646e 2020-05-05 rsc case PIPE:
256 47d4646e 2020-05-05 rsc pfmt(f, "(|");
257 47d4646e 2020-05-05 rsc if(t->fd1==0){
258 47d4646e 2020-05-05 rsc if(t->fd0!=1)
259 47d4646e 2020-05-05 rsc pfmt(f, "[%d]", t->fd0);
260 47d4646e 2020-05-05 rsc }
261 47d4646e 2020-05-05 rsc else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
262 47d4646e 2020-05-05 rsc pfmt(f, " %u %u", c0, c1);
263 47d4646e 2020-05-05 rsc break;
264 47d4646e 2020-05-05 rsc }
265 47d4646e 2020-05-05 rsc }