blob: 3a710ef248e0b9a8110c16fd70d333716ac89d1e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Jeremy Hylton94988062000-06-20 19:10:44 +000011#include <limits.h>
12
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013/* Parse tree node implementation */
14
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016#include "node.h"
Jeremy Hylton94988062000-06-20 19:10:44 +000017#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
19node *
Guido van Rossum86bea461997-04-29 21:03:06 +000020PyNode_New(type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021 int type;
22{
Guido van Rossum86bea461997-04-29 21:03:06 +000023 node *n = PyMem_NEW(node, 1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024 if (n == NULL)
25 return NULL;
26 n->n_type = type;
27 n->n_str = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000028 n->n_lineno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029 n->n_nchildren = 0;
30 n->n_child = NULL;
31 return n;
32}
33
34#define XXX 3 /* Node alignment factor to speed up realloc */
35#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
36
Jeremy Hylton94988062000-06-20 19:10:44 +000037int
Guido van Rossum86bea461997-04-29 21:03:06 +000038PyNode_AddChild(n1, type, str, lineno)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039 register node *n1;
40 int type;
41 char *str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000042 int lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043{
44 register int nch = n1->n_nchildren;
45 register int nch1 = nch+1;
46 register node *n;
Jeremy Hylton94988062000-06-20 19:10:44 +000047 if (nch == SHRT_MAX || nch < 0)
48 return E_OVERFLOW;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049 if (XXXROUNDUP(nch) < nch1) {
50 n = n1->n_child;
51 nch1 = XXXROUNDUP(nch1);
Guido van Rossum86bea461997-04-29 21:03:06 +000052 PyMem_RESIZE(n, node, nch1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 if (n == NULL)
Jeremy Hylton94988062000-06-20 19:10:44 +000054 return E_NOMEM;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 n1->n_child = n;
56 }
57 n = &n1->n_child[n1->n_nchildren++];
58 n->n_type = type;
59 n->n_str = str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000060 n->n_lineno = lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 n->n_nchildren = 0;
62 n->n_child = NULL;
Jeremy Hylton94988062000-06-20 19:10:44 +000063 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064}
Guido van Rossum03a24cd1990-11-18 17:37:06 +000065
Guido van Rossum3f5da241990-12-20 15:06:42 +000066/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static void freechildren(node *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000068
69
70void
Guido van Rossum86bea461997-04-29 21:03:06 +000071PyNode_Free(n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 node *n;
73{
74 if (n != NULL) {
75 freechildren(n);
Guido van Rossum86bea461997-04-29 21:03:06 +000076 PyMem_DEL(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 }
78}
79
Guido van Rossum03a24cd1990-11-18 17:37:06 +000080static void
81freechildren(n)
82 node *n;
83{
84 int i;
85 for (i = NCH(n); --i >= 0; )
86 freechildren(CHILD(n, i));
87 if (n->n_child != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000088 PyMem_DEL(n->n_child);
Guido van Rossum03a24cd1990-11-18 17:37:06 +000089 if (STR(n) != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000090 PyMem_DEL(STR(n));
Guido van Rossum03a24cd1990-11-18 17:37:06 +000091}