X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdictionary.c;h=f2ac187a1dcf1805a61096b7b2ba713800c61e15;hb=9b4b94c6d3b5fd98bf396e23d015380b87d2d296;hp=0f7133ecf59dd5c5e716cd21aa0515b8a18292be;hpb=312ad23d59e643e0c72e7ad684b00f3432461dee;p=pspp diff --git a/src/dictionary.c b/src/dictionary.c index 0f7133ecf5..f2ac187a1d 100644 --- a/src/dictionary.c +++ b/src/dictionary.c @@ -18,7 +18,7 @@ 02111-1307, USA. */ #include -#include +#include "error.h" #include #include "algorithm.h" #include "alloc.h" @@ -236,7 +236,7 @@ dict_create_var (struct dictionary *d, const char *name, int width) v->fv = d->next_value_idx; v->nv = width == 0 ? 1 : DIV_RND_UP (width, 8); v->init = 1; - v->reinit = name[0] != '#'; + v->reinit = dict_class_from_id (name) != DC_SCRATCH; v->miss_type = MISSING_NONE; if (v->type == NUMERIC) { @@ -250,6 +250,7 @@ dict_create_var (struct dictionary *d, const char *name, int width) v->print.w = v->width; v->print.d = 0; } + v->write = v->print; v->val_labs = val_labs_create (v->width); v->label = NULL; @@ -320,6 +321,7 @@ dict_rename_var (struct dictionary *d, struct variable *v, assert (v != NULL); assert (new_name != NULL); assert (strlen (new_name) >= 1 && strlen (new_name) <= 8); + assert (dict_contains_var (d, v)); if (!strcmp (v->name, new_name)) return; @@ -366,7 +368,7 @@ dict_contains_var (const struct dictionary *d, const struct variable *v) assert (d != NULL); assert (v != NULL); - return dict_lookup_var (d, v->name) == v; + return v->index >= 0 && v->index < d->var_cnt && d->var[v->index] == v; } /* Compares two double pointers to variables, which should point @@ -652,21 +654,70 @@ dict_get_case_size (const struct dictionary *d) return sizeof (union value) * dict_get_next_value_idx (d); } -/* Reassigns values in dictionary D so that fragmentation is - eliminated. */ +/* Deletes scratch variables in dictionary D and reassigns values + so that fragmentation is eliminated. */ void dict_compact_values (struct dictionary *d) { size_t i; d->next_value_idx = 0; + for (i = 0; i < d->var_cnt; ) + { + struct variable *v = d->var[i]; + + if (dict_class_from_id (v->name) != DC_SCRATCH) + { + v->fv = d->next_value_idx; + d->next_value_idx += v->nv; + i++; + } + else + dict_delete_var (default_dict, v); + } +} + +/* Returns the number of values that would be used by a case if + dict_compact_values() were called. */ +size_t +dict_get_compacted_value_cnt (const struct dictionary *d) +{ + size_t i; + size_t cnt; + + cnt = 0; + for (i = 0; i < d->var_cnt; i++) + if (dict_class_from_id (d->var[i]->name) != DC_SCRATCH) + cnt += d->var[i]->nv; + return cnt; +} + +/* Creates and returns an array mapping from a dictionary index + to the `fv' that the corresponding variable will have after + calling dict_compact_values(). Scratch variables receive -1 + for `fv' because dict_compact_values() will delete them. */ +int * +dict_get_compacted_idx_to_fv (const struct dictionary *d) +{ + size_t i; + size_t next_value_idx; + int *idx_to_fv; + + idx_to_fv = xmalloc (d->var_cnt * sizeof *idx_to_fv); + next_value_idx = 0; for (i = 0; i < d->var_cnt; i++) { struct variable *v = d->var[i]; - v->fv = d->next_value_idx; - d->next_value_idx += v->nv; + if (dict_class_from_id (v->name) != DC_SCRATCH) + { + idx_to_fv[i] = next_value_idx; + next_value_idx += v->nv; + } + else + idx_to_fv[i] = -1; } + return idx_to_fv; } /* Returns the SPLIT FILE vars (see cmd_split_file()). Call