/* 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
#include <data/identifier.h>
#include <data/settings.h>
+#include <data/value.h>
#include <data/variable.h>
#include <libpspp/assertion.h>
#include <libpspp/compiler.h>
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;
}
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)
{
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. */