Handle variable display parameters record with only 2 data items per
authorBen Pfaff <blp@gnu.org>
Fri, 7 Dec 2007 05:22:06 +0000 (05:22 +0000)
committerBen Pfaff <blp@gnu.org>
Fri, 7 Dec 2007 05:22:06 +0000 (05:22 +0000)
variable.  Reported by Guido Gay <gay@irer.it>.

doc/dev/system-file-format.texi
src/data/ChangeLog
src/data/sys-file-reader.c

index 193c66012c3fde1b37f15b8f0c3a0eaddb22e067..70fa385c7525efea051a5bfb90fbf046bdb7e14b 100644 (file)
@@ -606,7 +606,7 @@ int32               count;
 
 /* @r{Repeated @code{count} times}. */
 int32               measure;
-int32               width;
+int32               width;           /* @r{Not always present.} */
 int32               alignment;
 @end example
 
@@ -622,7 +622,7 @@ The size of @code{int32}.  Always set to 4.
 
 @item int32 count;
 The number of sets of variable display parameters (ordinarily the
-number of variables in the dictionary), times 3.
+number of variables in the dictionary), times 2 or 3.
 @end table
 
 The remaining members are repeated @code{count} times, in the same
@@ -648,6 +648,10 @@ as nominal scale.
 @item int32 width;
 The width of the display column for the variable in characters.
 
+This field is present if @var{count} is 3 times the number of
+variables in the dictionary.  It is omitted if @var{count} is 2 times
+the number of variables.
+
 @item int32 alignment;
 The alignment of the variable for display purposes:
 
index 6c3b4518f8b47794a67cf2d740320bd568e91af4..e25c3984df8c9333a1f06ac803d3449def61d750 100644 (file)
@@ -1,3 +1,11 @@
+2007-12-06  Ben Pfaff  <blp@gnu.org>
+
+       Patch #6303.
+
+       * sys-file-reader.c (read_display_parameters): Handle variable
+       display parameters record with only 2 data items per variable.
+       Reported by Guido Gay <gay@irer.it>.
+
 2007-12-04  Ben Pfaff  <blp@gnu.org>
 
        * identifier.c (lex_id_match_n): New function.
index 1d172adefd46a65d9751832ffc10a7df3cf90efc..1882943003572ef8b9b28a1d2c73a7a94bd7a776 100644 (file)
@@ -845,19 +845,36 @@ static void
 read_display_parameters (struct sfm_reader *r, size_t size, size_t count,
                          struct dictionary *dict)
 {
-  const size_t n_vars = count / 3 ;
+  size_t n_vars;
+  bool includes_width;
   bool warned = false;
-  int i;
+  size_t i;
 
-  if (count % 3 || n_vars != dict_get_var_cnt (dict))
-    sys_error (r, _("Bad size (%zu) or count (%zu) on extension 11."),
-               size, count);
+  if (size != 4)
+    {
+      sys_warn (r, _("Bad size %zu on extension 11."), size);
+      skip_bytes (r, size * count);
+      return;
+    }
+
+  n_vars = dict_get_var_cnt (dict);
+  if (count == 3 * n_vars)
+    includes_width = true;
+  else if (count == 2 * n_vars)
+    includes_width = false;
+  else
+    {
+      sys_warn (r, _("Extension 11 has bad count %zu (for %zu variables)."),
+                count, n_vars);
+      skip_bytes (r, size * count);
+      return;
+    }
 
   for (i = 0; i < n_vars; ++i)
     {
       struct variable *v = dict_get_var (dict, i);
       int measure = read_int (r);
-      int width = read_int (r);
+      int width = includes_width ? read_int (r) : 0;
       int align = read_int (r);
 
       /* SPSS 14 sometimes seems to set string variables' measure
@@ -865,16 +882,13 @@ read_display_parameters (struct sfm_reader *r, size_t size, size_t count,
       if (0 == measure && var_is_alpha (v))
         measure = 1;
 
-      /* Older versions (SPSS 9.0) sometimes set the display width
-        to zero.  This causes confusion especially in the GUI */
-      if (0 == width)
-       width = 8;
-
       if (measure < 1 || measure > 3 || align < 0 || align > 2)
         {
           if (!warned)
-            sys_warn (r, _("Invalid variable display parameters.  "
-                           "Default parameters substituted."));
+            sys_warn (r, _("Invalid variable display parameters "
+                           "for variable %zu (%s).  "
+                           "Default parameters substituted."),
+                      i, var_get_name (v));
           warned = true;
           continue;
         }
@@ -882,10 +896,15 @@ read_display_parameters (struct sfm_reader *r, size_t size, size_t count,
       var_set_measure (v, (measure == 1 ? MEASURE_NOMINAL
                            : measure == 2 ? MEASURE_ORDINAL
                            : MEASURE_SCALE));
-      var_set_display_width (v, width);
       var_set_alignment (v, (align == 0 ? ALIGN_LEFT
                              : align == 1 ? ALIGN_RIGHT
                              : ALIGN_CENTRE));
+
+      /* Older versions (SPSS 9.0) sometimes set the display
+        width to zero.  This causes confusion in the GUI, so
+        only set the width if it is nonzero. */
+      if (width > 0)
+        var_set_display_width (v, width);
     }
 }