tree.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "rc.h"
  2. #include "exec.h"
  3. #include "io.h"
  4. #include "fns.h"
  5. tree *treenodes;
  6. /*
  7. * create and clear a new tree node, and add it
  8. * to the node list.
  9. */
  10. tree*
  11. newtree(void)
  12. {
  13. tree *t = new(tree);
  14. t->iskw = 0;
  15. t->str = 0;
  16. t->child[0] = t->child[1] = t->child[2] = 0;
  17. t->next = treenodes;
  18. treenodes = t;
  19. return t;
  20. }
  21. void
  22. freenodes(void)
  23. {
  24. tree *t, *u;
  25. for(t = treenodes;t;t = u){
  26. u = t->next;
  27. if(t->str)
  28. efree(t->str);
  29. efree((char *)t);
  30. }
  31. treenodes = 0;
  32. }
  33. tree*
  34. tree1(int type, tree *c0)
  35. {
  36. return tree3(type, c0, (tree *)0, (tree *)0);
  37. }
  38. tree*
  39. tree2(int type, tree *c0, tree *c1)
  40. {
  41. return tree3(type, c0, c1, (tree *)0);
  42. }
  43. tree*
  44. tree3(int type, tree *c0, tree *c1, tree *c2)
  45. {
  46. tree *t;
  47. if(type==';'){
  48. if(c0==0)
  49. return c1;
  50. if(c1==0)
  51. return c0;
  52. }
  53. t = newtree();
  54. t->type = type;
  55. t->child[0] = c0;
  56. t->child[1] = c1;
  57. t->child[2] = c2;
  58. return t;
  59. }
  60. tree*
  61. mung1(tree *t, tree *c0)
  62. {
  63. t->child[0] = c0;
  64. return t;
  65. }
  66. tree*
  67. mung2(tree *t, tree *c0, tree *c1)
  68. {
  69. t->child[0] = c0;
  70. t->child[1] = c1;
  71. return t;
  72. }
  73. tree*
  74. mung3(tree *t, tree *c0, tree *c1, tree *c2)
  75. {
  76. t->child[0] = c0;
  77. t->child[1] = c1;
  78. t->child[2] = c2;
  79. return t;
  80. }
  81. tree*
  82. epimung(tree *comp, tree *epi)
  83. {
  84. tree *p;
  85. if(epi==0)
  86. return comp;
  87. for(p = epi;p->child[1];p = p->child[1]);
  88. p->child[1] = comp;
  89. return epi;
  90. }
  91. /*
  92. * Add a SIMPLE node at the root of t and percolate all the redirections
  93. * up to the root.
  94. */
  95. tree*
  96. simplemung(tree *t)
  97. {
  98. tree *u;
  99. struct io *s;
  100. t = tree1(SIMPLE, t);
  101. s = openstr();
  102. pfmt(s, "%t", t);
  103. t->str = strdup(s->strp);
  104. closeio(s);
  105. for(u = t->child[0];u->type==ARGLIST;u = u->child[0]){
  106. if(u->child[1]->type==DUP
  107. || u->child[1]->type==REDIR){
  108. u->child[1]->child[1] = t;
  109. t = u->child[1];
  110. u->child[1] = 0;
  111. }
  112. }
  113. return t;
  114. }
  115. tree*
  116. token(char *str, int type)
  117. {
  118. tree *t = newtree();
  119. t->type = type;
  120. t->str = strdup(str);
  121. return t;
  122. }
  123. void
  124. freetree(tree *p)
  125. {
  126. if(p==0)
  127. return;
  128. freetree(p->child[0]);
  129. freetree(p->child[1]);
  130. freetree(p->child[2]);
  131. if(p->str)
  132. efree(p->str);
  133. efree((char *)p);
  134. }