blob: 6844965ea837fe77410a3124becaf4199d84148e [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
Fred Drakeef8ace32000-08-24 00:32:09 +000011#ifdef HAVE_LIMITS_H
Jeremy Hylton94988062000-06-20 19:10:44 +000012#include <limits.h>
Fred Drakeef8ace32000-08-24 00:32:09 +000013#endif
14#ifndef INT_MAX
15#define INT_MAX 2147483647
16#endif
Jeremy Hylton94988062000-06-20 19:10:44 +000017
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018/* Parse tree node implementation */
19
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021#include "node.h"
Jeremy Hylton94988062000-06-20 19:10:44 +000022#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023
24node *
Thomas Wouters23c9e002000-07-22 19:20:54 +000025PyNode_New(int type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026{
Guido van Rossum86bea461997-04-29 21:03:06 +000027 node *n = PyMem_NEW(node, 1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 if (n == NULL)
29 return NULL;
30 n->n_type = type;
31 n->n_str = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 n->n_lineno = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 n->n_nchildren = 0;
34 n->n_child = NULL;
35 return n;
36}
37
38#define XXX 3 /* Node alignment factor to speed up realloc */
39#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX)
40
Jeremy Hylton94988062000-06-20 19:10:44 +000041int
Thomas Wouters23c9e002000-07-22 19:20:54 +000042PyNode_AddChild(register node *n1, int type, char *str, 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;
Fred Drakeef8ace32000-08-24 00:32:09 +000047 if (nch == INT_MAX || nch < 0)
Jeremy Hylton94988062000-06-20 19:10:44 +000048 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
Thomas Wouters23c9e002000-07-22 19:20:54 +000071PyNode_Free(node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072{
73 if (n != NULL) {
74 freechildren(n);
Guido van Rossum86bea461997-04-29 21:03:06 +000075 PyMem_DEL(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 }
77}
78
Guido van Rossum03a24cd1990-11-18 17:37:06 +000079static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000080freechildren(node *n)
Guido van Rossum03a24cd1990-11-18 17:37:06 +000081{
82 int i;
83 for (i = NCH(n); --i >= 0; )
84 freechildren(CHILD(n, i));
85 if (n->n_child != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000086 PyMem_DEL(n->n_child);
Guido van Rossum03a24cd1990-11-18 17:37:06 +000087 if (STR(n) != NULL)
Guido van Rossum86bea461997-04-29 21:03:06 +000088 PyMem_DEL(STR(n));
Guido van Rossum03a24cd1990-11-18 17:37:06 +000089}