Delete trailing whitespace at end of lines.
[pspp-builds.git] / src / data / format.c
index 8f2d0de98ed44215d84dcbd0ef5526950466a3a9..6c31ab5f586471d368a93fe874f43c8631047a95 100644 (file)
@@ -1,6 +1,5 @@
 /* PSPP - computes sample statistics.
    Copyright (C) 1997-9, 2000, 2006 Free Software Foundation, Inc.
-   Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -26,6 +25,7 @@
 
 #include <data/identifier.h>
 #include <data/settings.h>
+#include <data/value.h>
 #include <data/variable.h>
 #include <libpspp/assertion.h>
 #include <libpspp/compiler.h>
@@ -300,15 +300,15 @@ fmt_check_output (const struct fmt_spec *spec)
    TYPE and returns true if so.  Otherwise returns false and
    emits an error message. */
 bool
-fmt_check_type_compat (const struct fmt_spec *format, int var_type)
+fmt_check_type_compat (const struct fmt_spec *format, enum var_type var_type)
 {
-  assert (var_type == NUMERIC || var_type == ALPHA);
-  if ((var_type == ALPHA) != (fmt_is_string (format->type) != 0))
+  assert (var_type_is_valid (var_type));
+  if ((var_type == VAR_STRING) != (fmt_is_string (format->type) != 0))
     {
       char str[FMT_STRING_LEN_MAX + 1];
       msg (SE, _("%s variables are not compatible with %s format %s."),
-           var_type == ALPHA ? _("String") : _("Numeric"),
-           var_type == ALPHA ? _("numeric") : _("string"),
+           var_type == VAR_STRING ? _("String") : _("Numeric"),
+           var_type == VAR_STRING ? _("numeric") : _("string"),
            fmt_to_string (format, str));
       return false;
     }
@@ -321,7 +321,7 @@ fmt_check_type_compat (const struct fmt_spec *format, int var_type)
 bool
 fmt_check_width_compat (const struct fmt_spec *format, int width)
 {
-  if (!fmt_check_type_compat (format, width != 0 ? ALPHA : NUMERIC))
+  if (!fmt_check_type_compat (format, var_type_from_width (width)))
     return false;
   if (fmt_var_width (format) != width)
     {
@@ -366,7 +366,7 @@ fmt_to_string (const struct fmt_spec *f, char buffer[FMT_STRING_LEN_MAX + 1])
 /* Returns true if A and B are identical formats,
    false otherwise. */
 bool
-fmt_equal (const struct fmt_spec *a, const struct fmt_spec *b) 
+fmt_equal (const struct fmt_spec *a, const struct fmt_spec *b)
 {
   return a->type == b->type && a->w == b->w && a->d == b->d;
 }
@@ -494,7 +494,7 @@ fmt_is_numeric (enum fmt_type type)
    category.  Thus, the return value may be tested for equality
    or compared bitwise against a mask of FMT_CAT_* values. */
 enum fmt_category
-fmt_get_category (enum fmt_type type) 
+fmt_get_category (enum fmt_type type)
 {
   return get_fmt_desc (type)->category;
 }
@@ -504,7 +504,7 @@ fmt_get_category (enum fmt_type type)
 enum fmt_type
 fmt_input_to_output (enum fmt_type type)
 {
-  switch (fmt_get_category (type)) 
+  switch (fmt_get_category (type))
     {
     case FMT_CAT_STRING:
       return FMT_A;
@@ -586,6 +586,36 @@ fmt_date_template (enum fmt_type type)
       NOT_REACHED ();
     }
 }
+
+/* Returns a string of the form "$#,###.##" according to FMT,
+   which must be of type FMT_DOLLAR.  The caller must free the
+   string. */
+char *
+fmt_dollar_template (const struct fmt_spec *fmt)
+{
+  struct string s = DS_EMPTY_INITIALIZER;
+  int c;
+
+  assert (fmt->type == FMT_DOLLAR);
+
+  ds_put_char (&s, '$');
+  for (c = MAX (fmt->w - fmt->d - 1, 0); c > 0; )
+    {
+      ds_put_char (&s, '#');
+      if (--c % 4 == 0 && c > 0)
+        {
+          ds_put_char (&s, fmt_grouping_char (fmt->type));
+          --c;
+        }
+    }
+  if (fmt->d > 0)
+    {
+      ds_put_char (&s, fmt_decimal_char (fmt->type));
+      ds_put_char_multiple (&s, '#', fmt->d);
+    }
+
+  return ds_cstr (&s);
+}
 \f
 /* Returns true if TYPE is a valid format type,
    false otherwise. */