]> git.sur5r.net Git - cc65/blobdiff - src/cc65/exprheap.c
ValidSegName now defined in segnames.h
[cc65] / src / cc65 / exprheap.c
index cd5e49f7923fa90cdd728d0b0b038883bf790baa..8335ef062f8e244e663858cbd3099d5f0acf2fd8 100644 (file)
@@ -83,7 +83,7 @@ static ExprNodeBlock* NewExprNodeBlock (unsigned Count)
     unsigned Size = sizeof (ExprNodeBlock) + (Count-1) * sizeof (ExprNode);
 
     /* Allocate memory */
-    ExprNodeBlock* B = xmalloc (Size);
+    ExprNodeBlock* B = (ExprNodeBlock*) xmalloc (Size);
 
     /* Initialize the fields */
     B->Next  = 0;
@@ -106,7 +106,7 @@ static ExprHeap* NewExprHeap (void)
 /* Create and return a new expression tree */
 {
     /* Allocate memory */
-    ExprHeap* H = xmalloc (sizeof (ExprHeap));
+    ExprHeap* H = (ExprHeap*) xmalloc (sizeof (ExprHeap));
 
     /* Allocate the first node block */
     H->BlockRoot = NewExprNodeBlock (64);
@@ -163,7 +163,7 @@ ExprHeap* PopExprHeap (void)
 
 ExprNode* AllocExprNode (nodetype_t NT, type* Type, int LValue)
 /* Get a new node from the current expression heap */
-{                                                             
+{
     ExprNode* N;
 
     /* Must have a heap */
@@ -205,4 +205,23 @@ void FreeExprNode (ExprNode* N)
 
 
 
+void FreeExprTree (ExprNode* N)
+/* Free a complete expression tree starting with the current node */
+{
+    if (IsBranchNode (N)) {
+       /* Free the leaf nodes if necessary */
+       if ((N->NT & NT_MASK_LIST) == NT_LIST_EXPR) {
+           unsigned I;
+           unsigned Count = CollCount (&N->List);
+           for (I = 0; I < Count; ++I) {
+               FreeExprNode ((ExprNode*) CollAt (&N->List, I));
+           }
+       }
+    }
+
+    /* Free the node itself */
+    FreeExprNode (N);
+}
+
+