2025-09-05 Paul Eggert <eggert@cs.ucla.edu>
+ dfa, propername-lite, quotearg: prefer mbszero
+ Problem reported by Collin Funk in:
+ https://lists.gnu.org/r/bug-gnulib/2025-09/msg00063.html
+ * lib/dfa.c (mbszero) [GAWK]: Omit unnecessary parens.
+ * lib/localeinfo.c (mbszero) [GAWK]: New macro, copied from dfa.c.
+ (is_using_utf8, init_localeinfo): Use it.
+ * lib/propername-lite.c (proper_name_lite):
+ * lib/quotearg.c (gettext_quote):
+ Prefer mbszero to initializing the entire mbstate_t.
+
unlocked-io: also deal with fileno
This shouldn’t affect performance on glibc, where fileno and
fileno_unlocked are aliases under the theory that no locking is needed.
# define c32tob wctob
# define c32isprint iswprint
# define c32isspace iswspace
-# define mbszero(p) memset ((p), 0, sizeof (mbstate_t))
+# define mbszero(p) memset (p, 0, sizeof (mbstate_t))
#else
/* Use ISO C 11 + gnulib API. */
# include <uchar.h>
# define mbrtoc32 mbrtowc
# define c32tolower towlower
# define c32toupper towupper
+# define mbszero(p) memset (p, 0, sizeof (mbstate_t))
#else
/* Use ISO C 11 + gnulib API. */
# include <uchar.h>
is_using_utf8 (void)
{
char32_t wc;
- mbstate_t mbs = {0};
+ mbstate_t mbs; mbszero (&mbs);
return mbrtoc32 (&wc, "\xc4\x80", 2, &mbs) == 2 && wc == 0x100;
}
{
char c = i;
unsigned char uc = i;
- mbstate_t s = {0};
+ mbstate_t s; mbszero (&s);
char32_t wc;
size_t len = mbrtoc32 (&wc, &c, 1, &s);
localeinfo->sbclen[uc] = len <= 1 ? 1 : - (int) - len;
/* If DF BF decodes to 07FF, assume it is UTF-8. */
static char const utf07FF[] = { 0xDF, 0xBF };
char32_t w;
- mbstate_t mbstate = {0,};
- if (mbrtoc32 (&w, utf07FF, 2, &mbstate) == 2 && w == 0x07FF)
+ mbstate_t mbs; mbszero (&mbs);
+ if (mbrtoc32 (&w, utf07FF, 2, &mbs) == 2 && w == 0x07FF)
return name_utf8;
#endif
has other dependencies. */
static char const quote[][4] = { "\xe2\x80\x98", "\xe2\x80\x99" };
char32_t w;
- mbstate_t mbstate = {0,};
- if (mbrtoc32 (&w, quote[0], 3, &mbstate) == 3 && w == 0x2018)
+ mbstate_t mbs; mbszero (&mbs);
+ if (mbrtoc32 (&w, quote[0], 3, &mbs) == 3 && w == 0x2018)
return quote[msgid[0] == '\''];
return (s == clocale_quoting_style ? "\"" : "'");
}
else
{
- mbstate_t mbstate;
- mbszero (&mbstate);
+ mbstate_t mbs; mbszero (&mbs);
m = 0;
printable = true;
{
char32_t w;
size_t bytes = mbrtoc32 (&w, &arg[i + m],
- argsize - (i + m), &mbstate);
+ argsize - (i + m), &mbs);
if (bytes == 0)
break;
else if (bytes == (size_t) -1)
m += bytes;
}
#if !GNULIB_MBRTOC32_REGULAR
- if (mbsinit (&mbstate))
+ if (mbsinit (&mbs))
#endif
break;
}