int n_percentiles, n_show_percentiles;
/* Frequency table display. */
- int max_categories; /* Maximum categories to show. */
+ long int max_categories; /* Maximum categories to show. */
int sort; /* FRQ_AVALUE or FRQ_DVALUE
or FRQ_AFREQ or FRQ_DFREQ. */
{
int i;
struct frq_proc frq;
- const struct variable **vars;
+ const struct variable **vars = NULL;
bool sbc_barchart = false;
bool sbc_piechart = false;
frq.n_stats = 4;
- frq.max_categories = INT_MAX;
+ frq.max_categories = LONG_MAX;
frq.percentiles = NULL;
frq.n_percentiles = 0;
{
frq.max_categories = 0;
}
+ else if (lex_match_id (lexer, "LIMIT"))
+ {
+ if (!lex_force_match (lexer, T_LPAREN)
+ || !lex_force_int (lexer))
+ goto error;
+
+ frq.max_categories = lex_integer (lexer);
+ lex_get (lexer);
+
+ if (!lex_force_match (lexer, T_RPAREN))
+ goto error;
+ }
else if (lex_match_id (lexer, "AVALUE"))
{
frq.sort = FRQ_AVALUE;
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;
}
}
}
}
+ else if (lex_match_id (lexer, "ORDER"))
+ {
+ lex_match (lexer, T_EQUALS);
+ if (!lex_match_id (lexer, "ANALYSIS"))
+ lex_match_id (lexer, "VARIABLE");
+ }
else
{
lex_error (lexer, NULL);
frq.percentiles[frq.n_percentiles].show = true;
frq.n_percentiles++;
+ frq.n_show_percentiles++;
}
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;
}
{
struct ccase *c;
precalc (&frq, group, ds);
+
for (; (c = casereader_read (group)) != NULL; case_unref (c))
calc (&frq, c, ds);
postcalc (&frq, ds);
+ casereader_destroy (group);
}
ok = casegrouper_destroy (grouper);
ok = proc_commit (ds) && ok;
}
+ free (vars);
+ free (frq.vars);
+ free (frq.bar);
+ free (frq.pie);
+ free (frq.hist);
+ free (frq.percentiles);
+ pool_destroy (frq.pool);
+
return CMD_SUCCESS;
error:
+ free (vars);
+ free (frq.vars);
+ free (frq.bar);
+ free (frq.pie);
+ free (frq.hist);
+ free (frq.percentiles);
+ pool_destroy (frq.pool);
+
return CMD_FAILURE;
}
}
}
+ if (valid_freq <= 0)
+ return NULL;
iqr = calculate_iqr (frq);
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);
}