|
|
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.