X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffrequencies.c;h=dc18ed83c79589cf3c028cc872e84fb934dabfe8;hb=72fa53029f0a25e767b07a0ae46a0d6f4a74f4d7;hp=cd131f514b29afc3c2cdfdcc16bda2f5a882b2f7;hpb=37ff86424a5aa6c4c22a0fd4d8c59d7ce28bc2bf;p=pspp diff --git a/src/language/stats/frequencies.c b/src/language/stats/frequencies.c index cd131f514b..dc18ed83c7 100644 --- a/src/language/stats/frequencies.c +++ b/src/language/stats/frequencies.c @@ -214,7 +214,7 @@ struct frq_proc 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. */ @@ -580,7 +580,7 @@ cmd_frequencies (struct lexer *lexer, struct dataset *ds) { int i; struct frq_proc frq; - const struct variable **vars; + const struct variable **vars = NULL; bool sbc_barchart = false; bool sbc_piechart = false; @@ -614,7 +614,7 @@ cmd_frequencies (struct lexer *lexer, struct dataset *ds) frq.n_stats = 4; - frq.max_categories = INT_MAX; + frq.max_categories = LONG_MAX; frq.percentiles = NULL; frq.n_percentiles = 0; @@ -803,6 +803,18 @@ cmd_frequencies (struct lexer *lexer, struct dataset *ds) { 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; @@ -1213,19 +1225,37 @@ cmd_frequencies (struct lexer *lexer, struct dataset *ds) { 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; } @@ -1447,7 +1477,8 @@ do_barchart(const struct frq_chart *bar, const struct variable **var, 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); }