Added coefficient-handling routines
[pspp-builds.git] / src / data-out.c
index d21d2902e1e5fcfe383b0872c1dabed27ef75c88..c9c17a5e642fd6f14fcefe1472df9586dd44bdae 100644 (file)
@@ -34,6 +34,9 @@
 #include "str.h"
 #include "var.h"
 
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
 #include "debug-print.h"
 \f
 /* Public functions. */
@@ -53,7 +56,7 @@ static string_converter convert_A, convert_AHEX;
 /* Converts binary value V into printable form in the exactly
    FP->W character in buffer S according to format specification
    FP.  No null terminator is appended to the buffer.  */
-void
+bool
 data_out (char *s, const struct fmt_spec *fp, const union value *v)
 {
   int cat = formats[fp->type].cat;
@@ -70,7 +73,7 @@ data_out (char *s, const struct fmt_spec *fp, const union value *v)
         {
           memset (s, ' ', fp->w);
           s[fp->w - fp->d - 1] = '.';
-          return;
+          return true;
         }
 
       /* Handle decimal shift. */
@@ -186,6 +189,8 @@ data_out (char *s, const struct fmt_spec *fp, const union value *v)
   /* Error handling. */
   if (!ok)
     strncpy (s, "ERROR", fp->w);
+  
+  return ok;
 }
 
 /* Converts V into S in F format with width W and D decimal places,
@@ -960,7 +965,7 @@ year4 (int year)
 static int
 try_CCx (char *dst, const struct fmt_spec *fp, double number)
 {
-  const struct set_cust_currency *cc = get_cc(fp->type - FMT_CCA);
+  const struct custom_currency *cc = get_cc(fp->type - FMT_CCA);
 
   struct fmt_spec f;
 
@@ -970,7 +975,7 @@ try_CCx (char *dst, const struct fmt_spec *fp, double number)
 
   /* Determine length available, decimal character for number
      proper. */
-  f.type = cc->decimal == get_decimal() ? FMT_COMMA : FMT_DOT;
+  f.type = cc->decimal == get_decimal () ? FMT_COMMA : FMT_DOT;
   f.w = fp->w - strlen (cc->prefix) - strlen (cc->suffix);
   if (number < 0)
     f.w -= strlen (cc->neg_prefix) + strlen (cc->neg_suffix) - 1;
@@ -1116,6 +1121,7 @@ format_and_round (char *dst, double number, const struct fmt_spec *fp,
 
   sprintf (buf, "%.*f", decimals, number);
 
+  /* Omit integer part if it's 0. */
   if (!memcmp (buf, "0.", 2))
     memmove (buf, buf + 1, strlen (buf));
   else if (!memcmp (buf, "-0.", 3))
@@ -1215,6 +1221,10 @@ format_and_round (char *dst, double number, const struct fmt_spec *fp,
         }
     }
 
+  /* Omit `-' if value output is zero. */
+  if (buf[0] == '-' && buf[strspn (buf, "-.0")] == '\0')
+    memmove (buf, buf + 1, strlen (buf));
+
   buf_copy_str_lpad (dst, fp->w, buf);
   return 1;
 }