X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Faggregate.c;h=42f330d5d21a64b141a963b82ce1bbcae49a7c3e;hb=51356a3a547f953fdfe710aae94b72ac9e40e562;hp=08d2f5e15c7d06176f1787b5e81017c7da54ad83;hpb=bd17d2af982332ee1791998361b1ac6731fe14fa;p=pspp diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c index 08d2f5e15c..42f330d5d2 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 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010 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 @@ -196,6 +196,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) dict_set_documents (agr.dict, dict_get_documents (dict)); /* OUTFILE subcommand must be first. */ + lex_match (lexer, '/'); if (!lex_force_match_id (lexer, "OUTFILE")) goto error; lex_match (lexer, '='); @@ -236,8 +237,7 @@ cmd_aggregate (struct lexer *lexer, struct dataset *ds) agr.break_var_cnt = subcase_get_n_fields (&agr.sort); for (i = 0; i < agr.break_var_cnt; i++) - dict_clone_var_assert (agr.dict, agr.break_vars[i], - var_get_name (agr.break_vars[i])); + dict_clone_var_assert (agr.dict, agr.break_vars[i]); /* BREAK must follow the options. */ break; @@ -391,7 +391,8 @@ 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, - PV_APPEND | PV_SINGLE | PV_NO_SCRATCH)) + (PV_APPEND | PV_SINGLE | PV_NO_SCRATCH + | PV_NO_DUPLICATE))) goto error; /* Assign empty labels. */ @@ -581,7 +582,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict, } if (function->alpha_type == VAL_STRING) - destvar = dict_clone_var (agr->dict, v->src, dest[i]); + destvar = dict_clone_var_as (agr->dict, v->src, dest[i]); else { assert (var_is_numeric (v->src) @@ -711,8 +712,8 @@ agr_destroy (struct agr_proc *agr) else if (iter->function == SD) moments1_destroy (iter->moments); - var_destroy (iter->subject); - var_destroy (iter->weight); + dict_destroy_internal_var (iter->subject); + dict_destroy_internal_var (iter->weight); free (iter); } @@ -965,20 +966,20 @@ dump_aggregate_info (struct agr_proc *agr, struct casewriter *output) case MEDIAN: { struct casereader *sorted_reader; - struct order_stats *median = percentile_create (0.5, i->cc); + struct percentile *median = percentile_create (0.5, i->cc); + struct order_stats *os = &median->parent; sorted_reader = casewriter_make_reader (i->writer); - order_stats_accumulate (&median, 1, + order_stats_accumulate (&os, 1, sorted_reader, i->weight, i->subject, i->exclude); - v->f = percentile_calculate ((struct percentile *) median, - PC_HAVERAGE); + v->f = percentile_calculate (median, PC_HAVERAGE); - statistic_destroy ((struct statistic *) median); + statistic_destroy (&median->parent.parent); } break; case SD: @@ -1105,10 +1106,10 @@ initialize_aggregate_info (struct agr_proc *agr, const struct ccase *input) proto = caseproto_add_width (proto, 0); if ( ! iter->subject) - iter->subject = var_create_internal (0, 0); + iter->subject = dict_create_internal_var (0, 0); if ( ! iter->weight) - iter->weight = var_create_internal (1, 0); + iter->weight = dict_create_internal_var (1, 0); subcase_init_var (&ordering, iter->subject, SC_ASCEND); iter->writer = sort_create_writer (&ordering, proto);