VARIABLE ROLE: New command.
[pspp] / src / language / dictionary / sys-file-info.c
index fc875384c1ad31b3f2afc94cef644745bff9e9ce..1ce94aa91fab83aee356ad0bf15bf31b39550f76 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -77,11 +77,11 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
   lex_match_id (lexer, "FILE");
   lex_match (lexer, T_EQUALS);
 
-  h = fh_parse (lexer, FH_REF_FILE);
+  h = fh_parse (lexer, FH_REF_FILE, NULL);
   if (!h)
     return CMD_FAILURE;
 
-  reader = sfm_open_reader (h, &d, &info);
+  reader = sfm_open_reader (h, NULL, &d, &info);
   if (!reader)
     {
       fh_unref (h);
@@ -138,8 +138,7 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
 
 
   tab_text (t, 0, 10, TAB_LEFT, _("Charset:"));
-  tab_text (t, 1, 10, TAB_LEFT,
-            dict_get_encoding(d) ? dict_get_encoding(d) : _("Unknown"));
+  tab_text (t, 1, 10, TAB_LEFT, dict_get_encoding (d));
 
 
   tab_submit (t);
@@ -164,6 +163,7 @@ cmd_sysfile_info (struct lexer *lexer, struct dataset *ds UNUSED)
   dict_destroy (d);
 
   fh_unref (h);
+  sfm_read_info_destroy (&info);
   return CMD_SUCCESS;
 }
 \f
@@ -197,10 +197,8 @@ cmd_display (struct lexer *lexer, struct dataset *ds)
        tab_output_text (TAB_LEFT,
                         _("The active dataset does not have a file label."));
       else
-       {
-         tab_output_text (TAB_LEFT | TAT_TITLE, _("File label:"));
-         tab_output_text (TAB_LEFT | TAB_FIX, dict_get_label (dataset_dict (ds)));
-       }
+        tab_output_text_format (TAB_LEFT, _("File label: %s"),
+                                dict_get_label (dataset_dict (ds)));
     }
   else
     {
@@ -379,12 +377,15 @@ static void
 display_attributes (struct tab_table *t, const struct attrset *set, int flags,
                     int c, int r)
 {
-  struct attrset_iterator i;
-  struct attribute *attr;
+  struct attribute **attrs;
+  size_t n_attrs;
+  size_t i;
 
-  for (attr = attrset_first (set, &i); attr != NULL;
-       attr = attrset_next (set, &i)) 
+  n_attrs = attrset_count (set);
+  attrs = attrset_sorted (set);
+  for (i = 0; i < n_attrs; i++)
     {
+      const struct attribute *attr = attrs[i];
       const char *name = attribute_get_name (attr);
       size_t n_values;
       size_t i;
@@ -396,13 +397,14 @@ display_attributes (struct tab_table *t, const struct attrset *set, int flags,
       for (i = 0; i < n_values; i++)
         {
           if (n_values > 1)
-            tab_text_format (t, c, r, TAB_LEFT, "%s[%d]", name, i + 1);
+            tab_text_format (t, c, r, TAB_LEFT, "%s[%zu]", name, i + 1);
           else
             tab_text (t, c, r, TAB_LEFT, name);
           tab_text (t, c + 1, r, TAB_LEFT, attribute_get_value (attr, i));
           r++;
         }
     }
+  free (attrs);
 }
 
 static void
@@ -440,7 +442,7 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
   /* Make sure that enough rows are allocated. */
   need_rows = 1;
   if (flags & ~(DF_DICT_INDEX | DF_VARIABLE_LABELS))
-    need_rows += 15;
+    need_rows += 16;
   if (flags & DF_VALUE_LABELS)
     need_rows += val_labs_count (var_get_value_labels (v));
   if (flags & (DF_ATTRIBUTES | DF_AT_ATTRIBUTES))
@@ -492,24 +494,28 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
         }
     }
   
-  /* Measurement level, display width, alignment. */
+  /* Measurement level, role, display width, alignment. */
   if (flags & DF_MISC) 
     {
-      enum measure m = var_get_measure (v);
-      enum alignment a = var_get_alignment (v);
+      enum var_role role = var_get_role (v);
 
       tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
                              _("Measure: %s"),
-                             m == MEASURE_NOMINAL ? _("Nominal")
-                             : m == MEASURE_ORDINAL ? _("Ordinal")
-                             : _("Scale"));
+                             measure_to_string (var_get_measure (v)));
       r++;
+
+      if (role != ROLE_NONE)
+        {
+          tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
+                                 _("Role: %s"), var_role_to_string (role));
+          r++;
+        }
+
       tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
                              _("Display Alignment: %s"),
-                             a == ALIGN_LEFT ? _("Left")
-                             : a == ALIGN_CENTRE ? _("Center")
-                             : _("Right"));
+                             alignment_to_string (var_get_alignment (v)));
       r++;
+
       tab_joint_text_format (t, 1, r, 2, r, TAB_LEFT,
                              _("Display Width: %d"),
                              var_get_display_width (v));
@@ -584,19 +590,9 @@ describe_variable (const struct variable *v, struct tab_table *t, int r,
       for (i = 0; i < n_labels; i++)
         {
           const struct val_lab *vl = labels[i];
-         char buf[MAX_STRING + 1];
 
-         if (var_is_alpha (v))
-           {
-              int width = var_get_width (v);
-             memcpy (buf, value_str (&vl->value, width), width);
-             buf[width] = 0;
-           }
-         else
-           sprintf (buf, "%g", vl->value.f);
-
-         tab_text (t, 1, r, TAB_NONE, buf);
-         tab_text (t, 2, r, TAB_LEFT, val_lab_get_label (vl));
+         tab_value (t, 1, r, TAB_NONE, &vl->value, v, NULL);
+         tab_text (t, 2, r, TAB_LEFT, val_lab_get_escaped_label (vl));
          r++;
        }
       free (labels);