X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdictionary.c;h=0b930d579c3defc7ec19dc0b81de6bb10a07b3d9;hb=c972eebe3286130ba9af8b0520a35a42a8d5ef75;hp=79952b58140f386432851a05f41586ff10172c79;hpb=1641c5707278765ec595bda341378aa7c6bec152;p=pspp diff --git a/src/data/dictionary.c b/src/data/dictionary.c index 79952b5814..0b930d579c 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015 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 @@ -285,7 +285,7 @@ dict_destroy (struct dictionary *d) { if (d != NULL) { - /* In general, we don't want callbacks occuring, if the dictionary + /* In general, we don't want callbacks occurring, if the dictionary is being destroyed */ d->callbacks = NULL ; @@ -546,17 +546,21 @@ unindex_var (struct dictionary *d, struct vardict_info *vardict) static void reindex_var (struct dictionary *d, struct vardict_info *vardict) { - struct variable *var = vardict->var; - struct variable *old = var_clone (var); + struct variable *old = (d->callbacks && d->callbacks->var_changed + ? var_clone (vardict->var) + : NULL); + struct variable *var = vardict->var; var_set_vardict (var, vardict); hmap_insert_fast (&d->name_map, &vardict->name_node, vardict->name_node.hash); if ( d->changed ) d->changed (d, d->changed_data); - if ( d->callbacks && d->callbacks->var_changed ) - d->callbacks->var_changed (d, var_get_dict_index (var), VAR_TRAIT_POSITION, old, d->cb_data); - var_destroy (old); + if (old) + { + d->callbacks->var_changed (d, var_get_dict_index (var), VAR_TRAIT_POSITION, old, d->cb_data); + var_destroy (old); + } } /* Sets the case_index in V's vardict to CASE_INDEX. */ @@ -752,17 +756,18 @@ rename_var (struct variable *v, const char *new_name) var_set_vardict (v, vardict); } -/* Changes the name of V in D to name NEW_NAME. Assert-fails if - a variable named NEW_NAME is already in D, except that - NEW_NAME may be the same as V's existing name. */ -void -dict_rename_var (struct dictionary *d, struct variable *v, - const char *new_name) +/* Tries to changes the name of V in D to name NEW_NAME. Returns true if + successful, false if a variable (other than V) with the given name already + exists in D. */ +bool +dict_try_rename_var (struct dictionary *d, struct variable *v, + const char *new_name) { - struct variable *old = var_clone (v); - assert (!utf8_strcasecmp (var_get_name (v), new_name) - || dict_lookup_var (d, new_name) == NULL); + struct variable *conflict = dict_lookup_var (d, new_name); + if (conflict && v != conflict) + return false; + struct variable *old = var_clone (v); unindex_var (d, var_get_vardict (v)); rename_var (v, new_name); reindex_var (d, var_get_vardict (v)); @@ -775,6 +780,19 @@ dict_rename_var (struct dictionary *d, struct variable *v, d->callbacks->var_changed (d, var_get_dict_index (v), VAR_TRAIT_NAME, old, d->cb_data); var_destroy (old); + + return true; +} + +/* Changes the name of V in D to name NEW_NAME. Assert-fails if + a variable named NEW_NAME is already in D, except that + NEW_NAME may be the same as V's existing name. */ +void +dict_rename_var (struct dictionary *d, struct variable *v, + const char *new_name) +{ + bool ok UNUSED = dict_try_rename_var (d, v, new_name); + assert (ok); } /* Renames COUNT variables specified in VARS to the names given @@ -907,7 +925,7 @@ make_hinted_name (const struct dictionary *dict, const char *hint) char *name; suffix[0] = '_'; - if (!str_format_26adic (i + 1, &suffix[1], sizeof suffix - 1)) + if (!str_format_26adic (i + 1, true, &suffix[1], sizeof suffix - 1)) NOT_REACHED (); name = utf8_encoding_concat (root, suffix, dict->encoding, 64); @@ -1003,15 +1021,8 @@ dict_get_case_weight (const struct dictionary *d, const struct ccase *c, else { double w = case_num (c, d->weight); - if (w < 0.0 || var_is_num_missing (d->weight, w, MV_ANY)) - w = 0.0; - if ( w == 0.0 && warn_on_invalid != NULL && *warn_on_invalid ) { - *warn_on_invalid = false; - msg (SW, _("At least one case in the data file had a weight value " - "that was user-missing, system-missing, zero, or " - "negative. These case(s) were ignored.")); - } - return w; + + return var_force_valid_weight (d->weight, w, warn_on_invalid); } } @@ -1575,7 +1586,7 @@ dict_unset_mrset_var (struct dictionary *dict, struct variable *var) calling dict_set_attributes for D will also destroy D's attribute set. */ struct attrset * -dict_get_attributes (const struct dictionary *d) +dict_get_attributes (const struct dictionary *d) { return CONST_CAST (struct attrset *, &d->attributes); } @@ -1591,7 +1602,7 @@ dict_set_attributes (struct dictionary *d, const struct attrset *attrs) /* Returns true if D has at least one attribute in its attribute set, false if D's attribute set is empty. */ bool -dict_has_attributes (const struct dictionary *d) +dict_has_attributes (const struct dictionary *d) { return attrset_count (&d->attributes) > 0; }