plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

pcmd.c (5041B)


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