projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix memory leak in data_in
[pspp]
/
src
/
language
/
stats
/
aggregate.c
diff --git
a/src/language/stats/aggregate.c
b/src/language/stats/aggregate.c
index 08d2f5e15c7d06176f1787b5e81017c7da54ad83..42f330d5d21a64b141a963b82ce1bbcae49a7c3e 100644
(file)
--- a/
src/language/stats/aggregate.c
+++ b/
src/language/stats/aggregate.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* 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
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. */
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, '=');
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++)
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;
/* 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,
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. */
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)
}
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)
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);
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);
}
free (iter);
}
@@
-965,20
+966,20
@@
dump_aggregate_info (struct agr_proc *agr, struct casewriter *output)
case MEDIAN:
{
struct casereader *sorted_reader;
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);
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);
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:
}
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)
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)
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);
subcase_init_var (&ordering, iter->subject, SC_ASCEND);
iter->writer = sort_create_writer (&ordering, proto);