X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdictionary.c;h=5d6633bd7ad61e98f4288a9f88e797486c2efd49;hb=2c7d1b0285e21571b1e50def87e33095f095ce4e;hp=9589a72f0106f1bbfa7dcbbd87ce6e3330252218;hpb=9db3101d0bbbcfb687acd3e442e550557e4e56b1;p=pspp diff --git a/src/data/dictionary.c b/src/data/dictionary.c index 9589a72f01..5d6633bd7a 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -63,6 +63,23 @@ struct dictionary void *cb_data ; /* Data passed to callbacks */ }; +/* Print a representation of dictionary D to stdout, for + debugging purposes. */ +void +dict_dump (const struct dictionary *d) +{ + int i; + for (i = 0 ; i < d->var_cnt ; ++i ) + { + const struct variable *v = + d->var[i]; + printf ("Name: %s;\tdict_idx: %d; case_idx: %d\n", + var_get_name (v), + var_get_dict_index (v), + var_get_case_index (v)); + + } +} /* Associate CALLBACKS with DICT. Callbacks will be invoked whenever the dictionary or any of the variables it contains are modified. @@ -99,7 +116,13 @@ dict_create (void) } /* Creates and returns a (deep) copy of an existing - dictionary. */ + dictionary. + + The new dictionary's case indexes are copied from the old + dictionary. If the new dictionary won't be used to access + cases produced with the old dictionary, then the new + dictionary's case indexes should be compacted with + dict_compact_values to save space. */ struct dictionary * dict_clone (const struct dictionary *s) { @@ -118,6 +141,8 @@ 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)); + + var_set_vardict (dv, var_get_vardict (sv)); } d->next_value_idx = s->next_value_idx; @@ -159,20 +184,7 @@ dict_clear (struct dictionary *d) while (d->var_cnt > 0 ) { - struct variable *v = d->var[d->var_cnt - 1]; - int dict_index = var_get_dict_index (v); - int case_index = var_get_case_index (v); - int val_cnt = var_get_value_cnt (v); - - var_clear_vardict (v); - var_destroy (v); - - d->var_cnt--; - - if (d->callbacks && d->callbacks->var_deleted ) - d->callbacks->var_deleted (d, - dict_index, case_index, val_cnt, - d->cb_data); + dict_delete_var (d, d->var[d->var_cnt - 1]); } free (d->var); @@ -369,7 +381,7 @@ dict_lookup_var (const struct dictionary *d, const char *name) struct variable *target ; struct variable *result ; - if ( ! var_is_valid_name (name, false)) + if ( ! var_is_plausible_name (name, false)) return NULL; target = var_create (name, 0); @@ -499,6 +511,7 @@ dict_delete_var (struct dictionary *d, struct variable *v) var_clear_vardict (v); var_destroy (v); + if (d->callbacks && d->callbacks->var_deleted ) d->callbacks->var_deleted (d, dict_index, case_index, val_cnt, d->cb_data); } @@ -942,8 +955,16 @@ dict_set_split_vars (struct dictionary *d, assert (cnt == 0 || split != NULL); d->split_cnt = cnt; - d->split = cnt > 0 ? xnrealloc (d->split, cnt, sizeof *d->split) : NULL; - memcpy (d->split, split, cnt * sizeof *d->split); + if ( cnt > 0 ) + { + d->split = xnrealloc (d->split, cnt, sizeof *d->split) ; + memcpy (d->split, split, cnt * sizeof *d->split); + } + else + { + free (d->split); + d->split = NULL; + } if ( d->callbacks && d->callbacks->split_changed ) d->callbacks->split_changed (d, d->cb_data);