From b2ddd005740f73c6d4a9e2441616926fcea94684 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 29 Oct 2025 17:54:06 +1300 Subject: [PATCH 7/8] Use compact notation for isXXX_l() wrappers. Instead of loads of repeating functions for the PG_WCHAR_CHAR and PG_WCHAR_UTF32 handlers, make a macro to avoid typos, as was already done for the new PG_WCHAR_CUSTOM handlers. --- src/backend/utils/adt/pg_locale_libc.c | 166 +++++++------------------ 1 file changed, 43 insertions(+), 123 deletions(-) diff --git a/src/backend/utils/adt/pg_locale_libc.c b/src/backend/utils/adt/pg_locale_libc.c index b33897c683e..fc758e2607c 100644 --- a/src/backend/utils/adt/pg_locale_libc.c +++ b/src/backend/utils/adt/pg_locale_libc.c @@ -206,134 +206,54 @@ DEFINE_WC_CTYPE_LIBC_CUSTOM(punct); DEFINE_WC_CTYPE_LIBC_CUSTOM(space); DEFINE_WC_CTYPE_LIBC_CUSTOM(xdigit); -static bool -wc_isdigit_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isdigit_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isalpha_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isalpha_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isalnum_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isalnum_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isupper_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isupper_l((unsigned char) wc, locale->lt); -} - -static bool -wc_islower_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return islower_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isgraph_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isgraph_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isprint_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isprint_l((unsigned char) wc, locale->lt); -} - -static bool -wc_ispunct_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return ispunct_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isspace_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isspace_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isxdigit_libc_sb(pg_wchar wc, pg_locale_t locale) -{ - return isxdigit_l((unsigned char) wc, locale->lt); -} - -static bool -wc_isdigit_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswdigit_l((wint_t) wc, locale->lt); -} - -static bool -wc_isalpha_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswalpha_l((wint_t) wc, locale->lt); -} - -static bool -wc_isalnum_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswalnum_l((wint_t) wc, locale->lt); -} - -static bool -wc_isupper_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswupper_l((wint_t) wc, locale->lt); -} - -static bool -wc_islower_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswlower_l((wint_t) wc, locale->lt); -} - -static bool -wc_isgraph_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswgraph_l((wint_t) wc, locale->lt); -} - -static bool -wc_isprint_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswprint_l((wint_t) wc, locale->lt); +/* + * Generate a function that passes single-byte characters directly to + * functions. This is suitable for PG_WCHAR_CHAR encodings, where pg_wchar + * holds a one byte. + */ +#define DEFINE_WC_CTYPE_LIBC_SB(ctype) \ +static bool \ +wc_is##ctype##_libc_sb(pg_wchar wc, pg_locale_t locale) \ +{ \ + return is##ctype##_l((unsigned char) wc, locale->lt); \ } -static bool -wc_ispunct_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswpunct_l((wint_t) wc, locale->lt); -} +DEFINE_WC_CTYPE_LIBC_SB(digit); +DEFINE_WC_CTYPE_LIBC_SB(alpha); +DEFINE_WC_CTYPE_LIBC_SB(alnum); +DEFINE_WC_CTYPE_LIBC_SB(upper); +DEFINE_WC_CTYPE_LIBC_SB(lower); +DEFINE_WC_CTYPE_LIBC_SB(graph); +DEFINE_WC_CTYPE_LIBC_SB(print); +DEFINE_WC_CTYPE_LIBC_SB(punct); +DEFINE_WC_CTYPE_LIBC_SB(space); +DEFINE_WC_CTYPE_LIBC_SB(xdigit); -static bool -wc_isspace_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && - iswspace_l((wint_t) wc, locale->lt); +/* + * Generate a function that passes UTF-32 characters directly to + * functions, This is suitable for PG_WCHAR_UTF32 encodings, with the + * assumption that any libc locale that uses UTF-8 as its char encoding must + * use UTF-32 or UTF-16 for its wchar_t encoding. For the UTF-16 case, just + * return false for codepoints outside the BMP. + */ +#define DEFINE_WC_CTYPE_LIBC_UTF32(ctype) \ +static bool \ +wc_is##ctype##_libc_utf32(pg_wchar wc, pg_locale_t locale) \ +{ \ + return (sizeof(wchar_t) >= 4 || wc <= 0xffff) && \ + isw##ctype##_l((wint_t) wc, locale->lt); \ } -static bool -wc_isxdigit_libc_utf32(pg_wchar wc, pg_locale_t locale) -{ - return iswxdigit_l((wint_t) wc, locale->lt); -} +DEFINE_WC_CTYPE_LIBC_UTF32(digit); +DEFINE_WC_CTYPE_LIBC_UTF32(alpha); +DEFINE_WC_CTYPE_LIBC_UTF32(alnum); +DEFINE_WC_CTYPE_LIBC_UTF32(upper); +DEFINE_WC_CTYPE_LIBC_UTF32(lower); +DEFINE_WC_CTYPE_LIBC_UTF32(graph); +DEFINE_WC_CTYPE_LIBC_UTF32(print); +DEFINE_WC_CTYPE_LIBC_UTF32(punct); +DEFINE_WC_CTYPE_LIBC_UTF32(space); +DEFINE_WC_CTYPE_LIBC_UTF32(xdigit); static char char_tolower_libc(unsigned char ch, pg_locale_t locale) -- 2.50.1 (Apple Git-155)