blob: 024dbd4668f70c43fb1fd17b664460310e5b95a9 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Parse tree node implementation */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004#include "node.h"
5
6node *
Guido van Rossum3f5da241990-12-20 15:06:42 +00007newtree(type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008 int type;
9{
10 node *n = NEW(node, 1);
11 if (n == NULL)
12 return NULL;
13 n->n_type = type;
14 n->n_str = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000015 n->n_lineno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016 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 *
Guido van Rossum3f5da241990-12-20 15:06:42 +000025addchild(n1, type, str, lineno)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026 register node *n1;
27 int type;
28 char *str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000029 int lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030{
31 register int nch = n1->n_nchildren;
32 register int nch1 = nch+1;
33 register node *n;
34 if (XXXROUNDUP(nch) < nch1) {
35 n = n1->n_child;
36 nch1 = XXXROUNDUP(nch1);
37 RESIZE(n, node, nch1);
38 if (n == NULL)
39 return NULL;
40 n1->n_child = n;
41 }
42 n = &n1->n_child[n1->n_nchildren++];
43 n->n_type = type;
44 n->n_str = str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000045 n->n_lineno = lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 n->n_nchildren = 0;
47 n->n_child = NULL;
48 return n;
49}
Guido van Rossum03a24cd1990-11-18 17:37:06 +000050
Guido van Rossum3f5da241990-12-20 15:06:42 +000051/* Forward */
52static void freechildren PROTO((node *));
53
54
55void
56freetree(n)
57 node *n;
58{
59 if (n != NULL) {
60 freechildren(n);
61 DEL(n);
62 }
63}
64
Guido van Rossum03a24cd1990-11-18 17:37:06 +000065static void
66freechildren(n)
67 node *n;
68{
69 int i;
70 for (i = NCH(n); --i >= 0; )
71 freechildren(CHILD(n, i));
72 if (n->n_child != NULL)
73 DEL(n->n_child);
74 if (STR(n) != NULL)
75 DEL(STR(n));
76}