X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Faggregate.c;h=03117a5e6135ce4b30ac1eee01e0529654c450af;hb=bc37c3f489947cf081a930a5d4e58dbd133eb563;hp=241ad7c13c81e95e725672f54a0c31e68aab27fc;hpb=086322fd8c85a303ba6f552950d6f057f2867add;p=pspp diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c index 241ad7c13c..03117a5e61 100644 --- a/src/language/stats/aggregate.c +++ b/src/language/stats/aggregate.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010, 2011, 2012, 2014 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 @@ -25,10 +25,10 @@ #include "data/casegrouper.h" #include "data/casereader.h" #include "data/casewriter.h" +#include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" #include "data/format.h" -#include "data/procedure.h" #include "data/settings.h" #include "data/subcase.h" #include "data/sys-file-writer.h" @@ -39,15 +39,17 @@ #include "language/lexer/variable-parser.h" #include "language/stats/sort-criteria.h" #include "libpspp/assertion.h" +#include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/str.h" #include "math/moments.h" +#include "math/percentiles.h" #include "math/sort.h" #include "math/statistic.h" -#include "math/percentiles.h" +#include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" @@ -181,7 +183,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) lex_match (lexer, T_EQUALS); if (!lex_match (lexer, T_ASTERISK)) { - out_file = fh_parse (lexer, FH_REF_FILE | FH_REF_SCRATCH); + out_file = fh_parse (lexer, FH_REF_FILE, dataset_session (ds)); if (out_file == NULL) goto error; } @@ -207,7 +209,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) if ( agr.add_variables ) agr.dict = dict_clone (dict); else - agr.dict = dict_create (); + agr.dict = dict_create (dict_get_encoding (dict)); dict_set_label (agr.dict, dict_get_label (dict)); dict_set_documents (agr.dict, dict_get_documents (dict)); @@ -222,7 +224,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) lex_match (lexer, T_EQUALS); if (!lex_match_id (lexer, "COLUMNWISE")) { - lex_error (lexer, _("expecting %s"), "COLUMNWISE"); + lex_error_expecting (lexer, "COLUMNWISE", NULL); goto error; } agr.missing = COLUMNWISE; @@ -274,7 +276,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) if (out_file == NULL) { - /* The active file will be replaced by the aggregated data, + /* The active dataset will be replaced by the aggregated data, so TEMPORARY is moot. */ proc_cancel_temporary_transformations (ds); proc_discard_output (ds); @@ -331,8 +333,8 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) else { dump_aggregate_info (&agr, output, c); - case_unref (c); } + case_unref (c); } if (!casegrouper_destroy (grouper)) goto error; @@ -350,7 +352,8 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) if (next_input == NULL) goto error; - proc_set_active_file (ds, next_input, agr.dict); + dataset_set_dict (ds, agr.dict); + dataset_set_source (ds, next_input); agr.dict = NULL; } else @@ -416,7 +419,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, { size_t n_dest_prev = n_dest; - if (!parse_DATA_LIST_vars (lexer, &dest, &n_dest, + if (!parse_DATA_LIST_vars (lexer, dict, &dest, &n_dest, (PV_APPEND | PV_SINGLE | PV_NO_SCRATCH | PV_NO_DUPLICATE))) goto error; @@ -434,14 +437,8 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, if (lex_is_string (lexer)) { - /* XXX check re-encoded length */ - struct string label; - ds_init_substring (&label, lex_tokss (lexer)); - - ds_truncate (&label, 255); - dest_label[n_dest - 1] = ds_xstrdup (&label); + dest_label[n_dest - 1] = xstrdup (lex_tokcstr (lexer)); lex_get (lexer); - ds_destroy (&label); } } @@ -456,7 +453,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, exclude = ds_chomp_byte (&function_name, '.') ? MV_SYSTEM : MV_ANY; for (function = agr_func_tab; function->name; function++) - if (!strcasecmp (function->name, ds_cstr (&function_name))) + if (!c_strcasecmp (function->name, ds_cstr (&function_name))) break; if (NULL == function->name) { @@ -473,7 +470,6 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, { if (function->src_vars == AGR_SV_YES) { - lex_force_match (lexer, T_LPAREN); goto error; } } @@ -502,7 +498,9 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, lex_match (lexer, T_COMMA); if (lex_is_string (lexer)) { - arg[i].c = ss_xstrdup (lex_tokss (lexer)); + arg[i].c = recode_string (dict_get_encoding (agr->dict), + "UTF-8", lex_tokcstr (lexer), + -1); type = VAL_STRING; } else if (lex_is_number (lexer)) @@ -811,6 +809,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) iter->int1 = 1; break; case MAX | FSTRING: + /* Need to do some kind of Unicode collation thingy here */ if (memcmp (iter->string, value_str (v, src_width), src_width) < 0) memcpy (iter->string, value_str (v, src_width), src_width); iter->int1 = 1;