X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput%2Fcharts%2Fbarchart.c;h=f9877940043259697b3c6903bd8fa1fa91d32f43;hb=ff79bb95e5c3de40d359a60214ece51db8561d3e;hp=1b7e83ca4fc1978d62e43acc70c6bffc8c544786;hpb=738cf48684a7dfd5551b113b8245ec8c5ba11c35;p=pspp diff --git a/src/output/charts/barchart.c b/src/output/charts/barchart.c index 1b7e83ca4f..f987794004 100644 --- a/src/output/charts/barchart.c +++ b/src/output/charts/barchart.c @@ -24,7 +24,7 @@ #include "libpspp/cast.h" #include "libpspp/str.h" #include "libpspp/array.h" -#include "output/chart-item-provider.h" +#include "output/chart-provider.h" #include "gl/xalloc.h" #include "data/variable.h" @@ -43,6 +43,19 @@ compare_category_3way (const void *a_, const void *b_, const void *bc_) } +static int +compare_category_by_index_3way (const void *a_, const void *b_, + const void *unused UNUSED) +{ + const struct category *const*a = a_; + const struct category *const*b = b_; + + if ( (*a)->idx < (*b)->idx) + return -1; + + return ((*a)->idx > (*b)->idx); +} + static unsigned int hash_freq_2level_ptr (const void *a_, const void *bc_) { @@ -97,10 +110,21 @@ barchart_dump (const struct barchart *bc, FILE *fp) fprintf (fp, "Categories:\n"); struct category *cat; + struct category **cats = XCALLOC (hmap_count (&bc->primaries), struct category *); + int i = 0; HMAP_FOR_EACH (cat, struct category, node, &bc->primaries) { - fprintf (fp, " %d \"%s\"\n", cat->idx, ds_cstr(&cat->label)); + cats[i++] = cat; + } + /* HMAP_FOR_EACH is not guaranteed to iterate in any particular order. So + we must sort here before we output the results. */ + sort (cats, i, sizeof (struct category *), compare_category_by_index_3way, bc); + for (i = 0; i < hmap_count (&bc->primaries); ++i) + { + const struct category *c = cats[i]; + fprintf (fp, " %d \"%s\"\n", c->idx, ds_cstr (&c->label)); } + free (cats); if (bc->ss) { @@ -146,7 +170,7 @@ barchart_dump (const struct barchart *bc, FILE *fp) CATS are the counts of the values of those variables. N_CATS is the number of distinct values. */ -struct chart_item * +struct chart * barchart_create (const struct variable **var, int n_vars, const char *ylabel, bool percent, struct freq *const *cats, int n_cats) @@ -167,7 +191,7 @@ barchart_create (const struct variable **var, int n_vars, bar->var = var; bar->n_vars = n_vars; bar->n_nzcats = n_cats; - chart_item_init (&bar->chart_item, &barchart_class, var_to_string (var[pidx])); + chart_init (&bar->chart, &barchart_class, var_to_string (var[pidx])); bar->largest = -1; bar->ylabel = strdup (ylabel); @@ -317,7 +341,7 @@ barchart_create (const struct variable **var, int n_vars, if (settings_get_testing_mode ()) barchart_dump (bar, stdout); - return &bar->chart_item; + return &bar->chart; } static void @@ -337,9 +361,9 @@ destroy_cat_map (struct hmap *m) } static void -barchart_destroy (struct chart_item *chart_item) +barchart_destroy (struct chart *chart) { - struct barchart *bar = to_barchart (chart_item); + struct barchart *bar = to_barchart (chart); int i; @@ -360,7 +384,7 @@ barchart_destroy (struct chart_item *chart_item) free (bar); } -const struct chart_item_class barchart_class = +const struct chart_class barchart_class = { barchart_destroy };