changed abs to labs function to avoid warning
[pspp] / src / data / data-out.c
index 03aa67ff4e58813f12a45273ff3edd3c28fde53c..3f3611f00da2c032587c53971403e73ff502e35f 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012, 2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012, 2013, 2014 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
@@ -200,16 +200,24 @@ char *
 data_out_stretchy (const union value *input, const char *encoding,
                    const struct fmt_spec *format, struct pool *pool)
 {
-  struct fmt_spec wide_format;
 
   if (fmt_get_category (format->type) & (FMT_CAT_BASIC | FMT_CAT_CUSTOM))
     {
-      /* XXX In the common case this wastes memory for 40 bytes of mostly
-         spaces. */
+      const struct fmt_number_style *style = settings_get_style (format->type);
+      struct fmt_spec wide_format;
+      char tmp[128];
+      size_t size;
+
       wide_format.type = format->type;
       wide_format.w = 40;
       wide_format.d = format->d;
-      format = &wide_format;
+
+      size = format->w + style->extra_bytes + 1;
+      if (size <= sizeof tmp)
+        {
+          output_number (input, &wide_format, tmp);
+          return pool_strdup (pool, tmp + strspn (tmp, " "));
+        }
     }
 
   return data_out_pool (input, encoding, format, pool);
@@ -607,7 +615,7 @@ static void
 output_AHEX (const union value *input, const struct fmt_spec *format,
              char *output)
 {
-  output_hex (value_str (input, format->w), format->w / 2, output);
+  output_hex (value_str (input, format->w / 2), format->w / 2, output);
 }
 \f
 /* Decimal and scientific formatting. */
@@ -797,7 +805,7 @@ output_scientific (double number, const struct fmt_spec *format,
   {
     char *cp = strchr (p, 'E') + 1;
     long int exponent = strtol (cp, NULL, 10);
-    if (abs (exponent) > 999)
+    if (labs (exponent) > 999)
       return false;
     sprintf (cp, "%+04ld", exponent);
   }