|
|
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.