pspp-convert: Add options for selecting variables and controlling output.
[pspp] / src / data / data-out.c
index 157335cbf4a82d2d184eac78655613ee8ecd20cd..cbd114b8e58cf8399caba921df0c12168cca4b90 100644 (file)
@@ -113,7 +113,7 @@ data_out_recode (const union value *input, const char *input_encoding,
   assert (fmt_check_output (format));
   if (format->type == FMT_A)
     {
-      char *in = CHAR_CAST (char *, value_str (input, format->w));
+      char *in = CHAR_CAST (char *, input->s);
       char *out = recode_string (output_encoding, input_encoding,
                                  in, format->w);
       ds_put_cstr (output, out);
@@ -157,21 +157,21 @@ binary_to_utf8 (const char *in, struct pool *pool)
    VALUE must be the correct width for FORMAT, that is, its width must be
    fmt_var_width(FORMAT).
 
-   ENCODING must be the encoding of INPUT.  Normally this can be obtained by
-   calling dict_get_encoding() on the dictionary with which INPUT is
-   associated.  ENCODING is only important when FORMAT's type is FMT_A.
+   INPUT_ENCODING must be the encoding of INPUT.  Normally this can be obtained
+   by calling dict_get_encoding() on the dictionary with which INPUT is
+   associated.  INPUT_ENCODING is only important when FORMAT's type is FMT_A.
 
    The return value is dynamically allocated, and must be freed by the caller.
    If POOL is non-null, then the return value is allocated on that pool.  */
 char *
-data_out_pool (const union value *input, const char *encoding,
+data_out_pool (const union value *input, const char *input_encoding,
               const struct fmt_spec *format, struct pool *pool)
 {
   assert (fmt_check_output (format));
   if (format->type == FMT_A)
     {
-      char *in = CHAR_CAST (char *, value_str (input, format->w));
-      return recode_string_pool (UTF8, encoding, in, format->w, pool);
+      char *in = CHAR_CAST (char *, input->s);
+      return recode_string_pool (UTF8, input_encoding, in, format->w, pool);
     }
   else if (fmt_get_category (format->type) == FMT_CAT_BINARY)
     {
@@ -224,9 +224,10 @@ data_out_stretchy (const union value *input, const char *encoding,
 }
 
 char *
-data_out (const union value *input, const char *encoding, const struct fmt_spec *format)
+data_out (const union value *input, const char *input_encoding,
+          const struct fmt_spec *format)
 {
-  return data_out_pool (input, encoding, format, NULL);
+  return data_out_pool (input, input_encoding, format, NULL);
 }
 
 \f
@@ -473,7 +474,8 @@ output_date (const union value *input, const struct fmt_spec *format,
             {
               if (year <= 9999)
                 p += sprintf (p, "%04d", year);
-              else if (format->type == FMT_DATETIME)
+              else if (format->type == FMT_DATETIME
+                       || format->type == FMT_YMDHMS)
                 p = stpcpy (p, "****");
               else
                 goto overflow;
@@ -508,10 +510,14 @@ output_date (const union value *input, const struct fmt_spec *format,
           number = fmod (number, 60. * 60.);
           break;
         case 'M':
+          if (number < 0)
+            *p++ = '-';
+          number = fabs (number);
           p += sprintf (p, "%02d", (int) floor (number / 60.));
           number = fmod (number, 60.);
           excess_width = format->w - (p - tmp);
-          if (excess_width < 0)
+          if (excess_width < 0
+              || (format->type == FMT_MTIME && excess_width < 3))
             goto overflow;
           if (excess_width == 3 || excess_width == 4
               || (excess_width >= 5 && format->d == 0))
@@ -615,7 +621,7 @@ static void
 output_AHEX (const union value *input, const struct fmt_spec *format,
              char *output)
 {
-  output_hex (value_str (input, format->w / 2), format->w / 2, output);
+  output_hex (input->s, format->w / 2, output);
 }
 \f
 /* Decimal and scientific formatting. */
@@ -805,7 +811,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);
   }