Make struct variable refer to struct vardict through a pointer.
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 9 Apr 2010 04:37:24 +0000 (21:37 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 12 Apr 2010 03:50:14 +0000 (20:50 -0700)
This will allow the dictionary to integrate struct vardict into itself in
an upcoming commit.

src/data/dictionary.c
src/data/vardict.h
src/data/variable.c

index 6e6ab1edb4b1b0654390855fc2990a4599876596..2eef7e72667cdab59ad5cf3f9add655ea136ee0e 100644 (file)
@@ -185,8 +185,6 @@ dict_clone (const struct dictionary *s)
 
   for (i = 0; i < s->var_cnt; i++)
     {
-      const struct vardict_info *svdi;
-      struct vardict_info dvdi;
       struct variable *sv = s->var[i];
       struct variable *dv = dict_clone_var_assert (d, sv);
       size_t i;
@@ -194,10 +192,7 @@ dict_clone (const struct dictionary *s)
       for (i = 0; i < var_get_short_name_cnt (sv); i++)
         var_set_short_name (dv, i, var_get_short_name (sv, i));
 
-      svdi = var_get_vardict (sv);
-      dvdi = *svdi;
-      dvdi.dict = d;
-      var_set_vardict (dv, &dvdi);
+      var_get_vardict (dv)->case_index = var_get_vardict (sv)->case_index;
     }
 
   d->next_value_idx = s->next_value_idx;
@@ -367,11 +362,13 @@ static struct variable *
 add_var (struct dictionary *d, struct variable *v)
 {
   /* Add dictionary info to variable. */
-  struct vardict_info vdi;
-  vdi.case_index = d->next_value_idx;
-  vdi.dict_index = d->var_cnt;
-  vdi.dict = d;
-  var_set_vardict (v, &vdi);
+  struct vardict_info *vdi;
+
+  vdi = xmalloc (sizeof *vdi);
+  vdi->case_index = d->next_value_idx;
+  vdi->dict_index = d->var_cnt;
+  vdi->dict = d;
+  var_set_vardict (v, vdi);
 
   /* Update dictionary. */
   if (d->var_cnt >= d->var_cap)
@@ -523,12 +520,9 @@ compare_var_ptrs (const void *a_, const void *b_, const void *aux UNUSED)
 
 /* Sets the dict_index in V's vardict to DICT_INDEX. */
 static void
-set_var_dict_index (struct variable *v, int dict_index)
+set_var_dict_index (struct dictionary *d, struct variable *v, int dict_index)
 {
-  struct vardict_info vdi = *var_get_vardict (v);
-  struct dictionary *d = vdi.dict;
-  vdi.dict_index = dict_index;
-  var_set_vardict (v, &vdi);
+  var_get_vardict (v)->dict_index = dict_index;
 
   if ( d->changed ) d->changed (d, d->changed_data);
   if ( d->callbacks &&  d->callbacks->var_changed )
@@ -539,9 +533,7 @@ set_var_dict_index (struct variable *v, int dict_index)
 static void
 set_var_case_index (struct variable *v, int case_index)
 {
-  struct vardict_info vdi = *var_get_vardict (v);
-  vdi.case_index = case_index;
-  var_set_vardict (v, &vdi);
+  var_get_vardict (v)->case_index = case_index;
 }
 
 /* Re-sets the dict_index in the dictionary variables with
@@ -552,7 +544,7 @@ reindex_vars (struct dictionary *d, size_t from, size_t to)
   size_t i;
 
   for (i = from; i < to; i++)
-    set_var_dict_index (d->var[i], i);
+    set_var_dict_index (d, d->var[i], i);
 }
 
 /* Deletes variable V from dictionary D and frees V.
@@ -602,6 +594,7 @@ dict_delete_var (struct dictionary *d, struct variable *v)
 
 
   /* Free memory. */
+  free (var_get_vardict (v));
   var_clear_vardict (v);
   var_destroy (v);
 
@@ -693,14 +686,14 @@ dict_reorder_vars (struct dictionary *d,
       size_t index = var_get_dict_index (order[i]);
       assert (d->var[index] == order[i]);
       d->var[index] = NULL;
-      set_var_dict_index (order[i], i);
+      set_var_dict_index (d, order[i], i);
     }
   for (i = 0; i < d->var_cnt; i++)
     if (d->var[i] != NULL)
       {
         assert (count < d->var_cnt);
         new_var[count] = d->var[i];
-        set_var_dict_index (new_var[count], count);
+        set_var_dict_index (d, new_var[count], count);
         count++;
       }
   free (d->var);
@@ -711,14 +704,14 @@ dict_reorder_vars (struct dictionary *d,
 static void
 rename_var (struct dictionary *d, struct variable *v, const char *new_name)
 {
-  struct vardict_info vdi;
+  struct vardict_info *vardict;
 
   assert (dict_contains_var (d, v));
 
-  vdi = *var_get_vardict (v);
+  vardict = var_get_vardict (v);
   var_clear_vardict (v);
   var_set_name (v, new_name);
-  var_set_vardict (v, &vdi);
+  var_set_vardict (v, vardict);
 }
 
 /* Changes the name of V in D to name NEW_NAME.  Assert-fails if
index b4552cf17e014a6a4044b25c129f03e752ff2ce5..8bb8b825297b920a6d66dbf09db738df851ca1ae 100644 (file)
@@ -23,7 +23,7 @@
 
 struct dictionary ;
 
-/* Dictionary data stored in variable. */
+/* Dictionary data associated with variable. */
 struct vardict_info
   {
     int dict_index;     /* Dictionary index containing the variable. */
@@ -32,12 +32,11 @@ struct vardict_info
   };
 
 /* Called by dictionary code, defined in variable.c. */
-const struct vardict_info *var_get_vardict (const struct variable *);
-void var_set_vardict (struct variable *, const struct vardict_info *);
+struct vardict_info *var_get_vardict (const struct variable *);
+void var_set_vardict (struct variable *, struct vardict_info *);
 bool var_has_vardict (const struct variable *);
 void var_clear_vardict (struct variable *);
 
-
 /* Called by variable.c, defined in dictionary.c. */
 void dict_var_changed (const struct variable *v);
 void dict_var_resized (const struct variable *v, int old_width);
index dd5e6152f3f42a13bc4b7b71a848eb9caadd818b..056d256720356c1d92686c8e1558fcf6e728953f 100644 (file)
@@ -63,7 +63,7 @@ struct variable
     bool leave;                 /* Leave value from case to case? */
 
     /* Data for use by containing dictionary. */
-    struct vardict_info vardict;
+    struct vardict_info *vardict;
 
     /* Used only for system and portable file input and output.
        See short-names.h. */
@@ -96,7 +96,7 @@ var_create (const char *name, int width)
   assert (width >= 0 && width <= MAX_STRING);
 
   v = xmalloc (sizeof *v);
-  v->vardict.dict_index = v->vardict.case_index = -1;
+  v->vardict = NULL;
   var_set_name (v, name);
   v->width = width;
   mv_init (&v->miss, width);
@@ -183,7 +183,7 @@ var_get_name (const struct variable *v)
 void
 var_set_name (struct variable *v, const char *name)
 {
-  assert (v->vardict.dict_index == -1);
+  assert (!var_has_vardict (v));
   assert (var_is_plausible_name (name, false));
 
   str_copy_trunc (v->name, sizeof v->name, name);
@@ -900,8 +900,8 @@ var_clear_short_names (struct variable *v)
 size_t
 var_get_dict_index (const struct variable *v)
 {
-  assert (v->vardict.dict_index != -1);
-  return v->vardict.dict_index;
+  assert (var_has_vardict (v));
+  return v->vardict->dict_index;
 }
 
 /* Returns V's index within the case represented by its
@@ -911,8 +911,8 @@ var_get_dict_index (const struct variable *v)
 size_t
 var_get_case_index (const struct variable *v)
 {
-  assert (v->vardict.case_index != -1);
-  return v->vardict.case_index;
+  assert (var_has_vardict (v));
+  return v->vardict->case_index;
 }
 \f
 /* Returns V's auxiliary data, or a null pointer if none has been
@@ -1033,37 +1033,36 @@ var_has_attributes (const struct variable *v)
 const char *
 var_get_encoding (const struct variable *var)
 {
-  return var_has_vardict (var) ? dict_get_encoding (var->vardict.dict) : NULL;
+  return var_has_vardict (var) ? dict_get_encoding (var->vardict->dict) : NULL;
 }
 \f
 /* Returns V's vardict structure. */
-const struct vardict_info *
+struct vardict_info *
 var_get_vardict (const struct variable *v)
 {
-  assert (var_has_vardict (v));
-  return &v->vardict;
+  return CONST_CAST (struct vardict_info *, v->vardict);
 }
 
 /* Sets V's vardict data to VARDICT. */
 void
-var_set_vardict (struct variable *v, const struct vardict_info *vardict)
+var_set_vardict (struct variable *v, struct vardict_info *vardict)
 {
   assert (vardict->dict_index >= 0);
   assert (vardict->case_index >= 0);
   assert (vardict->dict != NULL);
-  v->vardict = *vardict;
+  v->vardict = vardict;
 }
 
 /* Returns true if V has vardict data. */
 bool
 var_has_vardict (const struct variable *v)
 {
-  return v->vardict.dict_index != -1;
+  return v->vardict != NULL;
 }
 
 /* Clears V's vardict data. */
 void
 var_clear_vardict (struct variable *v)
 {
-  v->vardict.dict_index = v->vardict.case_index = -1;
+  v->vardict = NULL;
 }