X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmeans.q;h=7dca14b2ffdb364c87570fc415ee75312645a30f;hb=35abdb30d26f0bfb972c1712ee887a0f0fff6b97;hp=bda3eb8568ac1bd55fb3b8b9f2881f8a65d9604b;hpb=2bfc3a138f308ffb38634a92b23bdc7b62592324;p=pspp-builds.git diff --git a/src/means.q b/src/means.q index bda3eb85..7dca14b2 100644 --- a/src/means.q +++ b/src/means.q @@ -20,7 +20,8 @@ #include #include #include -#include +#include "dictionary.h" +#include "error.h" #include "alloc.h" #include "command.h" #include "hash.h" @@ -35,8 +36,6 @@ /* (specification) means (mns_): *tables=custom; - +variables=custom; - +crossbreak=custom; +format=lab:!labels/nolabels/nocatlabs, name:!names/nonames, val:!values/novalues, @@ -48,10 +47,6 @@ /* (declarations) */ /* (functions) */ -#if DEBUGGING -static void debug_print (struct cmd_means *cmd); -#endif - /* TABLES: Variable lists for each dimension. */ int n_dim; /* Number of dimensions. */ int *nv_dim; /* Number of variables in each dimension. */ @@ -73,7 +68,6 @@ cmd_means (void) v_dim = NULL; v_var = NULL; - lex_match_id ("MEANS"); if (!parse_means (&cmd)) goto free; @@ -107,10 +101,6 @@ cmd_means (void) goto free; } -#if DEBUGGING - debug_print (&cmd); -#endif - success = CMD_SUCCESS; free: @@ -127,59 +117,36 @@ 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 ('='); - if (cmd->sbc_tables || cmd->sbc_crossbreak) + if (cmd->sbc_tables) { - msg (SE, _("TABLES or CROSSBREAK subcommand may not appear more " + msg (SE, _("TABLES subcommand may not appear more " "than once.")); return 0; } - if (cmd->sbc_variables) - { - dict = &temp_dict; - temp_dict.var = v_var; - temp_dict.nvar = n_var; - - { - int i; - - temp_dict.name_tab = hsh_create (8, compare_variables, hash_variable, - NULL, NULL); - for (i = 0; i < temp_dict.nvar; i++) - hsh_force_insert (temp_dict.name_tab, temp_dict.var[i]); - } - } - 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)); @@ -187,219 +154,16 @@ mns_custom_tables (struct cmd_means *cmd) nv_dim[n_dim - 1] = nvl; v_dim[n_dim - 1] = vl; - - if (cmd->sbc_variables) - { - int i; - - for (i = 0; i < nv_dim[0]; i++) - { - struct means_proc *v_inf = &v_dim[0][i]->p.mns; - - if (v_inf->min == SYSMIS) - { - msg (SE, _("Variable %s specified on TABLES or " - "CROSSBREAK, but not specified on " - "VARIABLES."), - v_dim[0][i]->name); - return 0; - } - - if (n_dim == 1) - { - v_inf->min = (int) v_inf->min; - v_inf->max = (int) v_inf->max; - } else { - if (v_inf->min == LOWEST || v_inf->max == HIGHEST) - { - msg (SE, _("LOWEST and HIGHEST may not be used " - "for independent variables (%s)."), - v_dim[0][i]->name); - return 0; - } - if (v_inf->min != (int) v_inf->min - || v_inf->max != (int) v_inf->max) - { - msg (SE, _("Independent variables (%s) may not " - "have noninteger endpoints in their " - "ranges."), - v_dim[0][i]->name); - return 0; - } - } - } - } } 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) - hsh_destroy (temp_dict.name_tab); - + var_set_destroy (var_set); return 1; -} - -/* Parse CROSSBREAK subcommand. */ -static int -mns_custom_crossbreak (struct cmd_means *cmd) -{ - return mns_custom_tables (cmd); -} - -/* Parses the VARIABLES subcommand. */ -static int -mns_custom_variables (struct cmd_means *cmd) -{ - if (cmd->sbc_tables) - { - msg (SE, _("VARIABLES must precede TABLES.")); - return 0; - } - if (cmd->sbc_variables == 1) - { - int i; - - for (i = 0; i < default_dict.nvar; i++) - default_dict.var[i]->p.mns.min = SYSMIS; - } - - do - { - int orig_n = n_var; - - double min, max; - - if (!parse_variables (&default_dict, &v_var, &n_var, - PV_APPEND | PV_NO_DUPLICATE | PV_NO_SCRATCH)) - return 0; - - if (!lex_force_match ('(')) - return 0; - - /* Lower value. */ - if (token == T_ID - && (!strcmp (tokid, "LO") || lex_id_match ("LOWEST", tokid))) - min = LOWEST; - else - { - if (!lex_force_num ()) - return 0; - min = tokval; - } - lex_get (); - - lex_match (','); - - /* Higher value. */ - if (token == T_ID - && (!strcmp (tokid, "HI") || lex_id_match ("HIGHEST", tokid))) - max = HIGHEST; - else - { - if (!lex_force_num ()) - return 0; - max = tokval; - } - lex_get (); - - if (!lex_force_match (')')) - return 0; - - /* Range check. */ - if (max < min) - { - msg (SE, _("Upper value (%g) is less than lower value " - "(%g) on VARIABLES subcommand."), max, min); - return 0; - } - - { - int i; - - for (i = orig_n; i < n_var; i++) - { - struct means_proc *v_inf = &v_var[i]->p.mns; - - v_inf->min = min; - v_inf->max = max; - } - } - } - while (token != '/' && token != '.'); - - return 1; -} - -#if DEBUGGING -static void -debug_print (struct cmd_means *cmd) -{ - int i; - - printf ("MEANS"); - - if (cmd->sbc_variables) - { - int j = 0; - - printf (" VARIABLES="); - for (i = 0; i < default_dict.nvar; i++) - { - struct variable *v = default_dict.var[i]; - - if (v->p.mns.min == SYSMIS) - continue; - if (j++) - printf (" "); - printf ("%s(", v->name); - if (v->p.mns.min == LOWEST) - printf ("LO"); - else - printf ("%g", v->p.mns.min); - printf (","); - if (v->p.mns.max == HIGHEST) - printf ("HI"); - else - printf ("%g", v->p.mns.max); - printf (")"); - } - printf ("\n"); - } - - printf (" TABLES="); - for (i = 0; i < n_dim; i++) - { - int j; - - if (i) - printf (" BY"); - - for (j = 0; j < nv_dim[i]; j++) - { - if (i || j) - printf (" "); - printf (v_dim[i][j]->name); - } - } - printf ("\n"); + lossage: + var_set_destroy (var_set); + return 0; } -#endif /* DEBUGGING */ /* Local Variables: