/*
PSPP - a program for statistical analysis.
Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2014, 2015 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
the Free Software Foundation, either version 3 of the License, or
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
FRQ_PERCENT
};
-enum sortprops
+enum sortprops
{
FRQ_AFREQ,
FRQ_DFREQ,
static void calc_stats (const struct var_freqs *vf, double d[FRQ_ST_count]);
-static void do_piechart(const struct frq_chart *pie,
+static void do_piechart(const struct frq_chart *pie,
const struct variable *var,
const struct freq_tab *frq_tab);
const struct variable **var,
const struct freq_tab *frq_tab);
-static void dump_statistics (const struct frq_proc *frq,
+static void dump_statistics (const struct frq_proc *frq,
const struct var_freqs *vf,
const struct variable *wv);
frq.vars = NULL;
frq.n_vars = 0;
-
- frq.stats = BIT_INDEX (FRQ_ST_MEAN)
- | BIT_INDEX (FRQ_ST_STDDEV)
+
+ frq.stats = BIT_INDEX (FRQ_ST_MEAN)
+ | BIT_INDEX (FRQ_ST_STDDEV)
| BIT_INDEX (FRQ_ST_MINIMUM)
| BIT_INDEX (FRQ_ST_MAXIMUM);
if (lex_match_id (lexer, "STATISTICS"))
{
- frq.stats = BIT_INDEX (FRQ_ST_MEAN)
- | BIT_INDEX (FRQ_ST_STDDEV)
+ frq.stats = BIT_INDEX (FRQ_ST_MEAN)
+ | BIT_INDEX (FRQ_ST_STDDEV)
| BIT_INDEX (FRQ_ST_MINIMUM)
| BIT_INDEX (FRQ_ST_MAXIMUM);
-
+
frq.n_stats = 4;
if (lex_match (lexer, T_EQUALS))
{
if (lex_match_id (lexer, "DEFAULT"))
{
- frq.stats = BIT_INDEX (FRQ_ST_MEAN)
- | BIT_INDEX (FRQ_ST_STDDEV)
+ frq.stats = BIT_INDEX (FRQ_ST_MEAN)
+ | BIT_INDEX (FRQ_ST_STDDEV)
| BIT_INDEX (FRQ_ST_MINIMUM)
| BIT_INDEX (FRQ_ST_MAXIMUM);
}
else if (lex_match_id (lexer, "VARIANCE"))
{
- frq.stats |= BIT_INDEX (FRQ_ST_MEAN);
+ frq.stats |= BIT_INDEX (FRQ_ST_VARIANCE);
frq.n_stats++;
}
else if (lex_match_id (lexer, "KURTOSIS"))
if (lex_force_num (lexer))
{
frq.percentiles =
- xrealloc (frq.percentiles,
+ xrealloc (frq.percentiles,
(frq.n_percentiles + 1)
* sizeof (*frq.percentiles));
frq.percentiles[frq.n_percentiles].p = lex_number (lexer) / 100.0;
for (i = 0; i < n + 1; ++i)
{
frq.percentiles =
- xrealloc (frq.percentiles,
+ xrealloc (frq.percentiles,
(frq.n_percentiles + 1)
* sizeof (*frq.percentiles));
frq.percentiles[frq.n_percentiles].p =
lex_error (lexer, _("Histogram frequency must be greater than zero."));
}
lex_get (lexer);
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
}
}
lex_error (lexer, _("Histogram percentage must be greater than zero."));
}
lex_get (lexer);
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
}
}
else if (lex_match_id (lexer, "MINIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
hi_min = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else if (lex_match_id (lexer, "MAXIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
hi_max = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else
{
{
if (lex_match_id (lexer, "MINIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
pie_min = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else if (lex_match_id (lexer, "MAXIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
pie_max = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else if (lex_match_id (lexer, "MISSING"))
{
{
if (lex_match_id (lexer, "MINIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
bar_min = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else if (lex_match_id (lexer, "MAXIMUM"))
{
- lex_force_match (lexer, T_LPAREN);
+ if (! lex_force_match (lexer, T_LPAREN))
+ goto error;
if (lex_force_num (lexer))
{
bar_max = lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
else if (lex_match_id (lexer, "FREQ"))
{
lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
bar_freq = true;
}
lex_number (lexer);
lex_get (lexer);
}
- lex_force_match (lexer, T_RPAREN);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
}
bar_freq = false;
}
if (frq.stats & BIT_INDEX (FRQ_ST_MEDIAN))
{
frq.percentiles =
- xrealloc (frq.percentiles,
+ xrealloc (frq.percentiles,
(frq.n_percentiles + 1)
* sizeof (*frq.percentiles));
-
+
frq.percentiles[frq.n_percentiles].p = 0.50;
frq.percentiles[frq.n_percentiles].show = true;
frq.n_percentiles++;
+ frq.n_show_percentiles++;
}
msg (SE, _("%s for histogram must be greater than or equal to %s, "
"but %s was specified as %.15g and %s as %.15g. "
"%s and %s will be ignored."),
- "MAX", "MIN",
- "MIN", hist->x_min,
+ "MAX", "MIN",
+ "MIN", hist->x_min,
"MAX", hist->x_max,
"MIN", "MAX");
hist->x_min = hist->x_max = SYSMIS;
}
frq.percentiles =
- xrealloc (frq.percentiles,
+ xrealloc (frq.percentiles,
(frq.n_percentiles + 2)
* sizeof (*frq.percentiles));
-
+
frq.percentiles[frq.n_percentiles].p = 0.25;
frq.percentiles[frq.n_percentiles].show = false;
frq.percentiles[frq.n_percentiles + 1].p = 0.75;
frq.percentiles[frq.n_percentiles + 1].show = false;
-
+
frq.n_percentiles+=2;
}
{
msg (SE, _("%s for pie chart must be greater than or equal to %s, "
"but %s was specified as %.15g and %s as %.15g. "
- "%s and %s will be ignored."),
- "MAX", "MIN",
+ "%s and %s will be ignored."),
+ "MAX", "MIN",
"MIN", pie->x_min,
"MAX", pie->x_max,
"MIN", "MAX");
int i,o;
double previous_p = -1;
qsort (frq.percentiles, frq.n_percentiles,
- sizeof (*frq.percentiles),
+ sizeof (*frq.percentiles),
ptile_3way);
frq.n_show_percentiles = 0;
for (i = o = 0; i < frq.n_percentiles; ++i)
{
- frq.percentiles[o].p = frq.percentiles[i].p;
-
- if (frq.percentiles[i].show)
- frq.percentiles[o].show = true;
-
- if (frq.percentiles[i].p != previous_p)
- {
- if (frq.percentiles[i].show)
- frq.n_show_percentiles++;
-
- o++;
- }
-
+ if (frq.percentiles[i].p != previous_p)
+ {
+ frq.percentiles[o].p = frq.percentiles[i].p;
+ frq.percentiles[o].show = frq.percentiles[i].show;
+ if (frq.percentiles[i].show)
+ frq.n_show_percentiles++;
+ o++;
+ }
+ else if (frq.percentiles[i].show &&
+ !frq.percentiles[o].show)
+ {
+ frq.percentiles[o].show = true;
+ frq.n_show_percentiles++;
+ }
previous_p = frq.percentiles[i].p;
}
int n_slices = 0;
int i;
struct freq *slices = xnmalloc (frq_tab->n_valid + frq_tab->n_missing, sizeof *slices);
-
+
for (i = 0; i < frq_tab->n_valid; i++)
{
const struct freq *f = &frq_tab->valid[i];
if (f->count < catchart->x_min)
continue;
-
+
slices[n_slices] = *f;
-
+
n_slices++;
}
{
const struct freq *f = &frq_tab->missing[i];
slices[n_slices].count += f->count;
-
+
if (i == 0)
slices[n_slices].values[0] = f->values[0];
}
-
+
if (frq_tab->n_missing > 0)
n_slices++;
}
int n_slices = 0;
int i;
struct freq **slices = xnmalloc (frq_tab->n_valid + frq_tab->n_missing, sizeof *slices);
-
+
for (i = 0; i < frq_tab->n_valid; i++)
{
struct freq *f = &frq_tab->valid[i];
if (f->count < catchart->x_min)
continue;
-
+
slices[n_slices] = f;
-
+
n_slices++;
}
}
slices[n_slices]->count += f->count;
-
+
}
}
struct freq **slices = pick_cat_counts_ptr (bar, frq_tab, &n_slices);
chart_item_submit (barchart_create (var, 1,
- (bar->y_scale == FRQ_FREQ) ? _("Count") : _("Percent"),
+ (bar->y_scale == FRQ_FREQ) ? _("Count") : _("Percent"),
(bar->y_scale == FRQ_PERCENT),
slices, n_slices));
free (slices);