work on making transformations use relative return values
[pspp] / src / data / transformations.c
index 700ed85e40c6285963716857931e597665d6fcfb..46241c8fc2bab393571233def90bb16fb1a261ba 100644 (file)
@@ -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;