diff options
author | Jeff Davis <jdavis@postgresql.org> | 2025-10-18 16:25:11 -0700 |
---|---|---|
committer | Jeff Davis <jdavis@postgresql.org> | 2025-10-18 16:25:11 -0700 |
commit | 67a8b49e96caf0782b556521c8d6650e78f2d88e (patch) | |
tree | fc7ac80c779d294d9c2c08e1614e175b31cc7d8f | |
parent | da44d71e799d5b3f03256169334044ad817c1dd7 (diff) |
Add pg_iswxdigit(), useful for tsearch.
Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/0151ad01239e2cc7b3139644358cf8f7b9622ff7.camel@j-davis.com
-rw-r--r-- | src/backend/utils/adt/pg_locale.c | 12 | ||||
-rw-r--r-- | src/backend/utils/adt/pg_locale_builtin.c | 7 | ||||
-rw-r--r-- | src/backend/utils/adt/pg_locale_icu.c | 7 | ||||
-rw-r--r-- | src/backend/utils/adt/pg_locale_libc.c | 23 | ||||
-rw-r--r-- | src/include/utils/pg_locale.h | 2 |
5 files changed, 51 insertions, 0 deletions
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 50b25445f7a..3860ada1905 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1493,6 +1493,18 @@ pg_iswspace(pg_wchar wc, pg_locale_t locale) return locale->ctype->wc_isspace(wc, locale); } +bool +pg_iswxdigit(pg_wchar wc, pg_locale_t locale) +{ + if (locale->ctype == NULL) + return (wc <= (pg_wchar) 127 && + ((pg_char_properties[wc] & PG_ISDIGIT) || + ((wc >= 'A' && wc <= 'F') || + (wc >= 'a' && wc <= 'f')))); + else + return locale->ctype->wc_isxdigit(wc, locale); +} + pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale) { diff --git a/src/backend/utils/adt/pg_locale_builtin.c b/src/backend/utils/adt/pg_locale_builtin.c index 526ab3c6711..3dc611b50e1 100644 --- a/src/backend/utils/adt/pg_locale_builtin.c +++ b/src/backend/utils/adt/pg_locale_builtin.c @@ -164,6 +164,12 @@ wc_isspace_builtin(pg_wchar wc, pg_locale_t locale) } static bool +wc_isxdigit_builtin(pg_wchar wc, pg_locale_t locale) +{ + return pg_u_isxdigit(wc, !locale->builtin.casemap_full); +} + +static bool char_is_cased_builtin(char ch, pg_locale_t locale) { return IS_HIGHBIT_SET(ch) || @@ -196,6 +202,7 @@ static const struct ctype_methods ctype_methods_builtin = { .wc_isprint = wc_isprint_builtin, .wc_ispunct = wc_ispunct_builtin, .wc_isspace = wc_isspace_builtin, + .wc_isxdigit = wc_isxdigit_builtin, .char_is_cased = char_is_cased_builtin, .wc_tolower = wc_tolower_builtin, .wc_toupper = wc_toupper_builtin, diff --git a/src/backend/utils/adt/pg_locale_icu.c b/src/backend/utils/adt/pg_locale_icu.c index 9f0b4eead73..05bad202669 100644 --- a/src/backend/utils/adt/pg_locale_icu.c +++ b/src/backend/utils/adt/pg_locale_icu.c @@ -212,6 +212,12 @@ wc_isspace_icu(pg_wchar wc, pg_locale_t locale) return u_isspace(wc); } +static bool +wc_isxdigit_icu(pg_wchar wc, pg_locale_t locale) +{ + return u_isxdigit(wc); +} + static const struct ctype_methods ctype_methods_icu = { .strlower = strlower_icu, .strtitle = strtitle_icu, @@ -226,6 +232,7 @@ static const struct ctype_methods ctype_methods_icu = { .wc_isprint = wc_isprint_icu, .wc_ispunct = wc_ispunct_icu, .wc_isspace = wc_isspace_icu, + .wc_isxdigit = wc_isxdigit_icu, .char_is_cased = char_is_cased_icu, .wc_toupper = toupper_icu, .wc_tolower = tolower_icu, diff --git a/src/backend/utils/adt/pg_locale_libc.c b/src/backend/utils/adt/pg_locale_libc.c index f56b5dbdd37..34865ccf00e 100644 --- a/src/backend/utils/adt/pg_locale_libc.c +++ b/src/backend/utils/adt/pg_locale_libc.c @@ -173,6 +173,16 @@ wc_isspace_libc_sb(pg_wchar wc, pg_locale_t locale) } static bool +wc_isxdigit_libc_sb(pg_wchar wc, pg_locale_t locale) +{ +#ifndef WIN32 + return isxdigit_l((unsigned char) wc, locale->lt); +#else + return _isxdigit_l((unsigned char) wc, locale->lt); +#endif +} + +static bool wc_isdigit_libc_mb(pg_wchar wc, pg_locale_t locale) { return iswdigit_l((wint_t) wc, locale->lt); @@ -226,6 +236,16 @@ wc_isspace_libc_mb(pg_wchar wc, pg_locale_t locale) return iswspace_l((wint_t) wc, locale->lt); } +static bool +wc_isxdigit_libc_mb(pg_wchar wc, pg_locale_t locale) +{ +#ifndef WIN32 + return iswxdigit_l((wint_t) wc, locale->lt); +#else + return _iswxdigit_l((wint_t) wc, locale->lt); +#endif +} + static char char_tolower_libc(unsigned char ch, pg_locale_t locale) { @@ -313,6 +333,7 @@ static const struct ctype_methods ctype_methods_libc_sb = { .wc_isprint = wc_isprint_libc_sb, .wc_ispunct = wc_ispunct_libc_sb, .wc_isspace = wc_isspace_libc_sb, + .wc_isxdigit = wc_isxdigit_libc_sb, .char_is_cased = char_is_cased_libc, .char_tolower = char_tolower_libc, .wc_toupper = toupper_libc_sb, @@ -337,6 +358,7 @@ static const struct ctype_methods ctype_methods_libc_other_mb = { .wc_isprint = wc_isprint_libc_sb, .wc_ispunct = wc_ispunct_libc_sb, .wc_isspace = wc_isspace_libc_sb, + .wc_isxdigit = wc_isxdigit_libc_sb, .char_is_cased = char_is_cased_libc, .char_tolower = char_tolower_libc, .wc_toupper = toupper_libc_sb, @@ -357,6 +379,7 @@ static const struct ctype_methods ctype_methods_libc_utf8 = { .wc_isprint = wc_isprint_libc_mb, .wc_ispunct = wc_ispunct_libc_mb, .wc_isspace = wc_isspace_libc_mb, + .wc_isxdigit = wc_isxdigit_libc_mb, .char_is_cased = char_is_cased_libc, .char_tolower = char_tolower_libc, .wc_toupper = toupper_libc_mb, diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 009f5334a87..29c21d4413c 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -110,6 +110,7 @@ struct ctype_methods bool (*wc_isprint) (pg_wchar wc, pg_locale_t locale); bool (*wc_ispunct) (pg_wchar wc, pg_locale_t locale); bool (*wc_isspace) (pg_wchar wc, pg_locale_t locale); + bool (*wc_isxdigit) (pg_wchar wc, pg_locale_t locale); pg_wchar (*wc_toupper) (pg_wchar wc, pg_locale_t locale); pg_wchar (*wc_tolower) (pg_wchar wc, pg_locale_t locale); @@ -217,6 +218,7 @@ extern bool pg_iswgraph(pg_wchar wc, pg_locale_t locale); extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale); extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale); extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale); +extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale); extern pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale); extern pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale); |