V10/cmd/twig/trees.c
#include "common.h"
#include "code.h"
#include "sym.h"
#include "mem.h"
struct _mem node_mem;
void
TreeFree(root)
Node *root;
{
if(root==NULL) return;
TreeFree(root->children);
TreeFree(root->siblings);
free(root);
}
void
TreePrint(tree, flag)
Node *tree;
int flag;
{
if(tree==NULL)
return;
printf("%s", (tree->sym)->name);
putchar('(');
TreePrint(tree->children, 0);
putchar(')');
if(tree->siblings!=NULL) {
putchar(',');
TreePrint(tree->siblings, 0);
}
if(flag) putchar('\n');
}
Node *
rev (sl, nl, nlleaves)
Node *sl, *nl;
int *nlleaves;
{
Node *sl2;
if(sl==NULL)
return(nl);
sl2 = sl->siblings;
sl->siblings = nl;
*nlleaves += sl->nlleaves;
return (rev (sl2, sl, nlleaves));
}
Node *
TreeBuild (symp, children)
SymbolEntry *symp;
Node *children;
{
Node *np = (struct node *) mem_get(&node_mem);
np->sym = symp;
np->nlleaves = symp->attr==A_LABEL ? 1 : 0;
np->children = rev (children, NULL, &np->nlleaves);
return(np);
}
TreeInit()
{
mem_init(&node_mem, sizeof(struct node));
}
cntnodes(np)
Node *np;
{
if(np==NULL) return(0);
else return(1+cntnodes(np->children)+cntnodes(np->siblings));
}