{
for (;;)
{
+ char qualifier[16];
+ int precision = -1;
char directive;
size_t copy = strcspn (format, "%");
ds_put_substring (output, ss_buffer (format, copy));
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':
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;
}
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.",
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.
])