|
|
1.1 ! root 1: #include "common.h" ! 2: #include "code.h" ! 3: #include "sym.h" ! 4: #include "mem.h" ! 5: ! 6: struct _mem node_mem; ! 7: ! 8: void ! 9: TreeFree(root) ! 10: Node *root; ! 11: { ! 12: if(root==NULL) return; ! 13: TreeFree(root->children); ! 14: TreeFree(root->siblings); ! 15: free(root); ! 16: } ! 17: ! 18: void ! 19: TreePrint(tree, flag) ! 20: Node *tree; ! 21: int flag; ! 22: { ! 23: if(tree==NULL) ! 24: return; ! 25: printf("%s", (tree->sym)->name); ! 26: putchar('('); ! 27: TreePrint(tree->children, 0); ! 28: putchar(')'); ! 29: if(tree->siblings!=NULL) { ! 30: putchar(','); ! 31: TreePrint(tree->siblings, 0); ! 32: } ! 33: if(flag) putchar('\n'); ! 34: } ! 35: ! 36: Node * ! 37: rev (sl, nl, nlleaves) ! 38: Node *sl, *nl; ! 39: int *nlleaves; ! 40: { ! 41: Node *sl2; ! 42: if(sl==NULL) ! 43: return(nl); ! 44: sl2 = sl->siblings; ! 45: sl->siblings = nl; ! 46: *nlleaves += sl->nlleaves; ! 47: return (rev (sl2, sl, nlleaves)); ! 48: } ! 49: ! 50: Node * ! 51: TreeBuild (symp, children) ! 52: SymbolEntry *symp; ! 53: Node *children; ! 54: { ! 55: Node *np = (struct node *) mem_get(&node_mem); ! 56: np->sym = symp; ! 57: np->nlleaves = symp->attr==A_LABEL ? 1 : 0; ! 58: np->children = rev (children, NULL, &np->nlleaves); ! 59: return(np); ! 60: } ! 61: ! 62: TreeInit() ! 63: { ! 64: mem_init(&node_mem, sizeof(struct node)); ! 65: } ! 66: ! 67: cntnodes(np) ! 68: Node *np; ! 69: { ! 70: if(np==NULL) return(0); ! 71: else return(1+cntnodes(np->children)+cntnodes(np->siblings)); ! 72: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.