X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Ftransformations.c;fp=src%2Fdata%2Ftransformations.c;h=46241c8fc2bab393571233def90bb16fb1a261ba;hb=765362af497f7b1f9c9a5ef387d40eac474fbbe3;hp=700ed85e40c6285963716857931e597665d6fcfb;hpb=cfe28ef151771c04be56d459c58d818f6c43f5e1;p=pspp diff --git a/src/data/transformations.c b/src/data/transformations.c index 700ed85e40..46241c8fc2 100644 --- a/src/data/transformations.c +++ b/src/data/transformations.c @@ -175,19 +175,34 @@ enum trns_result trns_chain_execute (const struct trns_chain *chain, enum trns_result start, struct ccase **c, casenumber case_nr) { - size_t i; + int i; assert (chain->finalized); for (i = start < 0 ? 0 : start; i < chain->trns_cnt; ) { struct transformation *trns = &chain->trns[i]; - int retval = trns->execute (trns->aux, c, case_nr); - if (retval == TRNS_CONTINUE) - i++; - else if (retval >= 0) - i = retval + trns->idx_ofs; - else - return retval == TRNS_END_CASE ? i + 1 : retval; + int retval; + + retval = trns->execute (trns->aux, c, case_nr); + switch (retval) + { + case TRNS_CONTINUE: + i++; + break; + + case TRNS_END_CASE: + return i + 1; + + case TRNS_DROP_CASE: + case TRNS_ERROR: + case TRNS_END_FILE: + return retval; + + default: + i += retval; + assert (i <= chain->trns_cnt); + break; + } } return TRNS_CONTINUE;