1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-06 07:49:08 +03:00

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
This commit is contained in:
Jeff Davis
2025-10-15 12:54:01 -07:00
parent 688dc6299a
commit af164f31b9
4 changed files with 302 additions and 144 deletions

View File

@@ -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()
*