X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmeans.q;h=846448b1ddc7fd4256ce241d011cce6ddb0d681b;hb=97d6c6f6b1922621ca013668eba9a9a9f71d60fe;hp=81fed923d1a4cdc16f47a1c43b47b5a6c31069dd;hpb=fcb9e49b2a2d57af7c001ae5d2eda9ac443ba36b;p=pspp diff --git a/src/means.q b/src/means.q index 81fed923d1..846448b1dd 100644 --- a/src/means.q +++ b/src/means.q @@ -20,10 +20,10 @@ #include #include #include -#include +#include "error.h" #include "alloc.h" -#include "avl.h" #include "command.h" +#include "hash.h" #include "lexer.h" #include "error.h" #include "magic.h" @@ -73,7 +73,6 @@ cmd_means (void) v_dim = NULL; v_var = NULL; - lex_match_id ("MEANS"); if (!parse_means (&cmd)) goto free; @@ -127,23 +126,14 @@ free: return success; } -/* Returns nonzero only if value V is valid as an endpoint for a - dependent variable in integer mode. */ -int -validate_dependent_endpoint (double V) -{ - return V == (int) V && V != LOWEST && V != HIGHEST; -} - /* Parses the TABLES subcommand. */ static int mns_custom_tables (struct cmd_means *cmd) { - struct dictionary *dict; - struct dictionary temp_dict; + struct var_set *var_set; if (!lex_match_id ("TABLES") - && (token != T_ID || !is_varname (tokid)) + && (token != T_ID || dict_lookup_var (default_dict, tokid) == NULL) && token != T_ALL) return 2; lex_match ('='); @@ -155,30 +145,20 @@ mns_custom_tables (struct cmd_means *cmd) return 0; } - if (cmd->sbc_variables) - { - dict = &temp_dict; - temp_dict.var = v_var; - temp_dict.nvar = n_var; - - { - int i; - - temp_dict.var_by_name = avl_create (NULL, cmp_variable, NULL); - for (i = 0; i < temp_dict.nvar; i++) - avl_force_insert (temp_dict.var_by_name, temp_dict.var[i]); - } - } + if (cmd->sbc_variables) + var_set = var_set_create_from_array (v_var, n_var); else - dict = &default_dict; + var_set = var_set_create_from_dict (default_dict); + assert (var_set != NULL); do { int nvl; struct variable **vl; - - if (!parse_variables (dict, &vl, &nvl, PV_NO_DUPLICATE | PV_NO_SCRATCH)) - return 0; + + if (!parse_var_set_vars (var_set, &vl, &nvl, + PV_NO_DUPLICATE | PV_NO_SCRATCH)) + goto lossage; n_dim++; nv_dim = xrealloc (nv_dim, n_dim * sizeof (int)); @@ -201,7 +181,7 @@ mns_custom_tables (struct cmd_means *cmd) "CROSSBREAK, but not specified on " "VARIABLES."), v_dim[0][i]->name); - return 0; + goto lossage; } if (n_dim == 1) @@ -214,7 +194,7 @@ mns_custom_tables (struct cmd_means *cmd) msg (SE, _("LOWEST and HIGHEST may not be used " "for independent variables (%s)."), v_dim[0][i]->name); - return 0; + goto lossage; } if (v_inf->min != (int) v_inf->min || v_inf->max != (int) v_inf->max) @@ -223,7 +203,7 @@ mns_custom_tables (struct cmd_means *cmd) "have noninteger endpoints in their " "ranges."), v_dim[0][i]->name); - return 0; + goto lossage; } } } @@ -231,26 +211,12 @@ mns_custom_tables (struct cmd_means *cmd) } while (lex_match (T_BY)); - /* Check for duplicates. */ - { - int i; - - for (i = 0; i < default_dict.nvar; i++) - default_dict.var[i]->foo = 0; - for (i = 0; i < dict->nvar; i++) - if (dict->var[i]->foo++) - { - msg (SE, _("Variable %s is multiply specified on TABLES " - "or CROSSBREAK."), - dict->var[i]->name); - return 0; - } - } - - if (cmd->sbc_variables) - avl_destroy (temp_dict.var_by_name, NULL); - + var_set_destroy (var_set); return 1; + + lossage: + var_set_destroy (var_set); + return 0; } /* Parse CROSSBREAK subcommand. */ @@ -274,8 +240,8 @@ mns_custom_variables (struct cmd_means *cmd) { int i; - for (i = 0; i < default_dict.nvar; i++) - default_dict.var[i]->p.mns.min = SYSMIS; + for (i = 0; i < dict_get_var_cnt (default_dict); i++) + dict_get_var (default_dict, i)->p.mns.min = SYSMIS; } do @@ -284,7 +250,7 @@ mns_custom_variables (struct cmd_means *cmd) double min, max; - if (!parse_variables (&default_dict, &v_var, &n_var, + if (!parse_variables (default_dict, &v_var, &n_var, PV_APPEND | PV_NO_DUPLICATE | PV_NO_SCRATCH)) return 0;