Sat Dec 27 16:16:49 2003 Ben Pfaff <blp@gnu.org>
[pspp-builds.git] / src / sfm-write.c
index 0e99013f689126a2ccb6e0da4f7930ee4a599c78..97028a4966f15440b5de0947e3be1436dff5c165 100644 (file)
@@ -35,6 +35,8 @@ char *alloca ();
 #endif
 #endif
 
+#include "sfm.h"
+#include "sfmP.h"
 #include <assert.h>
 #include <stdlib.h>
 #include <ctype.h>
@@ -45,20 +47,17 @@ char *alloca ();
 #endif
 #include "alloc.h"
 #include "approx.h"
-#include "avl.h"
 #include "error.h"
 #include "file-handle.h"
 #include "getline.h"
+#include "hash.h"
 #include "magic.h"
 #include "misc.h"
-#include "sfm.h"
-#include "sfmP.h"
 #include "str.h"
+#include "value-labels.h"
 #include "var.h"
 #include "version.h"
 
-#undef DEBUGGING
-/*#define DEBUGGING 1 */
 #include "debug-print.h"
 
 /* PORTME: This file may require substantial revision for those
@@ -144,13 +143,13 @@ sfm_write_dictionary (struct sfm_write_info *inf)
     goto lossage;
 
   /* Write basic variable info. */
-  for (i = 0; i < d->nvar; i++)
-    write_variable (inf, d->var[i]);
+  for (i = 0; i < dict_get_var_cnt (d); i++)
+    write_variable (inf, dict_get_var (d, i));
 
   /* Write out value labels. */
-  for (index = i = 0; i < d->nvar; i++)
+  for (index = i = 0; i < dict_get_var_cnt (d); i++)
     {
-      struct variable *v = d->var[i];
+      struct variable *v = dict_get_var (d, i);
 
       if (!write_value_labels (inf, v, index))
        goto lossage;
@@ -158,7 +157,7 @@ sfm_write_dictionary (struct sfm_write_info *inf)
                : DIV_RND_UP (v->width, sizeof (flt64)));
     }
 
-  if (d->documents != NULL && !write_documents (inf))
+  if (dict_get_documents (d) != NULL && !write_documents (inf))
     goto lossage;
   if (!write_rec_7_34 (inf))
     goto lossage;
@@ -228,18 +227,18 @@ write_header (struct sfm_write_info *inf)
   hdr.layout_code = 2;
 
   hdr.case_size = 0;
-  for (i = 0; i < d->nvar; i++)
+  for (i = 0; i < dict_get_var_cnt (d); i++)
     {
-      struct variable *v = d->var[i];
+      struct variable *v = dict_get_var (d, i);
       hdr.case_size += (v->type == NUMERIC ? 1
                        : DIV_RND_UP (v->width, sizeof (flt64)));
     }
   inf->case_size = hdr.case_size;
 
   p = ext->elem_type = xmalloc (inf->case_size);
-  for (i = 0; i < d->nvar; i++)
+  for (i = 0; i < dict_get_var_cnt (d); i++)
     {
-      struct variable *v = d->var[i];
+      struct variable *v = dict_get_var (d, i);
       int count = (v->type == NUMERIC ? 1
                    : DIV_RND_UP (v->width, sizeof (flt64)));
       while (count--)
@@ -248,14 +247,18 @@ write_header (struct sfm_write_info *inf)
 
   hdr.compressed = inf->compress;
 
-  update_weighting (d);
-  if (d->weight_index != -1)
+  if (dict_get_weight (d) != NULL)
     {
+      struct variable *weight_var;
       int recalc_weight_index = 1;
+      int i;
 
-      for (i = 0; i < d->weight_index; i++)
-       {
-         struct variable *v = d->var[i];
+      weight_var = dict_get_weight (d);
+      for (i = 0; ; i++) 
+        {
+         struct variable *v = dict_get_var (d, i);
+          if (v == weight_var)
+            break;
          recalc_weight_index += (v->type == NUMERIC ? 1
                                  : DIV_RND_UP (v->width, sizeof (flt64)));
        }
@@ -293,9 +296,15 @@ write_header (struct sfm_write_info *inf)
       sprintf (buf, "%02d:%02d:%02d", hour - 1, min - 1, sec - 1);
       memcpy (hdr.creation_time, buf, sizeof hdr.creation_time);
     }
+  
+  {
+    const char *label = dict_get_label (d);
+    if (label == NULL)
+      label = "";
 
-  st_bare_pad_copy (hdr.file_label, d->label ? d->label : "",
-                   sizeof hdr.file_label);
+    st_bare_pad_copy (hdr.file_label, label, sizeof hdr.file_label); 
+  }
+  
   memset (hdr.padding, 0, sizeof hdr.padding);
 
   if (!bufwrite (inf->h, &hdr, sizeof hdr))
@@ -446,35 +455,36 @@ write_value_labels (struct sfm_write_info * inf, struct variable *v, int index)
       int32 vars[1] P;
     };
 
-  avl_traverser i;
+  struct val_labs_iterator *i;
   struct value_label_rec *vlr;
   struct variable_index_rec vir;
-  struct value_label *vl;
+  struct val_lab *vl;
   size_t vlr_size;
   flt64 *loc;
-  avl_traverser_init (i);
 
-  if (v->val_lab == NULL || avl_count (v->val_lab) == 0)
+  if (!val_labs_count (v->val_labs))
     return 1;
 
   /* Pass 1: Count bytes. */
   vlr_size = (sizeof (struct value_label_rec)
-             + sizeof (flt64) * (avl_count (v->val_lab) - 1));
-  while (NULL != (vl = avl_traverse (v->val_lab, &i)))
-    vlr_size += ROUND_UP (strlen (vl->s) + 1, sizeof (flt64));
+             + sizeof (flt64) * (val_labs_count (v->val_labs) - 1));
+  for (vl = val_labs_first (v->val_labs, &i); vl != NULL;
+       vl = val_labs_next (v->val_labs, &i))
+    vlr_size += ROUND_UP (strlen (vl->label) + 1, sizeof (flt64));
 
   /* Pass 2: Copy bytes. */
-  vlr = local_alloc (vlr_size);
+  vlr = xmalloc (vlr_size);
   vlr->rec_type = 3;
-  vlr->n_labels = avl_count (v->val_lab);
+  vlr->n_labels = val_labs_count (v->val_labs);
   loc = vlr->labels;
-  while (NULL != (vl = avl_traverse (v->val_lab, &i)))
+  for (vl = val_labs_first_sorted (v->val_labs, &i); vl != NULL;
+       vl = val_labs_next (v->val_labs, &i))
     {
-      int len = strlen (vl->s);
+      size_t len = strlen (vl->label);
 
-      *loc++ = vl->v.f;
+      *loc++ = vl->value.f;
       *(unsigned char *) loc = len;
-      memcpy (&((unsigned char *) loc)[1], vl->s, len);
+      memcpy (&((unsigned char *) loc)[1], vl->label, len);
       memset (&((unsigned char *) loc)[1 + len], ' ',
              REM_RND_UP (len + 1, sizeof (flt64)));
       loc += DIV_RND_UP (len + 1, sizeof (flt64));
@@ -482,10 +492,10 @@ write_value_labels (struct sfm_write_info * inf, struct variable *v, int index)
   
   if (!bufwrite (inf->h, vlr, vlr_size))
     {
-      local_free (vlr);
+      free (vlr);
       return 0;
     }
-  local_free (vlr);
+  free (vlr);
 
   vir.rec_type = 4;
   vir.n_vars = 1;
@@ -508,11 +518,17 @@ write_documents (struct sfm_write_info * inf)
   }
   rec_6;
 
+  const char *documents;
+  size_t n_lines;
+
+  documents = dict_get_documents (d);
+  n_lines = strlen (documents) / 80;
+
   rec_6.rec_type = 6;
-  rec_6.n_lines = d->n_documents;
+  rec_6.n_lines = n_lines;
   if (!bufwrite (inf->h, &rec_6, sizeof rec_6))
     return 0;
-  if (!bufwrite (inf->h, d->documents, 80 * d->n_documents))
+  if (!bufwrite (inf->h, documents, 80 * n_lines))
     return 0;
 
   return 1;
@@ -563,21 +579,18 @@ write_rec_7_34 (struct sfm_write_info * inf)
   rec_7.elem_3[3] = -1;
 
   /* PORTME: 1=IEEE754, 2=IBM 370, 3=DEC VAX E. */
-#if FPREP==FPREP_IEEE754
+#ifdef FPREP_IEEE754
   rec_7.elem_3[4] = 1;
-#else
-#error Floating-point representation unknown here.
 #endif
 
   rec_7.elem_3[5] = 1;
 
   /* PORTME: 1=big-endian, 2=little-endian. */
-  if (endian == BIG)
-    rec_7.elem_3[6] = 1;
-  else if (endian == LITTLE)
-    rec_7.elem_3[6] = 2;
-  else
-    rec_7.elem_3[6] = 0;
+#if WORDS_BIGENDIAN
+  rec_7.elem_3[6] = 1;
+#else
+  rec_7.elem_3[6] = 2;
+#endif
 
   /* PORTME: 1=EBCDIC, 2=7-bit ASCII, 3=8-bit ASCII, 4=DEC Kanji. */
   rec_7.elem_3[7] = 2;