tree.c 1.9 KB

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