Fix TEMPORARY bug and add regression test.
[pspp-builds.git] / src / pfm-write.c
index 0683f39aecb22c0888fc4bb7d50bb0c53880f0a4..359f0440159480c26d9d40264ccc1079e85bb232 100644 (file)
@@ -18,6 +18,7 @@
    02111-1307, USA. */
 
 #include <config.h>
+#include "pfm.h"
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
 #include <stdlib.h>
 #include <time.h>
 #include "alloc.h"
-#include "avl.h"
 #include "error.h"
 #include "file-handle.h"
-#include "gmp/gmp.h"
+#include "gmp.h"
+#include "hash.h"
 #include "magic.h"
-#include "pfm.h"
 #include "str.h"
+#include "value-labels.h"
 #include "var.h"
 #include "version.h"
 
-#undef DEBUGGING
-/*#define DEBUGGING 1 */
 #include "debug-print.h"
 
 /* pfm writer file_handle extension. */
@@ -95,10 +94,10 @@ pfm_write_dictionary (struct file_handle *handle, struct dictionary *dict)
   {
     int i;
 
-    ext->nvars = dict->nvar;
-    ext->vars = xmalloc (sizeof *ext->vars * dict->nvar);
-    for (i = 0; i < dict->nvar; i++)
-      ext->vars[i] = dict->var[i]->width;
+    ext->nvars = dict_get_var_cnt (dict);
+    ext->vars = xmalloc (sizeof *ext->vars * ext->nvars);
+    for (i = 0; i < ext->nvars; i++)
+      ext->vars[i] = dict_get_var (dict, i)->width;
   }
 
   /* Write the file header. */
@@ -137,8 +136,9 @@ lossage:
 /* Write NBYTES starting at BUF to the portable file represented by
    H.  Break lines properly every 80 characters.  */
 static int
-bufwrite (struct file_handle *h, const void *buf, size_t nbytes)
+bufwrite (struct file_handle *h, const void *buf_, size_t nbytes)
 {
+  const char *buf = buf_;
   struct pfm_fhuser_ext *ext = h->ext;
 
   assert (buf != NULL);
@@ -154,7 +154,7 @@ bufwrite (struct file_handle *h, const void *buf, size_t nbytes)
        goto lossage;
 
       nbytes -= n;
-      *((char **) &buf) += n;
+      buf += n;
       ext->lc = 0;
     }
 
@@ -386,11 +386,11 @@ write_variables (struct file_handle *h, struct dictionary *dict)
 {
   int i;
   
-  if (!bufwrite (h, "4", 1) || !write_int (h, dict->nvar)
+  if (!bufwrite (h, "4", 1) || !write_int (h, dict_get_var_cnt (dict))
       || !write_int (h, 161))
     return 0;
 
-  for (i = 0; i < dict->nvar; i++)
+  for (i = 0; i < dict_get_var_cnt (dict); i++)
     {
       static const char *miss_types[MISSING_COUNT] =
        {
@@ -400,7 +400,7 @@ write_variables (struct file_handle *h, struct dictionary *dict)
       const char *m;
       int j;
 
-      struct variable *v = dict->var[i];
+      struct variable *v = dict_get_var (dict, i);
       
       if (!bufwrite (h, "7", 1) || !write_int (h, v->width)
          || !write_string (h, v->name)
@@ -425,26 +425,29 @@ write_value_labels (struct file_handle *h, struct dictionary *dict)
 {
   int i;
 
-  for (i = 0; i < dict->nvar; i++)
+  for (i = 0; i < dict_get_var_cnt (dict); i++)
     {
-      avl_traverser iter;
-      struct variable *v = dict->var[i];
-      struct value_label *vl;
+      struct val_labs_iterator *j;
+      struct variable *v = dict_get_var (dict, i);
+      struct val_lab *vl;
 
-      if (v->val_lab == NULL)
+      if (!val_labs_count (v->val_labs))
        continue;
 
       if (!bufwrite (h, "D", 1)
          || !write_int (h, 1)
          || !write_string (h, v->name)
-         || !write_int (h, avl_count (v->val_lab)))
+         || !write_int (h, val_labs_count (v->val_labs)))
        return 0;
 
-      avl_traverser_init (iter);
-      while (NULL != (vl = avl_traverse (v->val_lab, &iter)))
-       if (!write_value (h, &vl->v, v)
-           || !write_string (h, vl->s))
-         return 0;
+      for (vl = val_labs_first_sorted (v->val_labs, &j); vl != NULL;
+           vl = val_labs_next (v->val_labs, &j)) 
+       if (!write_value (h, &vl->value, v)
+           || !write_string (h, vl->label)) 
+          {
+            val_labs_done (&j);
+            return 0; 
+          }
     }
 
   return 1;