-/* 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 <http://www.gnu.org/licenses/>. */
#include <config.h>
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;
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)
{
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));
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
}
}
+
+/*
+ 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
dict_set_documents (struct dictionary *d, const char *documents)
{
size_t remainder;
-
+
ds_assign_cstr (&d->documents, documents != NULL ? documents : "");
/* In case the caller didn't get it quite right, pad out the
/* Drops the documents from dictionary D. */
void
-dict_clear_documents (struct dictionary *d)
+dict_clear_documents (struct dictionary *d)
{
ds_clear (&d->documents);
}
void
dict_add_document_line (struct dictionary *d, const char *line)
{
- if (strlen (line) > DOC_LINE_LENGTH)
+ if (strlen (line) > DOC_LINE_LENGTH)
{
/* Note to translators: "bytes" is correct, not characters */
- msg (SW, _("Truncating document line to %d bytes."), DOC_LINE_LENGTH);
+ msg (SW, _("Truncating document line to %d bytes."), DOC_LINE_LENGTH);
}
buf_copy_str_rpad (ds_put_uninit (&d->documents, DOC_LINE_LENGTH),
DOC_LINE_LENGTH, line);
/* Returns the number of document lines in dictionary D. */
size_t
-dict_get_document_line_cnt (const struct dictionary *d)
+dict_get_document_line_cnt (const struct dictionary *d)
{
return ds_length (&d->documents) / DOC_LINE_LENGTH;
}
LINE, trimming off any trailing white space. */
void
dict_get_document_line (const struct dictionary *d,
- size_t idx, struct string *line)
+ size_t idx, struct string *line)
{
assert (idx < dict_get_document_line_cnt (d));
ds_assign_substring (line, ds_substr (&d->documents, idx * DOC_LINE_LENGTH,
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);
+ }
+}