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;