it works!!
[pspp] / src / data / casereader-translator.c
index 31ee82c1f627e19b19f6846aff860d6f1c450463..5c8b9f4209929f335c702f47e6f96312d8f1fabe 100644 (file)
@@ -113,6 +113,16 @@ static const struct casereader_class casereader_translator_class =
 /* Casereader that applies a user-supplied function to translate
    each case into another in a stateless fashion. */
 
+/* A statelessly translating casereader. */
+struct casereader_stateless_translator
+  {
+    struct casereader *subreader; /* Source of input cases. */
+
+    casenumber case_offset;
+    const struct casereader_translator_class *class;
+    void *aux;
+  };
+
 static const struct casereader_random_class
 casereader_stateless_translator_class;
 
@@ -142,17 +152,16 @@ casereader_translate_stateless (
   const struct casereader_translator_class *class,
   void *aux)
 {
-  struct casereader_translator *ct = xmalloc (sizeof *ct);
-  *ct = (struct casereader_translator) {
+  struct casereader_stateless_translator *cst = xmalloc (sizeof *cst);
+  *cst = (struct casereader_stateless_translator) {
     .subreader = casereader_rename (subreader),
     .class = class,
     .aux = aux,
   };
-
   struct casereader *reader = casereader_create_random (
-    output_proto, casereader_get_n_cases (ct->subreader),
-    &casereader_stateless_translator_class, ct);
-  taint_propagate (casereader_get_taint (ct->subreader),
+    output_proto, casereader_get_n_cases (cst->subreader),
+    &casereader_stateless_translator_class, cst);
+  taint_propagate (casereader_get_taint (cst->subreader),
                    casereader_get_taint (reader));
   return reader;
 }
@@ -160,24 +169,32 @@ casereader_translate_stateless (
 /* Internal read function for stateless translating casereader. */
 static struct ccase *
 casereader_stateless_translator_read (struct casereader *reader UNUSED,
-                                      void *ct_, casenumber idx)
+                                      void *cst_, casenumber idx)
 {
-  struct casereader_translator *ct = ct_;
-  struct ccase *tmp = casereader_peek (ct->subreader, idx);
+  struct casereader_stateless_translator *cst = cst_;
+  struct ccase *tmp = casereader_peek (cst->subreader, idx);
   if (tmp != NULL)
-    tmp = ct->class->translate (tmp, ct->aux);
+    tmp = cst->class->translate (tmp, cst->aux);
   return tmp;
 }
 
 /* Internal destroy function for translating casereader. */
 static void
 casereader_stateless_translator_destroy (struct casereader *reader UNUSED,
-                                         void *ct_)
+                                         void *cst_)
 {
-  struct casereader_translator *ct = ct_;
-  casereader_destroy (ct->subreader);
-  ct->class->destroy (ct->aux);
-  free (ct);
+  struct casereader_stateless_translator *cst = cst_;
+  casereader_destroy (cst->subreader);
+  cst->class->destroy (cst->aux);
+  free (cst);
+}
+
+static void
+casereader_stateless_translator_advance (struct casereader *reader UNUSED,
+                                         void *cst_, casenumber n)
+{
+  struct casereader_stateless_translator *cst = cst_;
+  cst->case_offset += casereader_advance (cst->subreader, n);
 }
 
 /* Casereader class for stateless translating casereader. */
@@ -186,7 +203,7 @@ casereader_stateless_translator_class =
   {
     casereader_stateless_translator_read,
     casereader_stateless_translator_destroy,
-    NULL,
+    casereader_stateless_translator_advance,
   };
 \f