X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdictionary.c;h=44504ed96525ec5c4af0eaffd82f5de2fe3634c1;hb=235aec793b51987574741a6b8346980b9396cfde;hp=64c4f8ac10977547da5f50b3669ffe9e7940884a;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp-builds.git diff --git a/src/data/dictionary.c b/src/data/dictionary.c index 64c4f8ac..44504ed9 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -1,20 +1,18 @@ -/* PSPP - computes sample statistics. +/* PSPP - a program for statistical analysis. Copyright (C) 1997-9, 2000, 2006, 2007 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include @@ -158,14 +156,22 @@ dict_clear (struct dictionary *d) while (d->var_cnt > 0 ) { - var_clear_vardict (d->var[d->var_cnt - 1]); - var_destroy (d->var[d->var_cnt -1]); + 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, d->var_cnt, d->cb_data); + d->callbacks->var_deleted (d, + dict_index, case_index, val_cnt, + d->cb_data); } + free (d->var); d->var = NULL; d->var_cnt = d->var_cap = 0; @@ -420,7 +426,7 @@ set_var_dict_index (struct variable *v, int dict_index) d->callbacks->var_changed (d, dict_index, d->cb_data); } -/* Sets the case_index in V's vardict to DICT_INDEX. */ +/* Sets the case_index in V's vardict to CASE_INDEX. */ static void set_var_case_index (struct variable *v, int case_index) { @@ -457,6 +463,8 @@ void dict_delete_var (struct dictionary *d, struct variable *v) { int dict_index = var_get_dict_index (v); + const int case_index = var_get_case_index (v); + const int val_cnt = var_get_value_cnt (v); assert (dict_contains_var (d, v)); @@ -489,7 +497,7 @@ dict_delete_var (struct dictionary *d, struct variable *v) var_destroy (v); if (d->callbacks && d->callbacks->var_deleted ) - d->callbacks->var_deleted (d, dict_index, d->cb_data); + d->callbacks->var_deleted (d, dict_index, case_index, val_cnt, d->cb_data); } /* Deletes the COUNT variables listed in VARS from D. This is @@ -836,6 +844,33 @@ dict_compact_values (struct dictionary *d) } } + +/* + Reassigns case indices for D, increasing each index above START by + the value PADDING. +*/ +static void +dict_pad_values (struct dictionary *d, int start, int padding) +{ + size_t i; + + if ( padding <= 0 ) + return; + + for (i = 0; i < d->var_cnt; ++i) + { + struct variable *v = d->var[i]; + + int index = var_get_case_index (v); + + if ( index >= start) + set_var_case_index (v, index + padding); + } + + d->next_value_idx += padding; +} + + /* Returns the number of values that would be used by a case if dict_compact_values() were called. */ size_t @@ -1390,3 +1425,23 @@ dict_var_changed (const struct variable *v) d->callbacks->var_changed (d, var_get_dict_index (v), d->cb_data); } } + + +/* Called from variable.c to notify the dictionary that the variable's width + has changed */ +void +dict_var_resized (const struct variable *v, int delta) +{ + if ( var_has_vardict (v)) + { + const struct vardict_info *vdi = var_get_vardict (v); + struct dictionary *d; + + d = vdi->dict; + + dict_pad_values (d, var_get_case_index(v) + 1, delta); + + if ( d->callbacks && d->callbacks->var_resized ) + d->callbacks->var_resized (d, var_get_dict_index (v), delta, d->cb_data); + } +}