Added coefficient-handling routines
[pspp-builds.git] / src / sysfile-info.c
index 08d5484f70e0d285fd4b8317f7ec2379ca09bd35..b5f559e5185527a9f68f8397d535db93cf56cb56 100644 (file)
@@ -29,6 +29,7 @@
 #include "file-handle.h"
 #include "hash.h"
 #include "lexer.h"
+#include "magic.h"
 #include "misc.h"
 #include "output.h"
 #include "sfm-read.h"
@@ -171,7 +172,7 @@ cmd_sysfile_info (void)
 
 static void display_macros (void);
 static void display_documents (void);
-static void display_variables (struct variable **, int, int);
+static void display_variables (struct variable **, size_t, int);
 static void display_vectors (int sorted);
 
 int
@@ -181,7 +182,7 @@ cmd_display (void)
   int sorted;
 
   /* Variables to display. */
-  int n;
+  size_t n;
   struct variable **vl;
 
   if (lex_match_id ("MACROS"))
@@ -247,7 +248,7 @@ cmd_display (void)
 
       if (as == AS_SCRATCH)
        {
-         int i, m;
+         size_t i, m;
          for (i = 0, m = n; i < n; i++)
            if (dict_class_from_id (vl[i]->name) != DC_SCRATCH)
              {
@@ -341,7 +342,7 @@ variables_dim (struct tab_table *t, struct outp_driver *d)
 }
   
 static void
-display_variables (struct variable **vl, int n, int as)
+display_variables (struct variable **vl, size_t n, int as)
 {
   struct variable **vp = vl;           /* Variable pointer. */
   struct tab_table *t;
@@ -349,7 +350,7 @@ display_variables (struct variable **vl, int n, int as)
   int nr;                      /* Number of rows. */
   int pc;                      /* `Position column' */
   int r;                       /* Current row. */
-  int i;
+  size_t i;
 
   _as = as;
   switch (as)
@@ -463,63 +464,44 @@ describe_variable (struct variable *v, struct tab_table *t, int r, int as)
     }
 
   /* Missing values if any. */
-  if (v->miss_type != MISSING_NONE)
+  if (!mv_is_empty (&v->miss))
     {
-      char buf[80];
-      char *cp = stpcpy (buf, _("Missing Values: "));
-
-      if (v->type == NUMERIC)
-       switch (v->miss_type)
-         {
-         case MISSING_1:
-           sprintf (cp, "%g", v->missing[0].f);
-           break;
-         case MISSING_2:
-           sprintf (cp, "%g; %g", v->missing[0].f, v->missing[1].f);
-           break;
-         case MISSING_3:
-           sprintf (cp, "%g; %g; %g", v->missing[0].f,
-                    v->missing[1].f, v->missing[2].f);
-           break;
-         case MISSING_RANGE:
-           sprintf (cp, "%g THRU %g", v->missing[0].f, v->missing[1].f);
-           break;
-         case MISSING_LOW:
-           sprintf (cp, "LOWEST THRU %g", v->missing[0].f);
-           break;
-         case MISSING_HIGH:
-           sprintf (cp, "%g THRU HIGHEST", v->missing[0].f);
-           break;
-         case MISSING_RANGE_1:
-           sprintf (cp, "%g THRU %g; %g",
-                    v->missing[0].f, v->missing[1].f, v->missing[2].f);
-           break;
-         case MISSING_LOW_1:
-           sprintf (cp, "LOWEST THRU %g; %g",
-                    v->missing[0].f, v->missing[1].f);
-           break;
-         case MISSING_HIGH_1:
-           sprintf (cp, "%g THRU HIGHEST; %g",
-                    v->missing[0].f, v->missing[1].f);
-           break;
-         default:
-           assert (0);
-         }
-      else
-       {
-         int i;
-
-         for (i = 0; i < v->miss_type; i++)
-           {
-             if (i != 0)
-               cp = stpcpy (cp, "; ");
-             *cp++ = '"';
-             memcpy (cp, v->missing[i].s, v->width);
+      char buf[128];
+      char *cp;
+      struct missing_values mv;
+      int cnt = 0;
+      
+      cp = stpcpy (buf, _("Missing Values: "));
+      mv_copy (&mv, &v->miss);
+      if (mv_has_range (&mv)) 
+        {
+          double x, y;
+          mv_pop_range (&mv, &x, &y);
+          if (x == LOWEST)
+            cp += nsprintf (cp, "LOWEST THRU %g", y);
+          else if (y == HIGHEST)
+            cp += nsprintf (cp, "%g THRU HIGHEST", x);
+          else
+            cp += nsprintf (cp, "%g THRU %g", x, y);
+          cnt++;
+        }
+      while (mv_has_value (&mv)) 
+        {
+          union value value;
+          mv_pop_value (&mv, &value);
+          if (cnt++ > 0)
+            cp += nsprintf (cp, "; ");
+          if (v->type == NUMERIC)
+            cp += nsprintf (cp, "%g", value.f);
+          else 
+            {
+              *cp++ = '"';
+             memcpy (cp, value.s, v->width);
              cp += v->width;
              *cp++ = '"';
-           }
-         *cp = 0;
-       }
+              *cp = '\0';
+            }
+        }
 
       tab_joint_text (t, 1, r, 2, r, TAB_LEFT, buf);
       r++;
@@ -594,7 +576,7 @@ display_vectors (int sorted)
       return;
     }
 
-  vl = xmalloc (sizeof *vl * nvec);
+  vl = xnmalloc (nvec, sizeof *vl);
   for (i = 0; i < nvec; i++)
     vl[i] = dict_get_vector (default_dict, i);
   if (sorted)