syntax-gen.c : Allow conversion specifiers of the form %.20f
[pspp] / src / ui / syntax-gen.c
index fe88e62913d776cbc83331dbda25e6e09a018855..e2795d7b3a2b5aa5c11ad654334b264766481a41 100644 (file)
@@ -30,6 +30,7 @@
 #include "libpspp/i18n.h"
 #include "libpspp/message.h"
 #include "libpspp/str.h"
+#include "libpspp/misc.h"
 
 #include "gl/ftoastr.h"
 
@@ -176,7 +177,7 @@ syntax_gen_number (struct string *output,
     {
       char s[DBL_BUFSIZE_BOUND];
 
-      dtoastr (s, sizeof s, 0, 0, number);
+      c_dtoastr (s, sizeof s, 0, 0, number);
       ds_put_cstr (output, s);
     }
 }
@@ -231,6 +232,9 @@ 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));
       format += copy;
@@ -239,7 +243,19 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
         return;
       assert (*format == '%');
       format++;
-      switch (*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':
           {
@@ -266,16 +282,23 @@ syntax_gen_pspp_valist (struct string *output, const char *format,
           break;
 
         case 'f':
+       case 'g':
           {
+           char conv[32];
             double d = va_arg (args, double);
-            switch (*format++)
+            int x = 0;
+           conv[x++] = '%';
+            conv[x] = '\0';
+            if (precision != -1)
               {
-              case 'p':
-                ds_put_c_format (output, "%f", d);
-                break;
-              default:
-                NOT_REACHED ();
+                strcat (conv, ".");
+                strcat (conv, qualifier);
+                x += strlen (qualifier) + 1;
               }
+           conv[x++] = directive;
+           conv[x++] = '\0';
+            
+            ds_put_c_format (output, conv, d);
             break;
           }
 
@@ -300,9 +323,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 %.