blob: 158b9e23419e24b8a9fddfdca1130a32db879772 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumb9f8d6e1995-01-04 19:08:09 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Jeremy Hylton94988062000-06-20 19:10:44 +000017#include <limits.h>
18
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019/* Parse tree node implementation */
20
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022#include "node.h"
Jeremy Hylton94988062000-06-20 19:10:44 +000023#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024
25node *
Guido van Rossum86bea461997-04-29 21:03:06 +000026PyNode_New(type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027 int type;
28{
Guido van Rossum86bea461997-04-29 21:03:06 +000029 node *n = PyMem_NEW(node, 1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 if (n == NULL)
31 return NULL;
32 n->n_type = type;
33 n->n_str = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000034 n->n_lineno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035 n->n_nchildren = 0;
36 n->n_child = NULL;
37 return n;
38}
39
40#define XXX 3 /* Node alignment factor to speed up realloc */
41#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
42
Jeremy Hylton94988062000-06-20 19:10:44 +000043int
Guido van Rossum86bea461997-04-29 21:03:06 +000044PyNode_AddChild(n1, type, str, lineno)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045 register node *n1;
46 int type;
47 char *str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048 int lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
50 register int nch = n1->n_nchildren;
51 register int nch1 = nch+1;
52 register node *n;
Jeremy Hylton94988062000-06-20 19:10:44 +000053 if (nch == SHRT_MAX || nch < 0)
54 return E_OVERFLOW;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 if (XXXROUNDUP(nch) < nch1) {
56 n = n1->n_child;
57 nch1 = XXXROUNDUP(nch1);
Guido van Rossum86bea461997-04-29 21:03:06 +000058 PyMem_RESIZE(n, node, nch1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 if (n == NULL)
Jeremy Hylton94988062000-06-20 19:10:44 +000060 return E_NOMEM;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 n1->n_child = n;
62 }
63 n = &n1->n_child[n1->n_nchildren++];
64 n->n_type = type;
65 n->n_str = str;
Guido van Rossum3f5da241990-12-20 15:06:42 +000066 n->n_lineno = lineno;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067 n->n_nchildren = 0;
68 n->n_child = NULL;
Jeremy Hylton94988062000-06-20 19:10:44 +000069 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070}
Guido van Rossum03a24cd1990-11-18 17:37:06 +000071
Guido van Rossum3f5da241990-12-20 15:06:42 +000072/* Forward */
Guido van Rossum86bea461997-04-29 21:03:06 +000073static void freechildren Py_PROTO((node *));
Guido van Rossum3f5da241990-12-20 15:06:42 +000074
75
76void
Guido van Rossum86bea461997-04-29 21:03:06 +000077PyNode_Free(n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000078 node *n;
79{
80 if (n != NULL) {
81 freechildren(n);
Guido van Rossum86bea461997-04-29 21:03:06 +000082 PyMem_DEL(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 }
84}
85
Guido van Rossum03a24cd1990-11-18 17:37:06 +000086static void
87freechildren(n)
88 node *n;
89{
90 int i;
91 for (i = NCH(n); --i >= 0; )
92 freechildren(CHILD(n, i));
93 if (n->n_child != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000094 PyMem_DEL(n->n_child);
Guido van Rossum03a24cd1990-11-18 17:37:06 +000095 if (STR(n) != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000096 PyMem_DEL(STR(n));
Guido van Rossum03a24cd1990-11-18 17:37:06 +000097}