pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] Changes to pspp/src/sfm-write.c


From: Ben Pfaff
Subject: [Pspp-cvs] Changes to pspp/src/sfm-write.c
Date: Sun, 07 Aug 2005 00:39:34 -0400

Index: pspp/src/sfm-write.c
diff -u pspp/src/sfm-write.c:1.18 pspp/src/sfm-write.c:1.19
--- pspp/src/sfm-write.c:1.18   Sun Jul 31 21:42:46 2005
+++ pspp/src/sfm-write.c        Sun Aug  7 04:39:28 2005
@@ -362,6 +362,7 @@
   struct sysfile_variable sv;
 
   /* Missing values. */
+  struct missing_values mv;
   flt64 m[3];           /* Missing value values. */
   int nm;               /* Number of missing values, possibly negative. */
 
@@ -369,54 +370,27 @@
   sv.type = v->width;
   sv.has_var_label = (v->label != NULL);
 
-  switch (v->miss_type)
+  mv_copy (&mv, &v->miss);
+  nm = 0;
+  if (mv_has_range (&mv)) 
     {
-    case MISSING_NONE:
-      nm = 0;
-      break;
-    case MISSING_1:
-    case MISSING_2:
-    case MISSING_3:
-      for (nm = 0; nm < v->miss_type; nm++)
-       m[nm] = v->missing[nm].f;
-      break;
-    case MISSING_RANGE:
-      m[0] = v->missing[0].f;
-      m[1] = v->missing[1].f;
-      nm = -2;
-      break;
-    case MISSING_LOW:
-      m[0] = second_lowest_flt64;
-      m[1] = v->missing[0].f;
-      nm = -2;
-      break;
-    case MISSING_HIGH:
-      m[0] = v->missing[0].f;
-      m[1] = FLT64_MAX;
-      nm = -2;
-      break;
-    case MISSING_RANGE_1:
-      m[0] = v->missing[0].f;
-      m[1] = v->missing[1].f;
-      m[2] = v->missing[2].f;
-      nm = -3;
-      break;
-    case MISSING_LOW_1:
-      m[0] = second_lowest_flt64;
-      m[1] = v->missing[0].f;
-      m[2] = v->missing[1].f;
-      nm = -3;
-      break;
-    case MISSING_HIGH_1:
-      m[0] = v->missing[0].f;
-      m[1] = second_lowest_flt64;
-      m[2] = v->missing[1].f;
-      nm = -3;
-      break;
-    default:
-      assert (0);
-      abort ();
+      double x, y;
+      mv_pop_range (&mv, &x, &y);
+      m[nm++] = x == LOWEST ? second_lowest_flt64 : x;
+      m[nm++] = y == HIGHEST ? FLT64_MAX : y;
     }
+  while (mv_has_value (&mv))
+    {
+      union value value;
+      mv_pop_value (&mv, &value);
+      if (v->type == NUMERIC)
+        m[nm] = value.f;
+      else
+        buf_copy_rpad ((char *) &m[nm], sizeof m[nm], value.s, v->width);
+      nm++;
+    }
+  if (mv_has_range (&v->miss))
+    nm = -nm;
 
   sv.n_missing_values = nm;
   write_format_spec (&v->print, &sv.print);
@@ -445,7 +419,7 @@
         return 0;
     }
 
-  if (nm && !buf_write (w, m, sizeof *m * nm))
+  if (nm && !buf_write (w, m, sizeof *m * abs (nm)))
     return 0;
 
   if (v->type == ALPHA && v->width > (int) sizeof (flt64))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]