X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fctables.c;h=6c8812a1a4bc2c3506d097de63eae0416ad9841a;hb=a3a6f7e27b704d74d8263638057403d9a89196f8;hp=fac05a9bc262038f2dbf7a16165772709c03c8f8;hpb=ff0dcae1d9a5aa5ae1b80164c49df264be1576b6;p=pspp diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index fac05a9bc2..6c8812a1a4 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -455,6 +455,7 @@ struct ctables_table */ enum pivot_axis_type label_axis[PIVOT_N_AXES]; enum pivot_axis_type clabels_from_axis; + enum pivot_axis_type clabels_to_axis; const struct variable *clabels_example; struct hmap clabels_values_map; struct ctables_value **clabels_values; @@ -4497,8 +4498,6 @@ ctables_check_label_position (struct ctables_table *t, enum pivot_axis_type a) if (label_pos == a) return true; - t->clabels_from_axis = a; - const char *subcommand_name = a == PIVOT_AXIS_ROW ? "ROWLABELS" : "COLLABELS"; const char *pos_name = label_pos == PIVOT_AXIS_LAYER ? "LAYER" : "OPPOSITE"; @@ -4678,29 +4677,9 @@ ctables_prepare_table (struct ctables_table *t) continue; nest->areas[at][nest->n_areas[at]++] = k; } - else if (at == CTAT_LAYERCOL && a == PIVOT_AXIS_ROW && t->label_axis[a] != a) - { - for (size_t k = nest->n - 1; k < nest->n; k--) - { - if (k == nest->scale_idx) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - break; - } - continue; - } - else if (at == CTAT_LAYERROW && a == PIVOT_AXIS_COLUMN && t->label_axis[a] != a) - { - for (size_t k = nest->n - 1; k < nest->n; k--) - { - if (k == nest->scale_idx) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - break; - } - continue; - } - else if (at == CTAT_LAYER && t->label_axis[a] == PIVOT_AXIS_LAYER) + else if ((at == CTAT_LAYERCOL && a == PIVOT_AXIS_ROW && t->label_axis[a] != a) + || (at == CTAT_LAYERROW && a == PIVOT_AXIS_COLUMN && t->label_axis[a] != a) + || (at == CTAT_LAYER && t->label_axis[a] == PIVOT_AXIS_LAYER)) { for (size_t k = nest->n - 1; k < nest->n; k--) { @@ -4713,115 +4692,64 @@ ctables_prepare_table (struct ctables_table *t) } size_t n_drop; - if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) - { - n_drop = (a == PIVOT_AXIS_LAYER ? 0 - : a == PIVOT_AXIS_ROW ? 2 - : 0); - } - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) - { - n_drop = (a == PIVOT_AXIS_LAYER ? 0 - : a == PIVOT_AXIS_COLUMN ? 2 - : 0); - } - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) - { - if (a == PIVOT_AXIS_COLUMN) - n_drop = 1; - else - { - if (a == PIVOT_AXIS_ROW) - { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } - } - n_drop = 0; - } - } - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_LAYER) + bool drop_inner = false; + if (at == CTAT_SUBTABLE + && t->clabels_from_axis != PIVOT_AXIS_LAYER) { - if (a == PIVOT_AXIS_ROW) - n_drop = 1; + if (t->clabels_to_axis != PIVOT_AXIS_LAYER) + n_drop = a == t->clabels_from_axis ? 2 : 0; else { - if (a == PIVOT_AXIS_COLUMN) - { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } - } - n_drop = 0; + drop_inner = a == t->clabels_from_axis; + n_drop = a != t->clabels_from_axis && a != PIVOT_AXIS_LAYER; } } else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) n_drop = 0; - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) + else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } + drop_inner = true; n_drop = 0; } - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) - continue; - else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_LAYER) { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } + drop_inner = true; n_drop = 0; } - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) + else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } + drop_inner = true; n_drop = 0; } - else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_LAYER) + else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + n_drop = 0; + else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } + drop_inner = true; n_drop = 0; } else { - bool drop_last = (at == CTAT_SUBTABLE ? a != PIVOT_AXIS_LAYER - : at == CTAT_ROW ? a == PIVOT_AXIS_COLUMN - : at == CTAT_COL ? a == PIVOT_AXIS_ROW - : false); - bool drop_additional - = ((t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN && (at == CTAT_ROW || at == CTAT_LAYERROW) && a == PIVOT_AXIS_ROW) - || (t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW && (at == CTAT_COL || at == CTAT_LAYERCOL) && a == PIVOT_AXIS_COLUMN)); - n_drop = 0; - if (drop_last) + if (at == CTAT_SUBTABLE ? a != PIVOT_AXIS_LAYER + : at == CTAT_ROW ? a == PIVOT_AXIS_COLUMN + : at == CTAT_COL ? a == PIVOT_AXIS_ROW + : false) n_drop++; - if (drop_additional) + if (((at == CTAT_ROW || at == CTAT_LAYERROW) && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN && a == PIVOT_AXIS_ROW) + || ((at == CTAT_COL || at == CTAT_LAYERCOL) && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW && a == PIVOT_AXIS_COLUMN)) n_drop++; } + if (drop_inner) + { + size_t n = nest->n_areas[at]; + if (n > 1) + { + nest->areas[at][n - 2] = nest->areas[at][n - 1]; + nest->n_areas[at]--; + } + } for (size_t i = 0; i < n_drop; i++) if (nest->n_areas[at] > 0) nest->n_areas[at]--; @@ -6346,6 +6274,7 @@ cmd_ctables (struct lexer *lexer, struct dataset *ds) [PIVOT_AXIS_LAYER] = PIVOT_AXIS_LAYER, }, .clabels_from_axis = PIVOT_AXIS_LAYER, + .clabels_to_axis = PIVOT_AXIS_LAYER, .categories = categories, .n_categories = n_vars, .cilevel = 95, @@ -6784,12 +6713,18 @@ cmd_ctables (struct lexer *lexer, struct dataset *ds) break; } - if (t->label_axis[PIVOT_AXIS_ROW] != PIVOT_AXIS_ROW - && t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + if (t->label_axis[PIVOT_AXIS_ROW] != PIVOT_AXIS_ROW) { - msg (SE, _("ROWLABELS and COLLABELS may not both be specified.")); - goto error; + t->clabels_from_axis = PIVOT_AXIS_ROW; + if (t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + { + msg (SE, _("ROWLABELS and COLLABELS may not both be specified.")); + goto error; + } } + else if (t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + t->clabels_from_axis = PIVOT_AXIS_COLUMN; + t->clabels_to_axis = t->label_axis[t->clabels_from_axis]; if (!ctables_prepare_table (t)) goto error;