From 1133aae2eb44a012939a95613bf5cd1698f5b5e9 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 24 Apr 2014 14:56:09 +0200 Subject: [PATCH] syntax-gen.c : Allow conversion specifiers of the form %.20f --- src/ui/syntax-gen.c | 32 +++++++++++++++++++++++++++----- tests/ui/syntax-gen-test.c | 1 + tests/ui/syntax-gen.at | 1 + 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ui/syntax-gen.c b/src/ui/syntax-gen.c index 50f884a3ff..e2795d7b3a 100644 --- a/src/ui/syntax-gen.c +++ b/src/ui/syntax-gen.c @@ -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; } diff --git a/tests/ui/syntax-gen-test.c b/tests/ui/syntax-gen-test.c index 2c669290df..f99b4f44b4 100644 --- a/tests/ui/syntax-gen-test.c +++ b/tests/ui/syntax-gen-test.c @@ -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.", diff --git a/tests/ui/syntax-gen.at b/tests/ui/syntax-gen.at index 7a446d7e03..6b0f768fe2 100644 --- a/tests/ui/syntax-gen.at +++ b/tests/ui/syntax-gen.at @@ -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. ]) -- 2.30.2