Updated for 2.1b2 distribution.
[python/dscho.git] / Parser / node.c
blobb1036a3319dee88de25903466bab1aba285d454e
1 /* Parse tree node implementation */
3 #include "Python.h"
4 #include "node.h"
5 #include "errcode.h"
7 node *
8 PyNode_New(int type)
10 node *n = PyMem_NEW(node, 1);
11 if (n == NULL)
12 return NULL;
13 n->n_type = type;
14 n->n_str = NULL;
15 n->n_lineno = 0;
16 n->n_nchildren = 0;
17 n->n_child = NULL;
18 return n;
21 #define XXX 3 /* Node alignment factor to speed up realloc */
22 #define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
24 int
25 PyNode_AddChild(register node *n1, int type, char *str, int lineno)
27 register int nch = n1->n_nchildren;
28 register int nch1 = nch+1;
29 register node *n;
30 if (nch == INT_MAX || nch < 0)
31 return E_OVERFLOW;
32 if (XXXROUNDUP(nch) < nch1) {
33 n = n1->n_child;
34 nch1 = XXXROUNDUP(nch1);
35 PyMem_RESIZE(n, node, nch1);
36 if (n == NULL)
37 return E_NOMEM;
38 n1->n_child = n;
40 n = &n1->n_child[n1->n_nchildren++];
41 n->n_type = type;
42 n->n_str = str;
43 n->n_lineno = lineno;
44 n->n_nchildren = 0;
45 n->n_child = NULL;
46 return 0;
49 /* Forward */
50 static void freechildren(node *);
53 void
54 PyNode_Free(node *n)
56 if (n != NULL) {
57 freechildren(n);
58 PyMem_DEL(n);
62 static void
63 freechildren(node *n)
65 int i;
66 for (i = NCH(n); --i >= 0; )
67 freechildren(CHILD(n, i));
68 if (n->n_child != NULL)
69 PyMem_DEL(n->n_child);
70 if (STR(n) != NULL)
71 PyMem_DEL(STR(n));