From: Bruno Haible Date: Tue, 14 Jul 2026 10:17:24 +0000 (+0200) Subject: vasnprintf, vasnwprintf: Revisit THOUSEP_MAXLEN. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f1bb8513ed2025fcf27b45bb0317fab7fe9f2e97;p=thirdparty%2Fgnulib.git vasnprintf, vasnwprintf: Revisit THOUSEP_MAXLEN. * lib/vasnprintf.c (THOUSEP_MAXLEN): Add comment. (VASNPRINTF): Don't use THOUSEP_MAXLEN here. --- diff --git a/ChangeLog b/ChangeLog index 572cef3c98..f78d9a2706 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2026-07-14 Bruno Haible + + vasnprintf, vasnwprintf: Revisit THOUSEP_MAXLEN. + * lib/vasnprintf.c (THOUSEP_MAXLEN): Add comment. + (VASNPRINTF): Don't use THOUSEP_MAXLEN here. + 2026-07-13 Bruno Haible vasnwprintf: Fix test failure on NetBSD. diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c index dd54b29427..750601cfb2 100644 --- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -1882,7 +1882,21 @@ is_borderline (const char *digits, size_t precision) /* Maximum number of units needed for a thousands separator, in the code that creates a temporary unit sequence of length - MAX_ROOM_NEEDED (...). */ + MAX_ROOM_NEEDED (...). + The tight bound is + (!USE_SNPRINTF && !group_ourselves + ? THOUSEP_CHAR_MAXLEN + : (WIDE_CHAR_VERSION && DCHAR_IS_TCHAR + ? THOUSEP_WCHAR_MAXLEN + : THOUSEP_CHAR_MAXLEN)) + But since group_ourselves is not known until runtime, we can only use this + upper bound: + (!USE_SNPRINTF + ? THOUSEP_CHAR_MAXLEN + : (WIDE_CHAR_VERSION && DCHAR_IS_TCHAR + ? THOUSEP_WCHAR_MAXLEN + : THOUSEP_CHAR_MAXLEN)) + */ #if USE_SNPRINTF && (WIDE_CHAR_VERSION && DCHAR_IS_TCHAR) # define THOUSEP_MAXLEN THOUSEP_WCHAR_MAXLEN #else @@ -5012,7 +5026,11 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, { /* A thousands separator needs to be inserted at most every 2 digits. This is the case in the ta_IN locale. */ - tmp_length = xsum (tmp_length, tmp_length / 2 * THOUSEP_MAXLEN); +# if WIDE_CHAR_VERSION + tmp_length = xsum (tmp_length, tmp_length / 2 * THOUSEP_WCHAR_MAXLEN); +# else + tmp_length = xsum (tmp_length, tmp_length / 2 * THOUSEP_CHAR_MAXLEN); +# endif } /* Account for sign, decimal point etc. */ tmp_length = xsum (tmp_length, 12);