X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Faggregate.c;h=965e6e3903d420fc044f9d038671dab840ff03f8;hb=75ac1e869e551495c403cf94a3a24dd0dfee98ef;hp=2a4eda87ad042092f81d3eccd93c4bb46c2f4025;hpb=9ade26c8349b4434008c46cf09bc7473ec743972;p=pspp diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c index 2a4eda87ad..965e6e3903 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" @@ -49,6 +49,7 @@ #include "math/sort.h" #include "math/statistic.h" +#include "gl/c-strcase.h" #include "gl/minmax.h" #include "gl/xalloc.h" @@ -182,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; } @@ -205,10 +206,10 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) goto error; } - if ( agr.add_variables ) + 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)); @@ -223,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"); goto error; } agr.missing = COLUMNWISE; @@ -275,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); @@ -311,7 +312,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) initialize_aggregate_info (&agr); - if ( agr.add_variables ) + if (agr.add_variables) placeholder = casereader_clone (group); { @@ -332,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; @@ -351,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 @@ -451,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) { @@ -468,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; } } @@ -637,8 +638,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, free (dest[i]); if (dest_label[i]) - var_set_label (destvar, dest_label[i], - dict_get_encoding (agr->dict), true); + var_set_label (destvar, dest_label[i]); v->dest = destvar; } @@ -733,7 +733,7 @@ agr_destroy (struct agr_proc *agr) free (iter); } if (agr->dict != NULL) - dict_destroy (agr->dict); + dict_unref (agr->dict); } /* Execution. */ @@ -810,8 +810,8 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) 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); + if (memcmp (iter->string, v->s, src_width) < 0) + memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case MIN: @@ -819,8 +819,8 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) iter->int1 = 1; break; case MIN | FSTRING: - if (memcmp (iter->string, value_str (v, src_width), src_width) > 0) - memcpy (iter->string, value_str (v, src_width), src_width); + if (memcmp (iter->string, v->s, src_width) > 0) + memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case FGT: @@ -831,8 +831,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) break; case FGT | FSTRING: case PGT | FSTRING: - if (memcmp (iter->arg[0].c, - value_str (v, src_width), src_width) < 0) + if (memcmp (iter->arg[0].c, v->s, src_width) < 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; @@ -844,8 +843,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) break; case FLT | FSTRING: case PLT | FSTRING: - if (memcmp (iter->arg[0].c, - value_str (v, src_width), src_width) > 0) + if (memcmp (iter->arg[0].c, v->s, src_width) > 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; @@ -857,10 +855,8 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) break; case FIN | FSTRING: case PIN | FSTRING: - if (memcmp (iter->arg[0].c, - value_str (v, src_width), src_width) <= 0 - && memcmp (iter->arg[1].c, - value_str (v, src_width), src_width) >= 0) + if (memcmp (iter->arg[0].c, v->s, src_width) <= 0 + && memcmp (iter->arg[1].c, v->s, src_width) >= 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; @@ -872,10 +868,8 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) break; case FOUT | FSTRING: case POUT | FSTRING: - if (memcmp (iter->arg[0].c, - value_str (v, src_width), src_width) > 0 - || memcmp (iter->arg[1].c, - value_str (v, src_width), src_width) < 0) + if (memcmp (iter->arg[0].c, v->s, src_width) > 0 + || memcmp (iter->arg[1].c, v->s, src_width) < 0) iter->dbl[0] += weight; iter->dbl[1] += weight; break; @@ -897,7 +891,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) case FIRST | FSTRING: if (iter->int1 == 0) { - memcpy (iter->string, value_str (v, src_width), src_width); + memcpy (iter->string, v->s, src_width); iter->int1 = 1; } break; @@ -906,7 +900,7 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input) iter->int1 = 1; break; case LAST | FSTRING: - memcpy (iter->string, value_str (v, src_width), src_width); + memcpy (iter->string, v->s, src_width); iter->int1 = 1; break; case NMISS: @@ -940,7 +934,7 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons { struct ccase *c = case_create (dict_get_proto (agr->dict)); - if ( agr->add_variables) + if (agr->add_variables) { case_copy (c, 0, break_case, 0, dict_get_var_cnt (agr->src_dict)); } @@ -986,7 +980,7 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons break; case MEDIAN: { - if ( i->writer) + if (i->writer) { struct percentile *median = percentile_create (0.5, i->cc); struct order_stats *os = &median->parent; @@ -1024,7 +1018,7 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons case MAX | FSTRING: case MIN | FSTRING: if (i->int1) - memcpy (value_str_rw (v, width), i->string, width); + memcpy (v->s, i->string, width); else value_set_missing (v, width); break; @@ -1063,7 +1057,7 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons case FIRST | FSTRING: case LAST | FSTRING: if (i->int1) - memcpy (value_str_rw (v, width), i->string, width); + memcpy (v->s, i->string, width); else value_set_missing (v, width); break; @@ -1118,10 +1112,10 @@ initialize_aggregate_info (struct agr_proc *agr) proto = caseproto_add_width (proto, 0); proto = caseproto_add_width (proto, 0); - if ( ! iter->subject) + if (! iter->subject) iter->subject = dict_create_internal_var (0, 0); - if ( ! iter->weight) + if (! iter->weight) iter->weight = dict_create_internal_var (1, 0); subcase_init_var (&ordering, iter->subject, SC_ASCEND);