Patch #6262. New developers guide and resulting fixes and cleanups.
[pspp-builds.git] / src / data / data-out.c
index 335f6d86523e1892fecf2bc8cd88169d6594dbcd..26abc7cc112a9897f1ebf4b928a429000ed67b5a 100644 (file)
@@ -1,20 +1,18 @@
-/* PSPP - computes sample statistics.
+/* PSPP - a program for statistical analysis.
    Copyright (C) 1997-9, 2000, 2006 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 the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA. */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 #include <config.h>
 
 #include <stdint.h>
 #include <stdlib.h>
 #include <time.h>
-#include <gsl/gsl_math.h>
 
-#include "calendar.h"
-#include "format.h"
-#include "settings.h"
-#include "value.h"
+#include <data/calendar.h>
+#include <data/format.h>
+#include <data/settings.h>
+#include <data/value.h>
 
 #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>
 #include <libpspp/str.h>
 
 #include "minmax.h"
@@ -96,11 +91,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] =
     {
@@ -111,6 +107,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. */
@@ -153,7 +160,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
     {
@@ -713,16 +720,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. */
@@ -951,7 +948,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)
     {