From af164f31b9f5f00561d5831a72ab91cfe091f92e Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Wed, 15 Oct 2025 12:54:01 -0700 Subject: Add pg_iswalpha() and related functions. Per-character pg_locale_t APIs. Useful for tsearch parsing and potentially other places. Significant overlap with the regc_wc_isalpha() and related functions in regc_pg_locale.c, but this change leaves those intact for now. Discussion: https://postgr.es/m/0151ad01239e2cc7b3139644358cf8f7b9622ff7.camel@j-davis.com --- src/backend/utils/adt/pg_locale.c | 124 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) (limited to 'src/backend/utils/adt') diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 97c2ac1faf9..50b25445f7a 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -45,6 +45,7 @@ #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/pg_locale.h" +#include "utils/pg_locale_c.h" #include "utils/relcache.h" #include "utils/syscache.h" @@ -1149,6 +1150,13 @@ init_database_collation(void) PGLOCALE_SUPPORT_ERROR(dbform->datlocprovider); result->is_default = true; + + Assert((result->collate_is_c && result->collate == NULL) || + (!result->collate_is_c && result->collate != NULL)); + + Assert((result->ctype_is_c && result->ctype == NULL) || + (!result->ctype_is_c && result->ctype != NULL)); + ReleaseSysCache(tup); default_locale = result; @@ -1395,6 +1403,122 @@ pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, return locale->collate->strnxfrm_prefix(dest, destsize, src, srclen, locale); } +bool +pg_iswdigit(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISDIGIT)); + else + return locale->ctype->wc_isdigit(wc, locale); +} + +bool +pg_iswalpha(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISALPHA)); + else + return locale->ctype->wc_isalpha(wc, locale); +} + +bool +pg_iswalnum(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISALNUM)); + else + return locale->ctype->wc_isalnum(wc, locale); +} + +bool +pg_iswupper(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISUPPER)); + else + return locale->ctype->wc_isupper(wc, locale); +} + +bool +pg_iswlower(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISLOWER)); + else + return locale->ctype->wc_islower(wc, locale); +} + +bool +pg_iswgraph(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISGRAPH)); + else + return locale->ctype->wc_isgraph(wc, locale); +} + +bool +pg_iswprint(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISPRINT)); + else + return locale->ctype->wc_isprint(wc, locale); +} + +bool +pg_iswpunct(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISPUNCT)); + else + return locale->ctype->wc_ispunct(wc, locale); +} + +bool +pg_iswspace(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + (pg_char_properties[wc] & PG_ISSPACE)); + else + return locale->ctype->wc_isspace(wc, locale); +} + +pg_wchar +pg_towupper(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + { + if (wc <= (pg_wchar) 127) + return pg_ascii_toupper((unsigned char) wc); + return wc; + } + else + return locale->ctype->wc_toupper(wc, locale); +} + +pg_wchar +pg_towlower(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + { + if (wc <= (pg_wchar) 127) + return pg_ascii_tolower((unsigned char) wc); + return wc; + } + else + return locale->ctype->wc_tolower(wc, locale); +} + /* * char_is_cased() * -- cgit v1.2.3