projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
SORT CASES: Convert tests to Autotest framework.
[pspp-builds.git]
/
src
/
language
/
stats
/
aggregate.c
diff --git
a/src/language/stats/aggregate.c
b/src/language/stats/aggregate.c
index 7430b819e90a2889aa4cb57be6575b180293335a..a8e3f6d71d267545b1d1d85ef60490433149c0f8 100644
(file)
--- a/
src/language/stats/aggregate.c
+++ b/
src/language/stats/aggregate.c
@@
-87,16
+87,6
@@
struct agr_var
struct casewriter *writer;
};
struct casewriter *writer;
};
-/* Aggregation functions. */
-enum
- {
- SUM, MEAN, MEDIAN, SD, MAX, MIN, PGT, PLT, PIN, POUT, FGT, FLT, FIN,
- FOUT, N, NU, NMISS, NUMISS, FIRST, LAST,
-
- FUNC = 0x1f, /* Function mask. */
- FSTRING = 1<<5, /* String function bit. */
- };
-
/* Attributes of aggregation functions. */
const struct agr_func agr_func_tab[] =
/* Attributes of aggregation functions. */
const struct agr_func agr_func_tab[] =
@@
-232,7
+222,7
@@
cmd_aggregate (struct lexer *lexer, struct dataset *ds)
lex_match (lexer, '=');
if (!lex_match_id (lexer, "COLUMNWISE"))
{
lex_match (lexer, '=');
if (!lex_match_id (lexer, "COLUMNWISE"))
{
- lex_error (lexer, _("
while expecting COLUMNWISE")
);
+ lex_error (lexer, _("
expecting %s"), "COLUMNWISE"
);
goto error;
}
agr.missing = COLUMNWISE;
goto error;
}
agr.missing = COLUMNWISE;
@@
-241,7
+231,7
@@
cmd_aggregate (struct lexer *lexer, struct dataset *ds)
copy_documents = true;
else if (lex_match_id (lexer, "PRESORTED"))
presorted = true;
copy_documents = true;
else if (lex_match_id (lexer, "PRESORTED"))
presorted = true;
- else if (lex_match_id (lexer, "BREAK"))
+ else if (lex_
force_
match_id (lexer, "BREAK"))
{
int i;
{
int i;
@@
-259,10
+249,8
@@
cmd_aggregate (struct lexer *lexer, struct dataset *ds)
break;
}
else
break;
}
else
- {
- lex_error (lexer, _("expecting BREAK"));
- goto error;
- }
+ goto error;
+
}
if (presorted && saw_direction)
msg (SW, _("When PRESORTED is specified, specifying sorting directions "
}
if (presorted && saw_direction)
msg (SW, _("When PRESORTED is specified, specifying sorting directions "
@@
-444,7
+432,7
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
- if (lex_
token (lexer) == T_STRING
)
+ if (lex_
is_string (lexer)
)
{
struct string label;
ds_init_string (&label, lex_tokstr (lexer));
{
struct string label;
ds_init_string (&label, lex_tokstr (lexer));
@@
-463,14
+451,8
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
goto error;
}
goto error;
}
- exclude = MV_ANY;
-
ds_assign_string (&function_name, lex_tokstr (lexer));
ds_assign_string (&function_name, lex_tokstr (lexer));
-
- ds_chomp (&function_name, '.');
-
- if (lex_tokid(lexer)[strlen (lex_tokid (lexer)) - 1] == '.')
- exclude = MV_SYSTEM;
+ exclude = ds_chomp (&function_name, '.') ? MV_SYSTEM : MV_ANY;
for (function = agr_func_tab; function->name; function++)
if (!strcasecmp (function->name, ds_cstr (&function_name)))
for (function = agr_func_tab; function->name; function++)
if (!strcasecmp (function->name, ds_cstr (&function_name)))
@@
-490,7
+472,7
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
{
if (function->src_vars == AGR_SV_YES)
{
{
if (function->src_vars == AGR_SV_YES)
{
-
lex_error (lexer, _("expecting `('")
);
+
lex_force_match (lexer, '('
);
goto error;
}
}
goto error;
}
}
@@
-517,7
+499,7
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
int type;
lex_match (lexer, ',');
int type;
lex_match (lexer, ',');
- if (lex_
token (lexer) == T_STRING
)
+ if (lex_
is_string (lexer)
)
{
arg[i].c = ds_xstrdup (lex_tokstr (lexer));
type = VAL_STRING;
{
arg[i].c = ds_xstrdup (lex_tokstr (lexer));
type = VAL_STRING;
@@
-546,11
+528,8
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
}
/* Trailing rparen. */
}
/* Trailing rparen. */
- if (!lex_match (lexer, ')'))
- {
- lex_error (lexer, _("expecting `)'"));
- goto error;
- }
+ if (!lex_force_match (lexer, ')'))
+ goto error;
/* Now check that the number of source variables match
the number of target variables. If we check earlier
/* Now check that the number of source variables match
the number of target variables. If we check earlier
@@
-637,12
+616,16
@@
parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
struct fmt_spec f;
v->src = NULL;
destvar = dict_create_var (agr->dict, dest[i], 0);
struct fmt_spec f;
v->src = NULL;
destvar = dict_create_var (agr->dict, dest[i], 0);
- if (func_index == N && dict_get_weight (dict) != NULL)
- f = fmt_for_output (FMT_F, 8, 2);
- else
- f = function->format;
- var_set_both_formats (destvar, &f);
- }
+ if (destvar != NULL)
+ {
+ if ((func_index == N || func_index == NMISS)
+ && dict_get_weight (dict) != NULL)
+ f = fmt_for_output (FMT_F, 8, 2);
+ else
+ f = function->format;
+ var_set_both_formats (destvar, &f);
+ }
+ }
if (!destvar)
{
if (!destvar)
{
@@
-1003,21
+986,22
@@
dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons
break;
case MEDIAN:
{
break;
case MEDIAN:
{
- struct casereader *sorted_reader;
- 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 (&os, 1,
- sorted_reader,
- i->weight,
- i->subject,
- i->exclude);
-
- v->f = percentile_calculate (median, PC_HAVERAGE);
-
- statistic_destroy (&median->parent.parent);
+ if ( i->writer)
+ {
+ struct percentile *median = percentile_create (0.5, i->cc);
+ struct order_stats *os = &median->parent;
+ struct casereader *sorted_reader = casewriter_make_reader (i->writer);
+ i->writer = NULL;
+
+ order_stats_accumulate (&os, 1,
+ sorted_reader,
+ i->weight,
+ i->subject,
+ i->exclude);
+ i->dbl[0] = percentile_calculate (median, PC_HAVERAGE);
+ statistic_destroy (&median->parent.parent);
+ }
+ v->f = i->dbl[0];
}
break;
case SD:
}
break;
case SD: