casereader: Implement save, load.
[pspp] / src / data / casereader.c
index 5695d7cfa8d7665be98ab8d8c4031b7a698fbb02..be5509935957adb3c265d90ac496084b2f90b17f 100644 (file)
@@ -1,4 +1,4 @@
-/* pspp - a program for statistical analysis.
+/* PSPP - a program for statistical analysis.
    Copyright (C) 2007, 2009, 2010, 2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -239,12 +239,13 @@ static casenumber
 casereader_count_cases__ (const struct casereader *reader,
                           casenumber max_cases)
 {
-  struct casereader *clone = casereader_clone (reader);
-  casenumber n_cases = casereader_advance (clone, max_cases);
-#if (__GNUC__ == 4 ) && (__GNUC_MINOR__ == 4)
-  // volatile int x = 1;
-#endif
-  //  casereader_destroy (clone);
+  struct casereader *clone;
+  casenumber n_cases;
+
+  clone = casereader_clone (reader);
+  n_cases = casereader_advance (clone, max_cases);
+  casereader_destroy (clone);
+
   return n_cases;
 }
 
@@ -324,6 +325,56 @@ casereader_transfer (struct casereader *reader, struct casewriter *writer)
   casereader_destroy (reader);
 }
 
+struct pxd_object *
+casereader_save (const struct casereader *reader_, struct pxd *pxd)
+{
+  struct pxd_array_builder ab;
+  struct casereader *reader;
+  struct pxd_builder b;
+  struct ccase *c;
+
+  pxd_array_builder_init (&ab, pxd);
+  reader = casereader_clone (reader_);
+  while ((c = casereader_read (reader)) != NULL)
+    {
+      pxd_array_builder_add (&ab, case_save (c, pxd));
+      case_unref (c);
+    }
+  casereader_destroy (reader);
+
+  pxd_builder_init (&b, pxd);
+  pxd_builder_put_link (&b, caseproto_save (reader->proto, pxd));
+  pxd_builder_put_link (&b, pxd_array_builder_commit (&ab));
+
+  return pxd_builder_commit (&b);
+}
+
+struct casereader *
+casereader_load (struct pxd_object *object, const struct pxd *pxd)
+{
+  struct casewriter *writer;
+  struct caseproto *proto;
+  struct pxd_array array;
+  struct pxd_parser p;
+  size_t i;
+
+  pxd_parser_init (&p, object, pxd);
+
+  proto = caseproto_load (pxd_parser_get_link (&p), pxd);
+  writer = autopaging_writer_create (proto);
+  caseproto_unref (proto);
+
+  pxd_array_init (&array, pxd_parser_get_link (&p), pxd);
+  for (i = 0; i < pxd_array_size (&array); i++)
+    casewriter_write (writer, case_load (pxd_array_get (&array, i), pxd));
+  pxd_array_destroy (&array);
+
+  pxd_parser_destroy (&p);
+
+  return casewriter_make_reader (writer);
+}
+
+
 /* Creates and returns a new casereader.  This function is
    intended for use by casereader implementations, not by
    casereader clients.