aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/preproc/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/preproc/variable.c')
-rw-r--r--src/interfaces/ecpg/preproc/variable.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c
index 9663e29ef03..f13f7375cb0 100644
--- a/src/interfaces/ecpg/preproc/variable.c
+++ b/src/interfaces/ecpg/preproc/variable.c
@@ -276,12 +276,46 @@ find_variable(char *name)
}
void
+remove_typedefs(int brace_level)
+{
+ struct typedefs *p,
+ *prev;
+
+ for (p = prev = types; p;)
+ {
+ if (p->brace_level >= brace_level)
+ {
+ /* remove it */
+ if (p == types)
+ prev = types = p->next;
+ else
+ prev->next = p->next;
+
+ if (p->type->type_enum == ECPGt_struct || p->type->type_enum == ECPGt_union)
+ free(p->struct_member_list);
+ free(p->type);
+ free(p->name);
+ free(p);
+ if (prev == types)
+ p = types;
+ else
+ p = prev ? prev->next : NULL;
+ }
+ else
+ {
+ prev = p;
+ p = prev->next;
+ }
+ }
+}
+
+void
remove_variables(int brace_level)
{
struct variable *p,
*prev;
- for (p = prev = allvariables; p; p = p ? p->next : NULL)
+ for (p = prev = allvariables; p;)
{
if (p->brace_level >= brace_level)
{
@@ -326,10 +360,16 @@ remove_variables(int brace_level)
ECPGfree_type(p->type);
free(p->name);
free(p);
- p = prev;
+ if (prev == allvariables)
+ p = allvariables;
+ else
+ p = prev ? prev->next : NULL;
}
else
+ {
prev = p;
+ p = prev->next;
+ }
}
}