blob: 86d607ab19b88b70bc5e3e68ebaa272900cd5d1f [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}