X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdataset.c;h=931d3dcbbfb1ac1a23066719d68d4bf76f69ebff;hb=4480f216f5be2ba8795bf7fc1594c87da14a69ff;hp=c13a941ba8a169ac83c79e3f57038ddaf8c1ed9f;hpb=433baa13e773d56e6dacbdc8df8f266b4f46e7ef;p=pspp diff --git a/src/data/dataset.c b/src/data/dataset.c index c13a941ba8..931d3dcbbf 100644 --- a/src/data/dataset.c +++ b/src/data/dataset.c @@ -1026,15 +1026,14 @@ add_measurement_level_trns_proc__ (struct measurement_level_var *mlv, double val return MEASURE_UNKNOWN; } -static enum trns_result -add_measurement_level_trns_proc (void *mlt_, struct ccase **c, - casenumber case_nr UNUSED) +static void +measurement_level_trns_run (struct measurement_level_trns *mlt, + const struct ccase *c) { - struct measurement_level_trns *mlt = mlt_; for (size_t i = 0; i < mlt->n_vars; ) { struct measurement_level_var *mlv = &mlt->vars[i]; - double value = case_num (*c, mlv->var); + double value = case_num (c, mlv->var); enum measure m = add_measurement_level_trns_proc__ (mlv, value); if (m != MEASURE_UNKNOWN) { @@ -1046,6 +1045,14 @@ add_measurement_level_trns_proc (void *mlt_, struct ccase **c, else i++; } +} + +static enum trns_result +add_measurement_level_trns_proc (void *mlt_, struct ccase **c, + casenumber case_nr UNUSED) +{ + struct measurement_level_trns *mlt = mlt_; + measurement_level_trns_run (mlt, *c); return TRNS_CONTINUE; } @@ -1062,15 +1069,21 @@ add_measurement_level_trns_free__ (struct measurement_level_trns *mlt) free (mlt); } -static bool -add_measurement_level_trns_free (void *mlt_) +static void +measurement_level_trns_commit (struct measurement_level_trns *mlt) { - struct measurement_level_trns *mlt = mlt_; for (size_t i = 0; i < mlt->n_vars; i++) { struct measurement_level_var *mlv = &mlt->vars[i]; var_set_measure (mlv->var, add_measurement_level_var_interpret (mlv)); } +} + +static bool +add_measurement_level_trns_free (void *mlt_) +{ + struct measurement_level_trns *mlt = mlt_; + measurement_level_trns_commit (mlt); add_measurement_level_trns_free__ (mlt); return true; } @@ -1081,8 +1094,8 @@ static const struct trns_class add_measurement_level_trns_class = { .destroy = add_measurement_level_trns_free, }; -static void -add_measurement_level_trns (struct dataset *ds, struct dictionary *dict) +static struct measurement_level_trns * +create_measurement_level_trns (struct dictionary *dict) { struct measurement_level_var *mlvs = NULL; size_t n_mlvs = 0; @@ -1113,14 +1126,22 @@ add_measurement_level_trns (struct dataset *ds, struct dictionary *dict) hmap_init (mlv->values); } if (!n_mlvs) - return; + return NULL; struct measurement_level_trns *mlt = xmalloc (sizeof *mlt); *mlt = (struct measurement_level_trns) { .vars = mlvs, .n_vars = n_mlvs, }; - add_transformation (ds, &add_measurement_level_trns_class, mlt); + return mlt; +} + +static void +add_measurement_level_trns (struct dataset *ds, struct dictionary *dict) +{ + struct measurement_level_trns *mlt = create_measurement_level_trns (dict); + if (mlt) + add_transformation (ds, &add_measurement_level_trns_class, mlt); } static void @@ -1137,6 +1158,40 @@ cancel_measurement_level_trns (struct trns_chain *chain) add_measurement_level_trns_free__ (mlt); chain->n--; } + +bool +measure_guesser_is_needed (struct dataset *ds) +{ + struct measurement_level_trns *mlt + = create_measurement_level_trns (dataset_dict (ds)); + if (mlt) + { + add_measurement_level_trns_free__ (mlt); + return true; + } + return false; +} + +void +measure_guesser_run (struct dataset *ds, const struct casereader *reader) +{ + struct measurement_level_trns *mlt + = create_measurement_level_trns (dataset_dict (ds)); + if (!mlt) + return; + + struct casereader *r = casereader_clone (reader); + while (mlt->n_vars > 0) + { + struct ccase *c = casereader_read (r); + measurement_level_trns_run (mlt, c); + case_unref (c); + } + casereader_destroy (r); + + measurement_level_trns_commit (mlt); + add_measurement_level_trns_free__ (mlt); +} static void dataset_changed__ (struct dataset *ds)