X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fsort-criteria.c;h=36466cd410f9bfdb89a2db6588fbbe6ba3c6a21d;hb=033449d465fb54526d3984d55772e6a38e7d922c;hp=bd1983dd4a305ec1c4b02ccf6a7711184f3316ea;hpb=92c09e564002d356d20fc1e2e131027ef89f6748;p=pspp diff --git a/src/language/stats/sort-criteria.c b/src/language/stats/sort-criteria.c index bd1983dd4a..36466cd410 100644 --- a/src/language/stats/sort-criteria.c +++ b/src/language/stats/sort-criteria.c @@ -1,100 +1,104 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc. +/* PSPP - a program for statistical analysis. + Copyright (C) 1997-9, 2000, 2006, 2010, 2011 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include -#include +#include "language/stats/sort-criteria.h" #include -#include -#include -#include -#include -#include -#include +#include "data/dictionary.h" +#include "data/subcase.h" +#include "data/variable.h" +#include "language/lexer/lexer.h" +#include "language/lexer/variable-parser.h" +#include "libpspp/message.h" #include "gettext.h" #define _(msgid) gettext (msgid) -/* Parses a list of sort keys and returns a struct sort_criteria - based on it. Returns a null pointer on error. +/* Parses a list of sort fields and appends them to ORDERING, + which the caller must already have initialized. + Returns true if successful, false on error. If SAW_DIRECTION is nonnull, sets *SAW_DIRECTION to true if at least one parenthesized sort direction was specified, false otherwise. */ -struct case_ordering * -parse_case_ordering (struct lexer *lexer, const struct dictionary *dict, - bool *saw_direction) +bool +parse_sort_criteria (struct lexer *lexer, const struct dictionary *dict, + struct subcase *ordering, + const struct variable ***vars, bool *saw_direction) { - struct case_ordering *ordering = case_ordering_create (dict); - struct variable **vars = NULL; - size_t var_cnt = 0; - - if (saw_direction != NULL) + const struct variable **local_vars = NULL; + size_t n_vars = 0; + + if (vars == NULL) + vars = &local_vars; + *vars = NULL; + + if (saw_direction != NULL) *saw_direction = false; do { - enum sort_direction direction; + size_t prev_n_vars = n_vars; + enum subcase_direction direction; size_t i; /* Variables. */ - free (vars); - vars = NULL; - if (!parse_variables_const (lexer, dict, &vars, &var_cnt, PV_NO_SCRATCH)) + if (!parse_variables_const (lexer, dict, vars, &n_vars, + PV_APPEND | PV_NO_SCRATCH)) goto error; /* Sort direction. */ - if (lex_match (lexer, '(')) + if (lex_match (lexer, T_LPAREN)) { if (lex_match_id (lexer, "D") || lex_match_id (lexer, "DOWN")) - direction = SRT_DESCEND; + direction = SC_DESCEND; else if (lex_match_id (lexer, "A") || lex_match_id (lexer, "UP")) - direction = SRT_ASCEND; + direction = SC_ASCEND; else { - msg (SE, _("`A' or `D' expected inside parentheses.")); - goto error; - } - if (!lex_match (lexer, ')')) - { - msg (SE, _("`)' expected.")); + lex_error_expecting (lexer, "A", "D"); goto error; } + if (!lex_force_match (lexer, T_RPAREN)) + goto error; if (saw_direction != NULL) *saw_direction = true; } else - direction = SRT_ASCEND; + direction = SC_ASCEND; - for (i = 0; i < var_cnt; i++) - if (!case_ordering_add_var (ordering, vars[i], direction)) - msg (SW, _("Variable %s specified twice in sort criteria."), - var_get_name (vars[i])); + for (i = prev_n_vars; i < n_vars; i++) + { + const struct variable *var = (*vars)[i]; + if (!subcase_add_var (ordering, var, direction)) + msg (SW, _("Variable %s specified twice in sort criteria."), + var_get_name (var)); + } } while (lex_token (lexer) == T_ID - && dict_lookup_var (dict, lex_tokid (lexer)) != NULL); + && dict_lookup_var (dict, lex_tokcstr (lexer)) != NULL); - free (vars); - return ordering; + free (local_vars); + return true; - error: - free (vars); - case_ordering_destroy (ordering); - return NULL; +error: + free (local_vars); + if (vars) + *vars = NULL; + return false; }