* automake.mk: Add new file.
[pspp-builds.git] / src / data / data-out.c
index 4adaaa63a55f35fbbbca96a5e5a9d1e6498bb720..02ff06572fabcb1f282c2b9aa51319ee32ae0850 100644 (file)
@@ -24,7 +24,6 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <time.h>
-#include <gsl/gsl_math.h>
 
 #include "calendar.h"
 #include "format.h"
@@ -34,7 +33,6 @@
 #include <libpspp/assertion.h>
 #include <libpspp/float-format.h>
 #include <libpspp/integer-format.h>
-#include <libpspp/magic.h>
 #include <libpspp/message.h>
 #include <libpspp/misc.h>
 #include <libpspp/misc.h>
@@ -94,11 +92,12 @@ static void output_hex (const void *, size_t bytes, char *);
 \f
 /* Converts the INPUT value into printable form in the exactly
    FORMAT->W characters in OUTPUT according to format
-   specification FORMAT.  No null terminator is appended to the
-   buffer.  */
+   specification FORMAT.  The output is recoded from native form
+   into the given legacy character ENCODING.  No null terminator
+   is appended to the buffer.  */
 void
-data_out (const union value *input, const struct fmt_spec *format,
-          char *output)
+data_out_legacy (const union value *input, enum legacy_encoding encoding,
+                 const struct fmt_spec *format, char *output)
 {
   static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] =
     {
@@ -109,6 +108,17 @@ data_out (const union value *input, const struct fmt_spec *format,
   assert (fmt_check_output (format));
 
   converters[format->type] (input, format, output);
+  if (encoding != LEGACY_NATIVE
+      && fmt_get_category (format->type) != FMT_CAT_BINARY)
+    legacy_recode (LEGACY_NATIVE, output, encoding, output, format->w);
+}
+
+/* Same as data_out_legacy with ENCODING set to LEGACY_NATIVE.  */
+void
+data_out (const union value *value, const struct fmt_spec *format,
+          char *output)
+{
+  return data_out_legacy (value, LEGACY_NATIVE, format, output);
 }
 
 /* Returns the current output integer format. */
@@ -151,7 +161,7 @@ output_number (const union value *input, const struct fmt_spec *format,
 
   if (number == SYSMIS)
     output_missing (format, output);
-  else if (!gsl_finite (number))
+  else if (!isfinite (number))
     output_infinite (number, format, output);
   else
     {
@@ -711,16 +721,6 @@ output_scientific (double number, const struct fmt_spec *format,
   return true;
 }
 \f
-#ifndef HAVE_ROUND
-/* Return X rounded to the nearest integer,
-   rounding ties away from zero. */
-static double
-round (double x)
-{
-  return x >= 0.0 ? floor (x + .5) : ceil (x - .5);
-}
-#endif /* !HAVE_ROUND */
-
 /* Returns true if the magnitude represented by R should be
    rounded up when chopped off at DECIMALS decimal places, false
    if it should be rounded down. */
@@ -949,7 +949,7 @@ power256 (int x)
 static void
 output_infinite (double number, const struct fmt_spec *format, char *output)
 {
-  assert (!gsl_finite (number));
+  assert (!isfinite (number));
 
   if (format->w >= 3)
     {