X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Frank.c;h=65a0fb8b574a9fb66b75031ed65332c7514e0ceb;hb=e4955eebfee4b79846bbb5ba27daaa39a02ef05c;hp=19861cc0904e05aa7cf5635ac197bd7653c8706f;hpb=2bcadd734a1045461be498f4f0d197001a983107;p=pspp diff --git a/src/language/stats/rank.c b/src/language/stats/rank.c index 19861cc090..65a0fb8b57 100644 --- a/src/language/stats/rank.c +++ b/src/language/stats/rank.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc + Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2016 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 @@ -162,7 +162,7 @@ try_new_name (const char *new_name, } /* Returns a variable name for storing ranks of a variable named SRC_NAME - accoring to the rank function F. The name chosen will not be one already in + according to the rank function F. The name chosen will not be one already in DICT or NEW_NAMES. If successful, adds the new name to NEW_NAMES and returns the name added. @@ -257,7 +257,7 @@ parse_into (struct lexer *lexer, struct rank *cmd, cmd->rs = pool_realloc (cmd->pool, cmd->rs, sizeof (*cmd->rs) * (cmd->n_rs + 1)); rs = &cmd->rs[cmd->n_rs]; - + if (lex_match_id (lexer, "RANK")) { rs->rfunc = RANK; @@ -290,13 +290,13 @@ parse_into (struct lexer *lexer, struct rank *cmd, { if ( !lex_force_match (lexer, T_LPAREN)) return false; - + if (! lex_force_int (lexer) ) return false; - + cmd->k_ntiles = lex_integer (lexer); lex_get (lexer); - + if ( !lex_force_match (lexer, T_RPAREN)) return false; @@ -304,6 +304,7 @@ parse_into (struct lexer *lexer, struct rank *cmd, } else { + lex_error (lexer, NULL); return false; } @@ -318,7 +319,7 @@ parse_into (struct lexer *lexer, struct rank *cmd, const char *name = lex_tokcstr (lexer); if ( var_count >= subcase_get_n_fields (&cmd->sc) ) - msg (SE, _("Too many variables in INTO clause.")); + msg (SE, _("Too many variables in %s clause."), "INTO"); else if ( dict_lookup_var (cmd->dict, name) != NULL ) msg (SE, _("Variable %s already exists."), name); else if (string_set_contains (new_names, name)) @@ -589,22 +590,9 @@ rank_sorted_file (struct casereader *input, } -/* Transformation function to enumerate all the cases */ -static int -create_resort_key (void *key_var_, struct ccase **cc, casenumber case_num) -{ - struct variable *key_var = key_var_; - - *cc = case_unshare (*cc); - case_data_rw (*cc, key_var)->f = case_num; - - return TRNS_CONTINUE; -} - static bool rank_cmd (struct dataset *ds, const struct rank *cmd); - static const char * fraction_name (const struct rank *cmd) { @@ -650,7 +638,7 @@ create_var_label (struct rank *cmd, const struct variable *src_var, function_name[f], var_get_name (src_var)); pool_label = pool_strdup (cmd->pool, ds_cstr (&label)); - + ds_destroy (&label); return pool_label; @@ -680,7 +668,8 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) string_set_init (&new_names); if (lex_match_id (lexer, "VARIABLES")) - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (!parse_sort_criteria (lexer, rank.dict, &rank.sc, @@ -700,10 +689,12 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) while (lex_token (lexer) != T_ENDCMD ) { - lex_force_match (lexer, T_SLASH); + if (! lex_force_match (lexer, T_SLASH)) + goto error; if (lex_match_id (lexer, "TIES")) { - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (lex_match_id (lexer, "MEAN")) { rank.ties = TIES_MEAN; @@ -728,7 +719,8 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) } else if (lex_match_id (lexer, "FRACTION")) { - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (lex_match_id (lexer, "BLOM")) { rank.fraction = FRAC_BLOM; @@ -753,7 +745,8 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) } else if (lex_match_id (lexer, "PRINT")) { - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (lex_match_id (lexer, "YES")) { rank.print = true; @@ -770,7 +763,8 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) } else if (lex_match_id (lexer, "MISSING")) { - lex_force_match (lexer, T_EQUALS); + if (! lex_force_match (lexer, T_EQUALS)) + goto error; if (lex_match_id (lexer, "INCLUDE")) { rank.exclude = MV_SYSTEM; @@ -797,8 +791,8 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) rs = pool_calloc (rank.pool, 1, sizeof *rs); rs->rfunc = RANK; - rs->dest_names = pool_calloc (rank.pool, 1, sizeof *rs->dest_names); - rs->dest_labels = pool_calloc (rank.pool, 1, sizeof *rs->dest_labels); + rs->dest_names = pool_calloc (rank.pool, rank.n_vars, + sizeof *rs->dest_names); rank.rs = rs; rank.n_rs = 1; @@ -833,7 +827,7 @@ cmd_rank (struct lexer *lexer, struct dataset *ds) { int v; - tab_output_text (0, _("Variables Created By RANK")); + tab_output_text_format (0, _("Variables Created By %s"), "RANK"); tab_output_text (0, ""); for (i = 0 ; i < rank.n_rs ; ++i ) @@ -1000,11 +994,7 @@ rank_cmd (struct dataset *ds, const struct rank *cmd) bool ok = true; int i; - /* Add a variable which we can sort by to get back the original - order */ - order_var = dict_create_var_assert (dataset_dict (ds), "$ORDER", 0); - - add_transformation (ds, create_resort_key, 0, order_var); + order_var = add_permanent_ordering_transformation (ds); /* Create output files. */ { @@ -1140,7 +1130,7 @@ rank_cmd (struct dataset *ds, const struct rank *cmd) var = dict_create_var_assert (d, rs->dest_names[i], 0); var_set_both_formats (var, &dest_format[rs->rfunc]); - var_set_label (var, rs->dest_labels[i], false); + var_set_label (var, rs->dest_labels[i]); iv->output_vars[j] = var; }