home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Parser / node.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  1.3 KB  |  73 lines

  1. /* Parse tree node implementation */
  2.  
  3. #include "Python.h"
  4. #include "node.h"
  5. #include "errcode.h"
  6.  
  7. node *
  8. PyNode_New(int type)
  9. {
  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;
  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.  
  24. int
  25. PyNode_AddChild(register node *n1, int type, char *str, int lineno)
  26. {
  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;
  39.     }
  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;
  47. }
  48.  
  49. /* Forward */
  50. static void freechildren(node *);
  51.  
  52.  
  53. void
  54. PyNode_Free(node *n)
  55. {
  56.     if (n != NULL) {
  57.         freechildren(n);
  58.         PyMem_DEL(n);
  59.     }
  60. }
  61.  
  62. static void
  63. freechildren(node *n)
  64. {
  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));
  72. }
  73.