X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fctables.c;h=fd296a00216e5165bcbe9427fc79cd99ccf71128;hb=69b31e124aff05df3492e6e6412c03c64e4e9d12;hp=25908eb65d5fa14626fd3b34e771ef7f2b909645;hpb=9574a6c2bf65ddc8ef13d4e942833bc5d4b0d2e0;p=pspp diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index 25908eb65d..fd296a0021 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -4283,11 +4283,21 @@ ctables_pcexpr_evaluate (const struct ctables_pcexpr_evaluate_ctx *ctx, s = xmalloc (width); buf_copy_rpad (s, width, e->string.string, e->string.length, ' '); } - struct ctables_cell_value cv = { - .category = ctables_find_category_for_postcompute (ctx->section->table->ctables->dict, ctx->cats, ctx->parse_format, e), - .value = { .s = CHAR_CAST (uint8_t *, s ? s : e->string.string) }, - }; - assert (cv.category != NULL); + + const struct ctables_category *category + = ctables_find_category_for_postcompute ( + ctx->section->table->ctables->dict, + ctx->cats, ctx->parse_format, e); + assert (category != NULL); + + struct ctables_cell_value cv = { .category = category }; + if (category->type == CCT_NUMBER) + cv.value.f = category->number; + else if (category->type == CCT_STRING) + cv.value.s = CHAR_CAST (uint8_t *, s ? s : e->string.string); + else + NOT_REACHED (); + double retval = ctables_pcexpr_evaluate_category (ctx, &cv); free (s); return retval; @@ -5503,23 +5513,27 @@ ctables_execute (struct dataset *ds, struct casereader *input, } struct dictionary *dict = dataset_dict (ds); + + bool splitting = dict_get_split_type (dict) == SPLIT_SEPARATE; struct casegrouper *grouper - = (dict_get_split_type (dict) == SPLIT_SEPARATE + = (splitting ? casegrouper_create_splits (input, dict) : casegrouper_create_vars (input, NULL, 0)); struct casereader *group; while (casegrouper_get_next_group (grouper, &group)) { - /* Output SPLIT FILE variables. */ - struct ccase *c = casereader_peek (group, 0); - if (c != NULL) + if (splitting) { - output_split_file_values (ds, c); - case_unref (c); + struct ccase *c = casereader_peek (group, 0); + if (c != NULL) + { + output_split_file_values (ds, c); + case_unref (c); + } } bool warn_on_invalid = true; - for (c = casereader_read (group); c; + for (struct ccase *c = casereader_read (group); c; case_unref (c), c = casereader_read (group)) { double d_weight = dict_get_case_weight (dict, c, &warn_on_invalid);