|
|
1.1 root 1: #include "rc.h"
2: #include "io.h"
3: #include "fns.h"
4: char nl='\n'; /* change to semicolon for bourne-proofing */
5: #define c0 t->child[0]
6: #define c1 t->child[1]
7: #define c2 t->child[2]
8: void pdeglob(io *f, char *s)
9: {
10: while(*s){
11: if(*s==GLOB) s++;
12: pchr(f, *s++);
13: }
14: }
15: void pcmd(io *f, tree *t)
16: {
17: if(t==0) return;
18: switch(t->type){
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 ARGLIST: pfmt(f, "%t %t", c0, c1); break;
27: case BANG: pfmt(f, "! %t", c0); break;
28: case BRACE: pfmt(f, "{%t}", c0); break;
29: case COUNT: pfmt(f, "$#%t", c0); break;
30: case FN: pfmt(f, "fn %t %t", c0, c1); break;
31: case IF: pfmt(f, "if%t%t", c0, c1); break;
32: case NOT: pfmt(f, "if not %t", c0); break;
33: case OROR: pfmt(f, "%t || %t", c0, c1); break;
34: case PCMD:
35: case PAREN: pfmt(f, "(%t)", c0); break;
36: case SUB: pfmt(f, "$%t(%t)", c0, c1); break;
37: case SIMPLE: pfmt(f, "%t", c0); break;
38: case SUBSHELL: pfmt(f, "@ %t", c0); break;
39: case SWITCH: pfmt(f, "switch %t %t", c0, c1); break;
40: case TWIDDLE: pfmt(f, "~ %t %t", c0, c1); break;
41: case WHILE: pfmt(f, "while %t%t", c0, c1); break;
42: case ';':
43: if(c0){
44: if(c1) pfmt(f, "%t%c%t", c0, nl, c1);
45: else pfmt(f, "%t", c0);
46: }
47: else pfmt(f, "%t", c1);
48: break;
49: case WORDS:
50: if(c0) pfmt(f, "%t ", c0);
51: pfmt(f, "%t", c1);
52: break;
53: case FOR:
54: pfmt(f, "for(%t", c0);
55: if(c1) pfmt(f, " in %t", c1);
56: pfmt(f, ")%t", c2);
57: break;
58: case WORD:
59: if(t->quoted) pfmt(f, "%Q", t->str);
60: else pdeglob(f, t->str);
61: break;
62: case DUP:
63: pfmt(f, ">[%d=", t->fd0);
64: if(t->rtype==DUPFD) pfmt(f, "%d", t->fd1);
65: pchr(f, ']');
66: break;
67: case PIPEFD:
68: case REDIR:
69: switch(t->rtype){
70: case HERE:
71: pchr(f, '<');
72: case READ:
73: pchr(f, '<');
74: if(t->fd0!=0) pfmt(f, "[%d]", t->fd0);
75: break;
76: case APPEND:
77: pchr(f, '>');
78: case WRITE:
79: pchr(f, '>');
80: if(t->fd0!=1) pfmt(f, "[%d]", t->fd0);
81: break;
82: }
83: pfmt(f, "%t", c0);
84: if(c1) pfmt(f, " %t", c1);
85: break;
86: case '=':
87: pfmt(f, "%t=%t", c0, c1);
88: if(c2) pfmt(f, " %t", c2);
89: break;
90: case PIPE:
91: pfmt(f, "%t|", c0);
92: if(t->fd1==0){
93: if(t->fd0!=1) pfmt(f, "[%d]", t->fd0);
94: }
95: else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
96: pfmt(f, "%t", c1);
97: break;
98: }
99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.