starting to look like it works
[pspp] / src / language / control / do-if.c
index b45694804ae35dc2c728c187661b0a3b5f873dc2..efe4667753a387fcb9e0de66d98bf0694f1c0896 100644 (file)
@@ -37,8 +37,7 @@ struct clause
   {
     struct msg_location *location;
     struct expression *condition; /* Test expression; NULL for ELSE clause. */
-    struct transformation *xforms;
-    size_t n_xforms;
+    struct trns_chain xforms;
   };
 
 /* DO IF transformation. */
@@ -48,8 +47,7 @@ struct do_if_trns
     size_t n_clauses;           /* Number of clauses. */
   };
 
-static trns_proc_func do_if_trns_proc;
-static trns_free_func do_if_trns_free;
+static const struct trns_class do_if_trns_class;
 
 static void
 start_clause (struct lexer *lexer, struct dataset *ds,
@@ -77,7 +75,7 @@ start_clause (struct lexer *lexer, struct dataset *ds,
                                  sizeof *do_if->clauses);
   struct clause *clause = &do_if->clauses[do_if->n_clauses++];
 
-  *clause = (struct clause) { .n_xforms = 0 };
+  *clause = (struct clause) { .location = NULL };
   if (condition)
     {
       clause->condition = expr_parse_bool (lexer, ds);
@@ -96,7 +94,7 @@ static void
 finish_clause (struct dataset *ds, struct do_if_trns *do_if)
 {
   struct clause *clause = &do_if->clauses[do_if->n_clauses - 1];
-  proc_pop_transformations (ds, &clause->xforms, &clause->n_xforms);
+  proc_pop_transformations (ds, &clause->xforms);
 }
 
 /* Parse DO IF. */
@@ -133,7 +131,7 @@ cmd_do_if (struct lexer *lexer, struct dataset *ds)
     }
   finish_clause (ds, do_if);
 
-  add_transformation (ds, do_if_trns_proc, do_if_trns_free, do_if);
+  add_transformation (ds, &do_if_trns_class, do_if);
 
   return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE;
 }
@@ -158,8 +156,7 @@ do_if_trns_proc (void *do_if_, struct ccase **c, casenumber case_num)
             return TRNS_CONTINUE;
         }
 
-      return transformations_execute (clause->xforms, clause->n_xforms,
-                                      c, case_num);
+      return trns_chain_execute (&clause->xforms, case_num, c);
     }
   return TRNS_CONTINUE;
 }
@@ -177,9 +174,15 @@ do_if_trns_free (void *do_if_)
       msg_location_destroy (clause->location);
       expr_free (clause->condition);
 
-      transformations_destroy (clause->xforms, clause->n_xforms);
+      trns_chain_uninit (&clause->xforms);
     }
   free (do_if->clauses);
   free (do_if);
   return true;
 }
+
+static const struct trns_class do_if_trns_class = {
+  .name = "DO IF",
+  .execute = do_if_trns_proc,
+  .destroy = do_if_trns_free,
+};