URI: 
       tpcmd.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tpcmd.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 }