From: Ben Pfaff Date: Fri, 9 Apr 2010 04:37:24 +0000 (-0700) Subject: Make struct variable refer to struct vardict through a pointer. X-Git-Tag: sav-api~322 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=a444c32ff965e91abff74634375266064bff05a6 Make struct variable refer to struct vardict through a pointer. This will allow the dictionary to integrate struct vardict into itself in an upcoming commit. --- diff --git a/src/data/dictionary.c b/src/data/dictionary.c index 6e6ab1edb4..2eef7e7266 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -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 diff --git a/src/data/vardict.h b/src/data/vardict.h index b4552cf17e..8bb8b82529 100644 --- a/src/data/vardict.h +++ b/src/data/vardict.h @@ -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); diff --git a/src/data/variable.c b/src/data/variable.c index dd5e6152f3..056d256720 100644 --- a/src/data/variable.c +++ b/src/data/variable.c @@ -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; } /* 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; } /* 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; }