https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78696

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The g/G handling looks indeed totally broken, not just for the > 10 precisions,
even for %.9g it assumes it will be in between 11 and 13 characters, which is
of course wrong.
But even generally, for all floating point printing, it seems the code doesn't
take into account that various parts of the floating point printing are derived
from locale and might not always have the same size.
Consider:
#include <locale.h>
#include <stdlib.h>

int __attribute__ ((noinline))
foo (char *x, size_t y, double z)
{
  return __builtin_snprintf (x, y, "%.2f", z);
}

int
main ()
{
  char x[100], y[100];
  setlocale (LC_ALL, "");
  int ret = foo (x, 100,  1.5);
  int ret2 = foo (y, 100, -1.5);
  __builtin_printf ("%d\t%s\n%d\t%s\n", ret, x, ret2, y);
  return 0;
}

This prints (with -fno-printf-return-value) in LC_ALL=C as well as
LC_ALL=en_US.UTF-8:
4       1.50
5       -1.50
in LC_ALL=cs_CZ.UTF-8:
4       1,50
5       -1,50
(note, comma used instead of dot, but still the same size), but with
ps_AF.UTF-8 it prints:
5       1٫50
6       -1٫50
because the Pashto decimal point character is U+066B, which is 2 bytes in
UTF-8.
For floating point printing, there can be also thousands grouping etc., again
locale specific.

Reply via email to