ref: 3c8406c0b92af281c68ffcf7595fed2ac98a095a
dir: /tree.c/
#include <assert.h> #include <stdint.h> #include <stdio.h> #include "cc.h" #include "syntax.h" #include "symbol.h" struct node { unsigned char op; }; struct node_op2 { struct node base; struct node *left; struct node *right; }; struct nodesym { struct node base; struct symbol *sym; }; struct node * nodesym(struct symbol *sym) { register struct nodesym *np = xmalloc(sizeof(*np)); np->base.op = OSYM; np->sym = sym; return (struct node *) np; } struct node * node(unsigned char op, struct node *l, struct node *r) { register struct node_op2 *np = xmalloc(sizeof(*np)); np->base.op = op; np->left = l; np->right = r; return (struct node *) np; } bool walk(register struct node *np, bool (*fun)(struct node *)) { struct node_op2 *p; if (!np || np->op == OSYM) return 1; p = (struct node_op2 *) np; return (*fun)(np) && walk(p->left, fun) && walk(p->right, fun); }