syntax-gen.c : Allow conversion specifiers of the form %.20f
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 24 Apr 2014 12:56:09 +0000 (14:56 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 28 Apr 2014 06:58:02 +0000 (08:58 +0200)
src/ui/syntax-gen.c
tests/ui/syntax-gen-test.c
tests/ui/syntax-gen.at

index 50f884a3ff2dbba7b28b21f0253dba80a6865fb1..e2795d7b3a2b5aa5c11ad654334b264766481a41 100644 (file)
@@ -232,6 +232,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 +244,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 +284,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;
           }
 
index 2c669290df8e7de8b4661c7261191a3028b51dd4..f99b4f44b435e9da23e70cb565ef28f82a8c167e 100644 (file)
@@ -32,6 +32,7 @@ main (void)
   test_runner ("An integer: %dEND", 98765);
   test_runner ("A floating point number: %gEND", 3.142);
   test_runner ("A floating point number with default precision: %fEND", 1.234);
+  test_runner ("A floating point number with given precision: %.20fEND", 1.234);
   test_runner ("A literal %%");
 
   test_runner ("and %ss a %sq of %d different %f examples %g of 100%% conversions.",
index 7a446d7e038e2dc21c8a342ec9d6a0b7598c9721..6b0f768fe239af6a0d921322201bdac040e2ebe6 100644 (file)
@@ -10,6 +10,7 @@ A syntax string containing non-printables: X'41204374726C4C0C63686172'END
 An integer: 98765END
 A floating point number: 3.142END
 A floating point number with default precision: 1.234000END
+A floating point number with given precision: 1.23399999999999998579END
 A literal %
 and finally a "concatination" of 6 different 20.309000 examples 23.09 of 100% conversions.
 ])