blob: 264fd9e8a1f2f4ee53c212d265e11b81688eef8c [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Parse tree node implementation */
2
3#include "PROTO.h"
4#include "malloc.h"
5#include "node.h"
6
7node *
8newnode(type)
9 int type;
10{
11 node *n = NEW(node, 1);
12 if (n == NULL)
13 return NULL;
14 n->n_type = type;
15 n->n_str = NULL;
16 n->n_nchildren = 0;
17 n->n_child = NULL;
18 return n;
19}
20
21#define XXX 3 /* Node alignment factor to speed up realloc */
22#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
23
24node *
25addchild(n1, type, str)
26 register node *n1;
27 int type;
28 char *str;
29{
30 register int nch = n1->n_nchildren;
31 register int nch1 = nch+1;
32 register node *n;
33 if (XXXROUNDUP(nch) < nch1) {
34 n = n1->n_child;
35 nch1 = XXXROUNDUP(nch1);
36 RESIZE(n, node, nch1);
37 if (n == NULL)
38 return NULL;
39 n1->n_child = n;
40 }
41 n = &n1->n_child[n1->n_nchildren++];
42 n->n_type = type;
43 n->n_str = str;
44 n->n_nchildren = 0;
45 n->n_child = NULL;
46 return n;
47}
Guido van Rossum03a24cd1990-11-18 17:37:06 +000048
49static void
50freechildren(n)
51 node *n;
52{
53 int i;
54 for (i = NCH(n); --i >= 0; )
55 freechildren(CHILD(n, i));
56 if (n->n_child != NULL)
57 DEL(n->n_child);
58 if (STR(n) != NULL)
59 DEL(STR(n));
60}
61
62void
63freenode(n)
64 node *n;
65{
66 if (n != NULL) {
67 freechildren(n);
68 DEL(n);
69 }
70}