From 1dd9a64e5c07ea6718f3d3b50ba441d7dfc412d7 Mon Sep 17 00:00:00 2001 From: Anicka Bernathova Date: Tue, 21 Jul 2009 19:56:39 +0200 Subject: [PATCH] fix modified flags --- int.c | 31 +++++++++++++++++++++++-------- umpf.c | 5 +++-- umpf.h | 8 ++++++-- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/int.c b/int.c index bf3f2d9..cdb5715 100644 --- a/int.c +++ b/int.c @@ -42,6 +42,18 @@ bye(int code, char* msg, ...) exit(code); } +static void +set_modif_flag(int var, int flag) +{ + var_tab[var].modif = flag; +} + +static int +get_modif_flag(int var) +{ + return var_tab[var].modif; +} + void free_string(char* c) { @@ -52,15 +64,17 @@ free_string(char* c) static void clear_var(int var) { - if ((var_tab[var] != NULL)) - free_string(var_tab[var]); + if ((var_tab[var].value != NULL)) + free_string(var_tab[var].value); + var_tab[var].modif = 0; } static void set_var(int var, char* value) { clear_var(var); - var_tab[var] = xstrdup(value); + var_tab[var].modif = 1; + var_tab[var].value = xstrdup(value); } void @@ -114,7 +128,7 @@ get_var(int var) { if (var < 0) return xstrdup(const_tab[-var]); - return xstrdup(var_tab[var]); + return xstrdup(var_tab[var].value); } static int @@ -244,7 +258,7 @@ modify_headers(struct list* headers, struct list* hash) u = unfold(p->value); value = get_var(pv->varcode); if (strcmp(u, value)){ - pv->modified = 0; + set_modif_flag(pv->varcode, 0); free_string(p->value); p->value = fold(value, strlen(p->name) + 2); @@ -256,9 +270,10 @@ modify_headers(struct list* headers, struct list* hash) // find new headers for (i = 0; i < HASHSIZE; i++){ LIST_FOREACH(pv, hash + i){ - if (pv->type == VAR_HEADER && pv->modified){ - pv->modified = 0; + if (pv->type == VAR_HEADER && + get_modif_flag(pv->varcode)){ + set_modif_flag(pv->varcode, 0); p = xmalloc(sizeof(struct hlist)); p->name = xstrdup(pv->name); p->value = get_var(pv->varcode); @@ -791,7 +806,7 @@ save_current_headers(struct list* hash) u = unfold(p->value); set_var(pv->varcode, u); free_string(u); - pv->modified = 0; + set_modif_flag(pv->varcode, 0); p->have_var = 1; } } diff --git a/umpf.c b/umpf.c index e01aca2..5918a0d 100644 --- a/umpf.c +++ b/umpf.c @@ -73,9 +73,10 @@ main(int argc, char** argv) compile(input_tree, NULL); skip_conf: - var_tab = xmalloc((max_varcode + 1) * sizeof(char*)); + var_tab = xmalloc((max_varcode + 1) * sizeof(struct vartab)); for (i = 0; i <= max_varcode; i++) { - var_tab[i] = empty; + var_tab[i].value = empty; + var_tab[i].modif = 0; } current_headers = make_hlist(0); diff --git a/umpf.h b/umpf.h index 41cea0c..f0bf8bb 100644 --- a/umpf.h +++ b/umpf.h @@ -178,16 +178,20 @@ struct variable { struct node car; char* name; int varcode; - int modified; enum var_type type; }; +struct vartab { + char* value; + int modif; +}; + struct list input_code; struct list* var_hash; int current_varcode; int max_varcode; int temp_varcode_start; -char** var_tab; +struct vartab* var_tab; char** const_tab; int cur_const_n; int cur_const_s; -- 2.39.2