aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2005-10-05 12:17:18 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2005-10-05 12:17:18 +0000
commit3c5ca3b4f998e49a6c3cd167d944aeef38d7006b (patch)
tree62ea9d35b489b17a1f623c4fe2b6b2e925c82ac4 /src
parentcd7d18072bf16d7abb44798b1ad0922af2a807d8 (diff)
downloadcflow-3c5ca3b4f998e49a6c3cd167d944aeef38d7006b.tar.gz
cflow-3c5ca3b4f998e49a6c3cd167d944aeef38d7006b.tar.bz2
(install): Initialize sym->flag
(temp_processor): Use s->flag (delete_parms,move_parms): New functions
Diffstat (limited to 'src')
-rw-r--r--src/symbol.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/symbol.c b/src/symbol.c
index 97045fb..e8930d0 100644
--- a/src/symbol.c
+++ b/src/symbol.c
@@ -58,7 +58,12 @@ install(char *name)
memset(sym, 0, sizeof(*sym));
sym->type = SymUndefined;
sym->name = name;
- sym->temp = canonical_filename && strcmp(filename, canonical_filename);
+
+ if (canonical_filename && strcmp(filename, canonical_filename))
+ sym->flag = symbol_temp;
+ else
+ sym->flag = symbol_none;
+
if (! ((symbol_table
|| (symbol_table = hash_initialize (0, 0,
hash_symbol_hasher,
@@ -113,7 +118,7 @@ temp_processor(void *data, void *proc_data)
{
Symbol *s = data;
- if (s->temp)
+ if (s->flag == symbol_temp)
delete_symbol(s);
return true;
}
@@ -222,6 +227,48 @@ collect_symbols(Symbol ***return_sym, int (*sel)(Symbol *p))
}
+/* Special handling for function parameters */
+
+static bool
+delete_parm_processor(void *data, void *proc_data)
+{
+ Symbol *s = data;
+ int *level = proc_data;
+ if (s->type == SymIdentifier && s->storage == AutoStorage
+ && s->flag == symbol_parm && s->level > *level)
+ delete_symbol(s);
+ return true;
+}
+
+/* Delete all parameters with parameter nesting level greater than LEVEL */
+void
+delete_parms(int level)
+{
+ hash_do_for_each (symbol_table, delete_parm_processor, &level);
+}
+
+static bool
+move_parm_processor(void *data, void *proc_data)
+{
+ Symbol *s = data;
+ int *level = proc_data;
+ if (s->type == SymIdentifier && s->storage == AutoStorage
+ && s->flag == symbol_parm) {
+ s->level = *(int*)proc_data;
+ s->flag = symbol_none;
+ }
+ return true;
+}
+
+/* Redeclare all saved parameters as automatic variables with the
+ given nesting level */
+void
+move_parms(int level)
+{
+ hash_do_for_each (symbol_table, move_parm_processor, &level);
+}
+
+
typedef struct bucket Bucket;
struct bucket {
Bucket *next; /* Next bucket */

Return to:

Send suggestions and report system problems to the System administrator.