[825] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[D-O-H] r819 - trunk/owl

daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:10:07 2009

Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
To: dirty-owl-hackers@mit.edu
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Thu, 10 Jan 2008 01:02:07 -0500 (EST)

Author: nelhage
Date: 2008-01-10 01:02:06 -0500 (Thu, 10 Jan 2008)
New Revision: 819

Modified:
   trunk/owl/variable.c
Log:
Handle recreation of an existing variable better. Copy over the
default and docstrings, but preserve the old value.


Modified: trunk/owl/variable.c
===================================================================
--- trunk/owl/variable.c	2008-01-10 06:01:32 UTC (rev 818)
+++ trunk/owl/variable.c	2008-01-10 06:02:06 UTC (rev 819)
@@ -454,9 +454,11 @@
 /**************************************************************************/
 
 int owl_variable_dict_setup(owl_vardict *vd) {
-  owl_variable *cur;
+  owl_variable *var, *cur;
   if (owl_dict_create(vd)) return(-1);
-  for (cur = variables_to_init; cur->name != NULL; cur++) {
+  for (var = variables_to_init; var->name != NULL; var++) {
+    cur = owl_malloc(sizeof(owl_variable));
+    memcpy(cur, var, sizeof(owl_variable));
     switch (cur->type) {
     case OWL_VARIABLE_OTHER:
       cur->set_fn(cur, cur->pval_default);
@@ -519,7 +521,7 @@
 
 void owl_variable_dict_add_variable(owl_vardict * vardict,
                                     owl_variable * var) {
-  owl_dict_insert_element(vardict, var->name, (void*)var, NULL);
+  owl_dict_insert_element(vardict, var->name, (void*)var, (void(*)(void*))owl_variable_free);
 }
 
 owl_variable * owl_variable_newvar(char *name, char *summary, char * description) {
@@ -531,47 +533,73 @@
   return var;
 }
 
+void owl_variable_update(owl_variable *var, char *summary, char *desc) {
+  if(var->summary) owl_free(var->summary);
+  var->summary = owl_strdup(summary);
+  if(var->description) owl_free(var->description);
+  var->description = owl_strdup(desc);
+}
+
 void owl_variable_dict_newvar_string(owl_vardict * vd, char *name, char *summ, char * desc, char * initval) {
-  owl_variable * var = owl_variable_newvar(name, summ, desc);
-  var->type = OWL_VARIABLE_STRING;
-  var->pval_default = owl_strdup(initval);
-  var->set_fn = owl_variable_string_set_default;
-  var->set_fromstring_fn = owl_variable_string_set_fromstring_default;
-  var->get_fn = owl_variable_get_default;
-  var->get_tostring_fn = owl_variable_string_get_tostring_default;
-  var->free_fn = owl_variable_free_default;
-  var->set_fn(var, initval);
-  owl_variable_dict_add_variable(vd, var);
+  owl_variable *old = owl_variable_get_var(vd, name, OWL_VARIABLE_STRING);
+  if(old) {
+    owl_variable_update(old, summ, desc);
+    if(old->pval_default) owl_free(old->pval_default);
+    old->pval_default = owl_strdup(initval);
+  } else {
+    owl_variable * var = owl_variable_newvar(name, summ, desc);
+    var->type = OWL_VARIABLE_STRING;
+    var->pval_default = owl_strdup(initval);
+    var->set_fn = owl_variable_string_set_default;
+    var->set_fromstring_fn = owl_variable_string_set_fromstring_default;
+    var->get_fn = owl_variable_get_default;
+    var->get_tostring_fn = owl_variable_string_get_tostring_default;
+    var->free_fn = owl_variable_free_default;
+    var->set_fn(var, initval);
+    owl_variable_dict_add_variable(vd, var);
+  }
 }
 
 void owl_variable_dict_newvar_int(owl_vardict * vd, char *name, char *summ, char * desc, int initval) {
-  owl_variable * var = owl_variable_newvar(name, summ, desc);
-  var->type = OWL_VARIABLE_INT;
-  var->ival_default = initval;
-  var->validate_fn = owl_variable_int_validate_default;
-  var->set_fn = owl_variable_int_set_default;
-  var->set_fromstring_fn = owl_variable_int_set_fromstring_default;
-  var->get_fn = owl_variable_get_default;
-  var->get_tostring_fn = owl_variable_int_get_tostring_default;
-  var->free_fn = owl_variable_free_default;
-  var->val = owl_malloc(sizeof(int));
-  var->set_fn(var, &initval);
-  owl_variable_dict_add_variable(vd, var);
+  owl_variable *old = owl_variable_get_var(vd, name, OWL_VARIABLE_INT);
+  if(old) {
+    owl_variable_update(old, summ, desc);
+    old->ival_default = initval;
+  } else {
+    owl_variable * var = owl_variable_newvar(name, summ, desc);
+    var->type = OWL_VARIABLE_INT;
+    var->ival_default = initval;
+    var->validate_fn = owl_variable_int_validate_default;
+    var->set_fn = owl_variable_int_set_default;
+    var->set_fromstring_fn = owl_variable_int_set_fromstring_default;
+    var->get_fn = owl_variable_get_default;
+    var->get_tostring_fn = owl_variable_int_get_tostring_default;
+    var->free_fn = owl_variable_free_default;
+    var->val = owl_malloc(sizeof(int));
+    var->set_fn(var, &initval);
+    owl_variable_dict_add_variable(vd, var);
+  }
 }
 
 void owl_variable_dict_newvar_bool(owl_vardict * vd, char *name, char *summ, char * desc, int initval) {
-  owl_variable * var = owl_variable_newvar(name, summ, desc);
-  var->type = OWL_VARIABLE_BOOL;
-  var->ival_default = initval;
-  var->validate_fn = owl_variable_bool_validate_default;
-  var->set_fn = owl_variable_bool_set_default;
-  var->set_fromstring_fn = owl_variable_bool_set_fromstring_default;
-  var->get_fn = owl_variable_get_default;
-  var->get_tostring_fn = owl_variable_bool_get_tostring_default;
-  var->free_fn = owl_variable_free_default;
-  var->val = owl_malloc(sizeof(int));
-  var->set_fn(var, &initval);
-  owl_variable_dict_add_variable(vd, var);
+  owl_variable *old = owl_variable_get_var(vd, name, OWL_VARIABLE_BOOL);
+  if(old) {
+    owl_variable_update(old, summ, desc);
+    old->ival_default = initval;
+  } else {
+    owl_variable * var = owl_variable_newvar(name, summ, desc);
+    var->type = OWL_VARIABLE_BOOL;
+    var->ival_default = initval;
+    var->validate_fn = owl_variable_bool_validate_default;
+    var->set_fn = owl_variable_bool_set_default;
+    var->set_fromstring_fn = owl_variable_bool_set_fromstring_default;
+    var->get_fn = owl_variable_get_default;
+    var->get_tostring_fn = owl_variable_bool_get_tostring_default;
+    var->free_fn = owl_variable_free_default;
+    var->val = owl_malloc(sizeof(int));
+    var->set_fn(var, &initval);
+    owl_variable_dict_add_variable(vd, var);
+  }
 }
 
 void owl_variable_dict_free(owl_vardict *d) {
@@ -589,6 +617,7 @@
 
 void owl_variable_free(owl_variable *v) {
   if (v->free_fn) v->free_fn(v);
+  owl_free(v);
 }
 
 
@@ -686,12 +715,18 @@
   }
 }
 
-/* returns a reference */
-void *owl_variable_get(owl_vardict *d, char *name, int require_type) {
+owl_variable *owl_variable_get_var(owl_vardict *d, char *name, int require_type) {
   owl_variable *v;
   if (!name) return(NULL);
   v = owl_dict_find_element(d, name);
   if (v == NULL || !v->get_fn || v->type != require_type) return(NULL);
+  return v;
+}
+
+/* returns a reference */
+void *owl_variable_get(owl_vardict *d, char *name, int require_type) {
+  owl_variable *v = owl_variable_get_var(d, name, require_type);
+  if(v == NULL) return NULL;
   return v->get_fn(v);
 }
 


home help back first fref pref prev next nref lref last post