X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fcasegrouper.c;h=75925650f277ad8fbdf0f83b548eebb217b9138f;hb=1fe087cbcce6a9eb41928b7af6b58c7a2aac47f8;hp=8a4f05b318faa2874dab7d1e695a9d9901ab94c6;hpb=43b1296aafe7582e7dbe6c2b6a8b478d7d9b0fcf;p=pspp diff --git a/src/data/casegrouper.c b/src/data/casegrouper.c index 8a4f05b318..75925650f2 100644 --- a/src/data/casegrouper.c +++ b/src/data/casegrouper.c @@ -20,10 +20,10 @@ #include -#include #include #include #include +#include #include #include "xalloc.h" @@ -110,9 +110,18 @@ casegrouper_get_next_group (struct casegrouper *grouper, { if (grouper->reader != NULL) { - *reader = grouper->reader; - grouper->reader = NULL; - return true; + if (!casereader_is_empty (grouper->reader)) + { + *reader = grouper->reader; + grouper->reader = NULL; + return true; + } + else + { + casereader_destroy (grouper->reader); + grouper->reader = NULL; + return false; + } } else { @@ -150,13 +159,6 @@ casegrouper_destroy (struct casegrouper *grouper) /* Casegrouper based on equal values of variables from case to case. */ -/* Casegrouper based on equal variables. */ -struct casegrouper_vars - { - const struct variable **vars; /* Variables to compare. */ - size_t var_cnt; /* Number of variables. */ - }; - static bool casegrouper_vars_same_group (const struct ccase *, const struct ccase *, void *); @@ -171,15 +173,12 @@ casegrouper_create_vars (struct casereader *reader, const struct variable *const *vars, size_t var_cnt) { - if (var_cnt > 0) + if (var_cnt > 0) { - struct casegrouper_vars *cv = xmalloc (sizeof *cv); - cv->vars = xmemdup (vars, sizeof *vars * var_cnt); - cv->var_cnt = var_cnt; - return casegrouper_create_func (reader, - casegrouper_vars_same_group, - casegrouper_vars_destroy, - cv); + struct subcase *sc = xmalloc (sizeof *sc); + subcase_init_vars (sc, vars, var_cnt); + return casegrouper_create_func (reader, casegrouper_vars_same_group, + casegrouper_vars_destroy, sc); } else return casegrouper_create_func (reader, NULL, NULL, NULL); @@ -201,39 +200,41 @@ casegrouper_create_splits (struct casereader *reader, /* Creates and returns a casegrouper that reads data from READER and breaks it into contiguous groups of cases that have equal - values for the variables used for sorting in CO. If CO is - empty (contains no sort keys), then all the cases will be put + values for the variables used for sorting in SC. If SC is + empty (contains no fields), then all the cases will be put into a single group. */ struct casegrouper * -casegrouper_create_case_ordering (struct casereader *reader, - const struct case_ordering *co) +casegrouper_create_subcase (struct casereader *reader, + const struct subcase *sc) { - const struct variable **vars; - size_t var_cnt; - struct casegrouper *grouper; - - case_ordering_get_vars (co, &vars, &var_cnt); - grouper = casegrouper_create_vars (reader, vars, var_cnt); - free (vars); - - return grouper; + if (subcase_get_n_fields (sc) > 0) + { + struct subcase *sc_copy = xmalloc (sizeof *sc); + subcase_clone (sc_copy, sc); + return casegrouper_create_func (reader, casegrouper_vars_same_group, + casegrouper_vars_destroy, sc_copy); + } + else + return casegrouper_create_func (reader, NULL, NULL, NULL); } /* "same_group" function for an equal-variables casegrouper. */ static bool casegrouper_vars_same_group (const struct ccase *a, const struct ccase *b, - void *cv_) + void *sc_) { - struct casegrouper_vars *cv = cv_; - return case_compare (a, b, cv->vars, cv->var_cnt) == 0; + struct subcase *sc = sc_; + return subcase_equal (sc, a, sc, b); } /* "destroy" for an equal-variables casegrouper. */ static void -casegrouper_vars_destroy (void *cv_) +casegrouper_vars_destroy (void *sc_) { - struct casegrouper_vars *cv = cv_; - free (cv->vars); - free (cv); + struct subcase *sc = sc_; + if (sc != NULL) + { + subcase_destroy (sc); + free (sc); + } } -