]> mj.ucw.cz Git - umpf.git/commitdiff
fix modified flags
authorAnicka Bernathova <anicka@anicka.net>
Tue, 21 Jul 2009 17:56:39 +0000 (19:56 +0200)
committerAnicka Bernathova <anicka@anicka.net>
Tue, 21 Jul 2009 17:56:39 +0000 (19:56 +0200)
int.c
umpf.c
umpf.h

diff --git a/int.c b/int.c
index bf3f2d97f0d49f35632050361e90dfd7c4a54d2e..cdb5715f0bfee06f6e76641e88b30397f9db80b4 100644 (file)
--- 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 e01aca26a1d1a042d342e466c9513ba5984f0be0..5918a0db7dfdc5aaddb5c32222bf94d88362d254 100644 (file)
--- 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 41cea0ca5a821c09104af5ba4cdca6174c53e080..f0bf8bb70ebfd817583d2d691e92aa35c7e91cc1 100644 (file)
--- 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;