posix-xprintf-functions.patch from patch #6230.
[pspp-builds.git] / src / data / sys-file-reader.c
index 058163b6b5106e35ad50e28772183b93d7ce5074..de9ae0d655f831e7097f696581bca5164ca8be8d 100644 (file)
 #include <setjmp.h>
 #include <stdlib.h>
 
-#include <libpspp/alloc.h>
 #include <libpspp/assertion.h>
 #include <libpspp/message.h>
 #include <libpspp/compiler.h>
-#include <libpspp/magic.h>
 #include <libpspp/misc.h>
 #include <libpspp/pool.h>
 #include <libpspp/str.h>
@@ -52,6 +50,7 @@
 #include "inttostr.h"
 #include "minmax.h"
 #include "unlocked-io.h"
+#include "xalloc.h"
 #include "xsize.h"
 
 #include "gettext.h"
@@ -510,8 +509,8 @@ read_variable_record (struct sfm_reader *r, struct dictionary *dict,
 
       len = read_int (r);
       if (len >= sizeof label)
-        sys_error (r, _("Variable %s has label of invalid length %u."),
-                   name, (unsigned int) len);
+        sys_error (r, _("Variable %s has label of invalid length %zu."),
+                   name, len);
       read_string (r, label, len + 1);
       var_set_label (var, label);
 
@@ -609,7 +608,7 @@ parse_format_spec (struct sfm_reader *r, unsigned int s,
   bool ok;
 
   if (!fmt_from_io (raw_type, &f.type))
-    sys_error (r, _("Unknown variable format %d."), (int) raw_type);
+    sys_error (r, _("Unknown variable format %"PRIu8"."), raw_type);
   f.w = w;
   f.d = d;
 
@@ -770,9 +769,9 @@ read_machine_integer_info (struct sfm_reader *r, size_t size, size_t count,
   int expected_integer_format;
 
   if (size != 4 || count != 8)
-    sys_error (r, _("Bad size (%u) or count (%u) field on record type 7, "
+    sys_error (r, _("Bad size (%zu) or count (%zu) field on record type 7, "
                     "subtype 3."),
-               (unsigned int) size, (unsigned int) count);
+                size, count);
 
   /* Save version info. */
   info->version_major = version_major;
@@ -820,8 +819,8 @@ read_machine_float_info (struct sfm_reader *r, size_t size, size_t count)
   double lowest = read_float (r);
 
   if (size != 8 || count != 3)
-    sys_error (r, _("Bad size (%u) or count (%u) on extension 4."),
-               (unsigned int) size, (unsigned int) count);
+    sys_error (r, _("Bad size (%zu) or count (%zu) on extension 4."),
+               size, count);
 
   if (sysmis != SYSMIS)
     sys_warn (r, _("File specifies unexpected value %g as SYSMIS."), sysmis);
@@ -842,8 +841,8 @@ read_display_parameters (struct sfm_reader *r, size_t size, size_t count,
   int i;
 
   if (count % 3 || n_vars != dict_get_var_cnt (dict))
-    sys_error (r, _("Bad size (%u) or count (%u) on extension 11."),
-               (unsigned int) size, (unsigned int) count);
+    sys_error (r, _("Bad size (%zu) or count (%zu) on extension 11."),
+               size, count);
 
   for (i = 0; i < n_vars; ++i)
     {
@@ -857,6 +856,11 @@ 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)
@@ -934,6 +938,7 @@ read_long_var_name_map (struct sfm_reader *r, size_t size, size_t count,
           var_set_short_name (var, i, short_names[i]);
           free (short_names[i]);
         }
+      free (short_names);
     }
   close_variable_to_value_map (r, map);
   r->has_long_var_names = true;
@@ -1077,8 +1082,8 @@ read_value_labels (struct sfm_reader *r,
   var_cnt = read_int (r);
   if (var_cnt < 1 || var_cnt > dict_get_var_cnt (dict))
     sys_error (r, _("Number of variables associated with a value label (%d) "
-                    "is not between 1 and the number of variables (%u)."),
-               var_cnt, (unsigned int) dict_get_var_cnt (dict));
+                    "is not between 1 and the number of variables (%zu)."),
+               var_cnt, dict_get_var_cnt (dict));
 
   /* Read the list of variables. */
   var = pool_nalloc (subpool, var_cnt, sizeof *var);