syntax-gen: Test the category properly.
[pspp] / src / ui / syntax-gen.c
index dca3bd3c5b3cb778dde442553cebd40c83c23152..54a7845b70d44722c6b3bcb531def0556a3365fd 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2010, 2011, 2014 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
 #include "libpspp/cast.h"
 #include "libpspp/i18n.h"
 #include "libpspp/message.h"
+#include "data/settings.h"
 #include "libpspp/str.h"
 #include "libpspp/misc.h"
 
+#include "gl/c-ctype.h"
 #include "gl/ftoastr.h"
 
 /* Appends to OUTPUT a pair of hex digits for each byte in IN. */
@@ -147,7 +149,7 @@ syntax_gen_number (struct string *output,
 {
   assert (format == NULL || fmt_is_numeric (format->type));
   if (format != NULL
-      && (format->type
+      && (fmt_get_category (format->type)
           & (FMT_CAT_DATE | FMT_CAT_TIME | FMT_CAT_DATE_COMPONENT)))
     {
       union value v_in, v_out;
@@ -155,10 +157,11 @@ syntax_gen_number (struct string *output,
       bool ok;
 
       v_in.f = number;
-      s = data_out (&v_in, "FIXME",  format);
+      s = data_out (&v_in, "FIXME", format, settings_get_fmt_settings ());
 
       /* FIXME: UTF8 encoded strings will fail here */
-      error = data_in (ss_cstr (s), C_ENCODING, format->type, &v_out, 0, NULL);
+      error = data_in (ss_cstr (s), C_ENCODING, format->type,
+                       settings_get_fmt_settings (), &v_out, 0, NULL);
       ok = error == NULL;
       free (error);
 
@@ -195,10 +198,8 @@ syntax_gen_value (struct string *output, const union value *value, int width,
   if (width == 0)
     syntax_gen_number (output, value->f, format);
   else
-    {
-      char *s = CHAR_CAST_BUG (char *, value_str (value, width));
-      syntax_gen_string (output, ss_buffer (s, width));
-    }
+    syntax_gen_string (output,
+                       ss_buffer (CHAR_CAST (const char *, value->s), width));
 }
 
 /* Appends <low> THRU <high> to OUTPUT.  If LOW is LOWEST, then
@@ -232,6 +233,8 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
 {
   for (;;)
     {
+      char qualifier[16];
+      int precision = -1;
       char directive;
       size_t copy = strcspn (format, "%");
       ds_put_substring (output, ss_buffer (format, copy));
@@ -242,6 +245,17 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
       assert (*format == '%');
       format++;
       directive = *format++;
+      if (directive == '.')
+        {
+          int x = 0;
+          while (directive = *format++, c_isdigit (directive))
+            {
+              assert (x < 16);
+              qualifier[x++] = directive;
+            }
+          qualifier[x++] = '\0';
+          precision = atoi (qualifier);
+        }
       switch (directive)
         {
         case 's':
@@ -271,12 +285,21 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
         case 'f':
        case 'g':
           {
-           char conv[3];
+           char conv[32];
             double d = va_arg (args, double);
-           conv[0]='%';
-           conv[1]=directive;
-           conv[2]='\0';
-           ds_put_c_format (output, conv, d);
+            int x = 0;
+           conv[x++] = '%';
+            conv[x] = '\0';
+            if (precision != -1)
+              {
+                strcat (conv, ".");
+                strcat (conv, qualifier);
+                x += strlen (qualifier) + 1;
+              }
+           conv[x++] = directive;
+           conv[x++] = '\0';
+
+            ds_put_c_format (output, conv, d);
             break;
           }
 
@@ -301,9 +324,7 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
 
      %d: Same as printf's %d.
 
-     %fp: The double argument is formatted precisely as a PSPP
-          number, as if with a call to syntax_gen_number with a
-          null FORMAT argument.
+     %f %g: Same as printf.
 
      %%: Literal %.