maintaining parent expression
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@291 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c
index 4337981..755196f 100644
--- a/libasn1parser/asn1p_expr.c
+++ b/libasn1parser/asn1p_expr.c
@@ -82,13 +82,23 @@
asn1p_expr_free(clone);
return NULL;
}
- TQ_ADD(&(clone->members), cmemb, next);
+ asn1p_expr_add(clone, cmemb);
}
return clone;
}
/*
+ * Add expression as a member of another.
+ */
+void
+asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what) {
+ TQ_ADD(&(to->members), what, next);
+ what->parent_expr = to;
+}
+
+
+/*
* Destruct the types collection structure.
*/
void
@@ -96,6 +106,16 @@
if(expr) {
asn1p_expr_t *tm;
+ /* Remove all children */
+ while((tm = TQ_REMOVE(&(expr->members), next))) {
+ if(tm->parent_expr != expr)
+ printf("<%s:%p !-> %s:%p>\n",
+ tm->Identifier, tm->parent_expr,
+ expr->Identifier, expr);
+ assert(tm->parent_expr == expr);
+ asn1p_expr_free(tm);
+ }
+
if(expr->Identifier)
free(expr->Identifier);
if(expr->reference)
@@ -111,11 +131,6 @@
if(expr->with_syntax)
asn1p_wsyntx_free(expr->with_syntax);
- /* Remove all children */
- while((tm = TQ_REMOVE(&(expr->members), next))) {
- asn1p_expr_free(tm);
- }
-
if(expr->data && expr->data_free)
expr->data_free(expr->data);