xref: /plan9/sys/src/cmd/rc/pcmd.c (revision 4e3613ab15c331a9ada113286cc0f2a35bc0373d)
13e12c5d1SDavid du Colombier #include "rc.h"
23e12c5d1SDavid du Colombier #include "io.h"
33e12c5d1SDavid du Colombier #include "fns.h"
43e12c5d1SDavid du Colombier char nl='\n';		/* change to semicolon for bourne-proofing */
53e12c5d1SDavid du Colombier #define	c0	t->child[0]
63e12c5d1SDavid du Colombier #define	c1	t->child[1]
73e12c5d1SDavid du Colombier #define	c2	t->child[2]
8dc5a79c1SDavid du Colombier 
9dc5a79c1SDavid du Colombier void
pdeglob(io * f,char * s)10dc5a79c1SDavid du Colombier pdeglob(io *f, char *s)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	while(*s){
13dc5a79c1SDavid du Colombier 		if(*s==GLOB)
14dc5a79c1SDavid du Colombier 			s++;
153e12c5d1SDavid du Colombier 		pchr(f, *s++);
163e12c5d1SDavid du Colombier 	}
173e12c5d1SDavid du Colombier }
18dc5a79c1SDavid du Colombier 
19dc5a79c1SDavid du Colombier void
pcmd(io * f,tree * t)20dc5a79c1SDavid du Colombier pcmd(io *f, tree *t)
213e12c5d1SDavid du Colombier {
22dc5a79c1SDavid du Colombier 	if(t==0)
23dc5a79c1SDavid du Colombier 		return;
24*4e3613abSDavid du Colombier 	assert(f != nil);
253e12c5d1SDavid du Colombier 	switch(t->type){
26*4e3613abSDavid du Colombier 	default:	pfmt(f, "bad cmd %d %p %p %p", t->type, c0, c1, c2);
27dc5a79c1SDavid du Colombier 	break;
28dc5a79c1SDavid du Colombier 	case '$':	pfmt(f, "$%t", c0);
29dc5a79c1SDavid du Colombier 	break;
30dc5a79c1SDavid du Colombier 	case '"':	pfmt(f, "$\"%t", c0);
31dc5a79c1SDavid du Colombier 	break;
32dc5a79c1SDavid du Colombier 	case '&':	pfmt(f, "%t&", c0);
33dc5a79c1SDavid du Colombier 	break;
34dc5a79c1SDavid du Colombier 	case '^':	pfmt(f, "%t^%t", c0, c1);
35dc5a79c1SDavid du Colombier 	break;
36dc5a79c1SDavid du Colombier 	case '`':	pfmt(f, "`%t", c0);
37dc5a79c1SDavid du Colombier 	break;
38dc5a79c1SDavid du Colombier 	case ANDAND:	pfmt(f, "%t && %t", c0, c1);
39dc5a79c1SDavid du Colombier 	break;
40dc5a79c1SDavid du Colombier 	case BANG:	pfmt(f, "! %t", c0);
41dc5a79c1SDavid du Colombier 	break;
42dc5a79c1SDavid du Colombier 	case BRACE:	pfmt(f, "{%t}", c0);
43dc5a79c1SDavid du Colombier 	break;
44dc5a79c1SDavid du Colombier 	case COUNT:	pfmt(f, "$#%t", c0);
45dc5a79c1SDavid du Colombier 	break;
46dc5a79c1SDavid du Colombier 	case FN:	pfmt(f, "fn %t %t", c0, c1);
47dc5a79c1SDavid du Colombier 	break;
48dc5a79c1SDavid du Colombier 	case IF:	pfmt(f, "if%t%t", c0, c1);
49dc5a79c1SDavid du Colombier 	break;
50dc5a79c1SDavid du Colombier 	case NOT:	pfmt(f, "if not %t", c0);
51dc5a79c1SDavid du Colombier 	break;
52dc5a79c1SDavid du Colombier 	case OROR:	pfmt(f, "%t || %t", c0, c1);
53dc5a79c1SDavid du Colombier 	break;
543e12c5d1SDavid du Colombier 	case PCMD:
55dc5a79c1SDavid du Colombier 	case PAREN:	pfmt(f, "(%t)", c0);
56dc5a79c1SDavid du Colombier 	break;
57dc5a79c1SDavid du Colombier 	case SUB:	pfmt(f, "$%t(%t)", c0, c1);
58dc5a79c1SDavid du Colombier 	break;
59dc5a79c1SDavid du Colombier 	case SIMPLE:	pfmt(f, "%t", c0);
60dc5a79c1SDavid du Colombier 	break;
61dc5a79c1SDavid du Colombier 	case SUBSHELL:	pfmt(f, "@ %t", c0);
62dc5a79c1SDavid du Colombier 	break;
63dc5a79c1SDavid du Colombier 	case SWITCH:	pfmt(f, "switch %t %t", c0, c1);
64dc5a79c1SDavid du Colombier 	break;
65dc5a79c1SDavid du Colombier 	case TWIDDLE:	pfmt(f, "~ %t %t", c0, c1);
66dc5a79c1SDavid du Colombier 	break;
67dc5a79c1SDavid du Colombier 	case WHILE:	pfmt(f, "while %t%t", c0, c1);
68dc5a79c1SDavid du Colombier 	break;
697dd7cddfSDavid du Colombier 	case ARGLIST:
707dd7cddfSDavid du Colombier 		if(c0==0)
717dd7cddfSDavid du Colombier 			pfmt(f, "%t", c1);
727dd7cddfSDavid du Colombier 		else if(c1==0)
737dd7cddfSDavid du Colombier 			pfmt(f, "%t", c0);
747dd7cddfSDavid du Colombier 		else
757dd7cddfSDavid du Colombier 			pfmt(f, "%t %t", c0, c1);
767dd7cddfSDavid du Colombier 		break;
773e12c5d1SDavid du Colombier 	case ';':
783e12c5d1SDavid du Colombier 		if(c0){
79dc5a79c1SDavid du Colombier 			if(c1)
80dc5a79c1SDavid du Colombier 				pfmt(f, "%t%c%t", c0, nl, c1);
813e12c5d1SDavid du Colombier 			else pfmt(f, "%t", c0);
823e12c5d1SDavid du Colombier 		}
833e12c5d1SDavid du Colombier 		else pfmt(f, "%t", c1);
843e12c5d1SDavid du Colombier 		break;
853e12c5d1SDavid du Colombier 	case WORDS:
86dc5a79c1SDavid du Colombier 		if(c0)
87dc5a79c1SDavid du Colombier 			pfmt(f, "%t ", c0);
883e12c5d1SDavid du Colombier 		pfmt(f, "%t", c1);
893e12c5d1SDavid du Colombier 		break;
903e12c5d1SDavid du Colombier 	case FOR:
913e12c5d1SDavid du Colombier 		pfmt(f, "for(%t", c0);
92dc5a79c1SDavid du Colombier 		if(c1)
93dc5a79c1SDavid du Colombier 			pfmt(f, " in %t", c1);
943e12c5d1SDavid du Colombier 		pfmt(f, ")%t", c2);
953e12c5d1SDavid du Colombier 		break;
963e12c5d1SDavid du Colombier 	case WORD:
97dc5a79c1SDavid du Colombier 		if(t->quoted)
98dc5a79c1SDavid du Colombier 			pfmt(f, "%Q", t->str);
993e12c5d1SDavid du Colombier 		else pdeglob(f, t->str);
1003e12c5d1SDavid du Colombier 		break;
1013e12c5d1SDavid du Colombier 	case DUP:
1027dd7cddfSDavid du Colombier 		if(t->rtype==DUPFD)
1037dd7cddfSDavid du Colombier 			pfmt(f, ">[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
1047dd7cddfSDavid du Colombier 		else
1057dd7cddfSDavid du Colombier 			pfmt(f, ">[%d=]", t->fd0);
1067dd7cddfSDavid du Colombier 		pfmt(f, "%t", c1);
1073e12c5d1SDavid du Colombier 		break;
1083e12c5d1SDavid du Colombier 	case PIPEFD:
1093e12c5d1SDavid du Colombier 	case REDIR:
1103e12c5d1SDavid du Colombier 		switch(t->rtype){
1113e12c5d1SDavid du Colombier 		case HERE:
1123e12c5d1SDavid du Colombier 			pchr(f, '<');
1133e12c5d1SDavid du Colombier 		case READ:
114119a69faSDavid du Colombier 		case RDWR:
1153e12c5d1SDavid du Colombier 			pchr(f, '<');
116119a69faSDavid du Colombier 			if(t->rtype==RDWR)
117119a69faSDavid du Colombier 				pchr(f, '>');
118dc5a79c1SDavid du Colombier 			if(t->fd0!=0)
119dc5a79c1SDavid du Colombier 				pfmt(f, "[%d]", t->fd0);
1203e12c5d1SDavid du Colombier 			break;
1213e12c5d1SDavid du Colombier 		case APPEND:
1223e12c5d1SDavid du Colombier 			pchr(f, '>');
1233e12c5d1SDavid du Colombier 		case WRITE:
1243e12c5d1SDavid du Colombier 			pchr(f, '>');
125dc5a79c1SDavid du Colombier 			if(t->fd0!=1)
126dc5a79c1SDavid du Colombier 				pfmt(f, "[%d]", t->fd0);
1273e12c5d1SDavid du Colombier 			break;
1283e12c5d1SDavid du Colombier 		}
1293e12c5d1SDavid du Colombier 		pfmt(f, "%t", c0);
130dc5a79c1SDavid du Colombier 		if(c1)
131dc5a79c1SDavid du Colombier 			pfmt(f, " %t", c1);
1323e12c5d1SDavid du Colombier 		break;
1333e12c5d1SDavid du Colombier 	case '=':
1343e12c5d1SDavid du Colombier 		pfmt(f, "%t=%t", c0, c1);
135dc5a79c1SDavid du Colombier 		if(c2)
136dc5a79c1SDavid du Colombier 			pfmt(f, " %t", c2);
1373e12c5d1SDavid du Colombier 		break;
1383e12c5d1SDavid du Colombier 	case PIPE:
1393e12c5d1SDavid du Colombier 		pfmt(f, "%t|", c0);
1403e12c5d1SDavid du Colombier 		if(t->fd1==0){
141dc5a79c1SDavid du Colombier 			if(t->fd0!=1)
142dc5a79c1SDavid du Colombier 				pfmt(f, "[%d]", t->fd0);
1433e12c5d1SDavid du Colombier 		}
1443e12c5d1SDavid du Colombier 		else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
1453e12c5d1SDavid du Colombier 		pfmt(f, "%t", c1);
1463e12c5d1SDavid du Colombier 		break;
1473e12c5d1SDavid du Colombier 	}
1483e12c5d1SDavid du Colombier }
149