X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fctables.c;h=2b8636581d0bb07eb044b4206b3ad3cdb3bf3838;hb=2031b99a3f1970a0b9a840652f0aff80ec34b433;hp=fc58d4b704b1029cdf3687c0909c4e711aeb38a7;hpb=e378d75c125c92e895ae7c112774586cd1d3eda3;p=pspp diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index fc58d4b704..2b8636581d 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -4665,108 +4665,76 @@ ctables_prepare_table (struct ctables_table *t) nest->areas[at] = xmalloc (nest->n * sizeof *nest->areas[at]); nest->n_areas[at] = 0; - bool add_vars = (at == CTAT_LAYER ? a == PIVOT_AXIS_LAYER - : at == CTAT_LAYERROW ? a != PIVOT_AXIS_COLUMN - : at == CTAT_LAYERCOL ? a != PIVOT_AXIS_ROW - : at == CTAT_TABLE ? false - : true); - if (add_vars) - for (size_t k = 0; k < nest->n; k++) - { - if (k == nest->scale_idx) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - } - 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)) + enum pivot_axis_type ata, atb; + if (at == CTAT_ROW || at == CTAT_LAYERROW) { - 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; + ata = PIVOT_AXIS_ROW; + atb = PIVOT_AXIS_COLUMN; } - - size_t n_drop; - if (at == CTAT_SUBTABLE - && t->clabels_from_axis != PIVOT_AXIS_LAYER - && t->clabels_to_axis != PIVOT_AXIS_LAYER) - n_drop = a == t->clabels_from_axis ? 2 : 0; - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) + else if (at == CTAT_COL || at == CTAT_LAYERCOL) { - 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) - { - if (a == PIVOT_AXIS_ROW) - n_drop = 1; - 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; - } + ata = PIVOT_AXIS_COLUMN; + atb = PIVOT_AXIS_ROW; } - 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) + + if (at == CTAT_LAYER + ? a != PIVOT_AXIS_LAYER && t->label_axis[a] == PIVOT_AXIS_LAYER + : at == CTAT_LAYERCOL || at == CTAT_LAYERROW + ? a == atb && t->label_axis[a] != a + : false) { - 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; + for (size_t k = nest->n - 1; k < nest->n; k--) + if (k != nest->scale_idx) + { + nest->areas[at][nest->n_areas[at]++] = k; + break; + } + continue; } - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + + if (at == CTAT_LAYER ? a != PIVOT_AXIS_LAYER + : at == CTAT_LAYERROW || at == CTAT_LAYERCOL ? a == atb + : at == CTAT_TABLE ? true + : false) continue; - 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]--; - } - n_drop = 0; - } - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) + + for (size_t k = 0; k < nest->n; k++) + if (k != nest->scale_idx) + nest->areas[at][nest->n_areas[at]++] = k; + + int n_drop; + switch (at) { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } + case CTAT_SUBTABLE: +#define L PIVOT_AXIS_LAYER + n_drop = (t->clabels_from_axis == L ? a != L + : t->clabels_to_axis != L ? (a == t->clabels_from_axis ? 2 : 0) + : a == t->clabels_from_axis ? -1 + : a != L); +#undef L + break; + + case CTAT_LAYERROW: + case CTAT_LAYERCOL: + n_drop = a == ata && t->label_axis[ata] == atb; + break; + + case CTAT_ROW: + case CTAT_COL: + n_drop = (a == ata ? t->label_axis[ata] == atb + : a != atb ? 0 + : t->clabels_from_axis == atb ? -1 + : t->clabels_to_axis != atb ? 1 + : 0); + break; + + case CTAT_LAYER: + case CTAT_TABLE: n_drop = 0; + break; } - else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_LAYER) + + if (n_drop < 0) { size_t n = nest->n_areas[at]; if (n > 1) @@ -4774,28 +4742,13 @@ ctables_prepare_table (struct ctables_table *t) nest->areas[at][n - 2] = nest->areas[at][n - 1]; nest->n_areas[at]--; } - 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) - n_drop++; - if (drop_additional) - n_drop++; + for (int i = 0; i < n_drop; i++) + if (nest->n_areas[at] > 0) + nest->n_areas[at]--; } - - for (size_t i = 0; i < n_drop; i++) - if (nest->n_areas[at] > 0) - nest->n_areas[at]--; } } }