pcmd.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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
  9. pdeglob(io *f, char *s)
  10. {
  11. while(*s){
  12. if(*s==GLOB)
  13. s++;
  14. pchr(f, *s++);
  15. }
  16. }
  17. void
  18. pcmd(io *f, tree *t)
  19. {
  20. if(t==0)
  21. return;
  22. switch(t->type){
  23. default: pfmt(f, "bad %d %p %p %p", t->type, c0, c1, c2);
  24. break;
  25. case '$': pfmt(f, "$%t", c0);
  26. break;
  27. case '"': pfmt(f, "$\"%t", c0);
  28. break;
  29. case '&': pfmt(f, "%t&", c0);
  30. break;
  31. case '^': pfmt(f, "%t^%t", c0, c1);
  32. break;
  33. case '`': pfmt(f, "`%t", c0);
  34. break;
  35. case ANDAND: pfmt(f, "%t && %t", c0, c1);
  36. break;
  37. case BANG: pfmt(f, "! %t", c0);
  38. break;
  39. case BRACE: pfmt(f, "{%t}", c0);
  40. break;
  41. case COUNT: pfmt(f, "$#%t", c0);
  42. break;
  43. case FN: pfmt(f, "fn %t %t", c0, c1);
  44. break;
  45. case IF: pfmt(f, "if%t%t", c0, c1);
  46. break;
  47. case NOT: pfmt(f, "if not %t", c0);
  48. break;
  49. case OROR: pfmt(f, "%t || %t", c0, c1);
  50. break;
  51. case PCMD:
  52. case PAREN: pfmt(f, "(%t)", c0);
  53. break;
  54. case SUB: pfmt(f, "$%t(%t)", c0, c1);
  55. break;
  56. case SIMPLE: pfmt(f, "%t", c0);
  57. break;
  58. case SUBSHELL: pfmt(f, "@ %t", c0);
  59. break;
  60. case SWITCH: pfmt(f, "switch %t %t", c0, c1);
  61. break;
  62. case TWIDDLE: pfmt(f, "~ %t %t", c0, c1);
  63. break;
  64. case WHILE: pfmt(f, "while %t%t", c0, c1);
  65. break;
  66. case ARGLIST:
  67. if(c0==0)
  68. pfmt(f, "%t", c1);
  69. else if(c1==0)
  70. pfmt(f, "%t", c0);
  71. else
  72. pfmt(f, "%t %t", c0, c1);
  73. break;
  74. case ';':
  75. if(c0){
  76. if(c1)
  77. pfmt(f, "%t%c%t", c0, nl, c1);
  78. else pfmt(f, "%t", c0);
  79. }
  80. else pfmt(f, "%t", c1);
  81. break;
  82. case WORDS:
  83. if(c0)
  84. pfmt(f, "%t ", c0);
  85. pfmt(f, "%t", c1);
  86. break;
  87. case FOR:
  88. pfmt(f, "for(%t", c0);
  89. if(c1)
  90. pfmt(f, " in %t", c1);
  91. pfmt(f, ")%t", c2);
  92. break;
  93. case WORD:
  94. if(t->quoted)
  95. pfmt(f, "%Q", t->str);
  96. else pdeglob(f, t->str);
  97. break;
  98. case DUP:
  99. if(t->rtype==DUPFD)
  100. pfmt(f, ">[%d=%d]", t->fd1, t->fd0); /* yes, fd1, then fd0; read lex.c */
  101. else
  102. pfmt(f, ">[%d=]", t->fd0);
  103. pfmt(f, "%t", c1);
  104. break;
  105. case PIPEFD:
  106. case REDIR:
  107. switch(t->rtype){
  108. case HERE:
  109. pchr(f, '<');
  110. case READ:
  111. case RDWR:
  112. pchr(f, '<');
  113. if(t->rtype==RDWR)
  114. pchr(f, '>');
  115. if(t->fd0!=0)
  116. pfmt(f, "[%d]", t->fd0);
  117. break;
  118. case APPEND:
  119. pchr(f, '>');
  120. case WRITE:
  121. pchr(f, '>');
  122. if(t->fd0!=1)
  123. pfmt(f, "[%d]", t->fd0);
  124. break;
  125. }
  126. pfmt(f, "%t", c0);
  127. if(c1)
  128. pfmt(f, " %t", c1);
  129. break;
  130. case '=':
  131. pfmt(f, "%t=%t", c0, c1);
  132. if(c2)
  133. pfmt(f, " %t", c2);
  134. break;
  135. case PIPE:
  136. pfmt(f, "%t|", c0);
  137. if(t->fd1==0){
  138. if(t->fd0!=1)
  139. pfmt(f, "[%d]", t->fd0);
  140. }
  141. else pfmt(f, "[%d=%d]", t->fd0, t->fd1);
  142. pfmt(f, "%t", c1);
  143. break;
  144. }
  145. }