Add scratch file handles.
[pspp-builds.git] / src / sysfile-info.c
index 2b463c216c727a9a8cf170fbd653fc3df336de80..c12bd10081ef35b2941813ebaecc8f69dec4d8a1 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"
@@ -37,6 +38,9 @@
 #include "value-labels.h"
 #include "var.h"
 
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
 /* Constants for DISPLAY utility. */
 enum
   {
@@ -49,7 +53,7 @@ enum
     AS_VECTOR
   };
 
-int describe_variable (struct variable *v, struct tab_table *t, int r, int as);
+static int describe_variable (struct variable *v, struct tab_table *t, int r, int as);
      
 /* Sets the widths of all the columns and heights of all the rows in
    table T for driver D. */
@@ -82,7 +86,7 @@ cmd_sysfile_info (void)
   lex_match_id ("FILE");
   lex_match ('=');
 
-  h = fh_parse ();
+  h = fh_parse (FH_REF_FILE);
   if (!h)
     return CMD_FAILURE;
 
@@ -94,7 +98,7 @@ cmd_sysfile_info (void)
   t = tab_create (2, 9, 0);
   tab_vline (t, TAL_1 | TAL_SPACING, 1, 0, 8);
   tab_text (t, 0, 0, TAB_LEFT, _("File:"));
-  tab_text (t, 1, 0, TAB_LEFT, handle_get_filename (h));
+  tab_text (t, 1, 0, TAB_LEFT, fh_get_filename (h));
   tab_text (t, 0, 1, TAB_LEFT, _("Label:"));
   {
     const char *label = dict_get_label (d);
@@ -128,6 +132,7 @@ cmd_sysfile_info (void)
   tab_submit (t);
 
   nr = 1 + 2 * dict_get_var_cnt (d);
+
   t = tab_create (4, nr, 1);
   tab_dim (t, sysfile_info_dim);
   tab_headers (t, 0, 0, 1, 0);
@@ -138,7 +143,7 @@ cmd_sysfile_info (void)
   for (r = 1, i = 0; i < dict_get_var_cnt (d); i++)
     {
       struct variable *v = dict_get_var (d, i);
-      int nvl = val_labs_count (v->val_labs);
+      const int nvl = val_labs_count (v->val_labs);
       
       if (r + 10 + nvl > nr)
        {
@@ -149,10 +154,11 @@ cmd_sysfile_info (void)
 
       r = describe_variable (v, t, r, AS_DICTIONARY);
     }
+
   tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, 3, r);
-  tab_vline (t, TAL_1, 0, 0, r);
   tab_vline (t, TAL_1, 1, 0, r);
   tab_vline (t, TAL_1, 3, 0, r);
+
   tab_resize (t, -1, r);
   tab_flags (t, SOMF_NO_TITLE);
   tab_submit (t);
@@ -166,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
@@ -176,7 +182,7 @@ cmd_display (void)
   int sorted;
 
   /* Variables to display. */
-  int n;
+  size_t n;
   struct variable **vl;
 
   if (lex_match_id ("MACROS"))
@@ -242,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)
              {
@@ -336,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;
@@ -344,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)
@@ -425,7 +431,7 @@ display_variables (struct variable **vl, int n, int as)
 /* Puts a description of variable V into table T starting at row R.
    The variable will be described in the format AS.  Returns the next
    row available for use in the table. */
-int 
+static int 
 describe_variable (struct variable *v, struct tab_table *t, int r, int as)
 {
   /* Put the name, var label, and position into the first row. */
@@ -458,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++;
@@ -569,7 +556,7 @@ compare_vectors_by_name (const void *a_, const void *b_)
   struct vector *a = *pa;
   struct vector *b = *pb;
   
-  return strcmp (a->name, b->name);
+  return strcasecmp (a->name, b->name);
 }
 
 /* Display a list of vectors.  If SORTED is nonzero then they are
@@ -589,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)
@@ -608,3 +595,14 @@ display_vectors (int sorted)
 
   free (vl);
 }
+
+
+
+
+
+
+
+
+
+
+