From 1ca0b6d047a96a69800a0e00f3e61f148beed1db Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Wed, 11 Jun 2003 06:39:13 +0000 Subject: Make sure a variable is no longer referenced when it is removed. Fixed counting bug in parsing "->" operator. Removed that silly debugging function I accidently committed last night. --- src/interfaces/ecpg/preproc/variable.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/interfaces/ecpg/preproc/variable.c') diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index 83b56ac9dc3..be96e18c0c5 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -137,7 +137,7 @@ find_struct(char *name, char *next, char *end) /* restore the name, we will need it later */ *next = c; - return find_struct_member(name, end, p->type->u.element->u.members, p->brace_level); + return find_struct_member(name, ++end, p->type->u.element->u.members, p->brace_level); } else { @@ -260,6 +260,37 @@ remove_variables(int brace_level) { if (p->brace_level >= brace_level) { + /* is it still referenced by a cursor? */ + struct cursor *ptr; + + for (ptr = cur; ptr != NULL; ptr = ptr->next) + { + struct arguments *varptr, *prevvar; + + for (varptr = prevvar = ptr->argsinsert; varptr != NULL; varptr = varptr->next) + { + if (p == varptr->variable) + { + /* remove from list */ + if (varptr == ptr->argsinsert) + ptr->argsinsert = varptr->next; + else + prevvar->next = varptr->next; + } + } + for (varptr = ptr->argsresult; varptr != NULL; varptr = varptr->next) + { + if (p == varptr->variable) + { + /* remove from list */ + if (varptr == ptr->argsresult) + ptr->argsresult = varptr->next; + else + prevvar->next = varptr->next; + } + } + } + /* remove it */ if (p == allvariables) prev = allvariables = p->next; -- cgit v1.2.3