🌐 AI搜索 & 代理 主页
Skip to content

Commit 630706c

Browse files
committed
Add pg_iswcased().
True if character has multiple case forms. Will be a useful multibyte-aware replacement for char_is_cased(). Reviewed-by: Chao Li <li.evan.chao@gmail.com> Reviewed-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://postgr.es/m/450ceb6260cad30d7afdf155d991a9caafee7c0d.camel@j-davis.com
1 parent 1e49315 commit 630706c

File tree

5 files changed

+44
-0
lines changed

5 files changed

+44
-0
lines changed

src/backend/utils/adt/pg_locale.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,6 +1588,17 @@ pg_iswxdigit(pg_wchar wc, pg_locale_t locale)
15881588
return locale->ctype->wc_isxdigit(wc, locale);
15891589
}
15901590

1591+
bool
1592+
pg_iswcased(pg_wchar wc, pg_locale_t locale)
1593+
{
1594+
/* for the C locale, Cased and Alpha are equivalent */
1595+
if (locale->ctype == NULL)
1596+
return (wc <= (pg_wchar) 127 &&
1597+
(pg_char_properties[wc] & PG_ISALPHA));
1598+
else
1599+
return locale->ctype->wc_iscased(wc, locale);
1600+
}
1601+
15911602
pg_wchar
15921603
pg_towupper(pg_wchar wc, pg_locale_t locale)
15931604
{

src/backend/utils/adt/pg_locale_builtin.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ wc_isxdigit_builtin(pg_wchar wc, pg_locale_t locale)
185185
return pg_u_isxdigit(to_char32(wc), !locale->builtin.casemap_full);
186186
}
187187

188+
static bool
189+
wc_iscased_builtin(pg_wchar wc, pg_locale_t locale)
190+
{
191+
return pg_u_prop_cased(to_char32(wc));
192+
}
193+
188194
static bool
189195
char_is_cased_builtin(char ch, pg_locale_t locale)
190196
{
@@ -220,6 +226,7 @@ static const struct ctype_methods ctype_methods_builtin = {
220226
.wc_isspace = wc_isspace_builtin,
221227
.wc_isxdigit = wc_isxdigit_builtin,
222228
.char_is_cased = char_is_cased_builtin,
229+
.wc_iscased = wc_iscased_builtin,
223230
.wc_tolower = wc_tolower_builtin,
224231
.wc_toupper = wc_toupper_builtin,
225232
};

src/backend/utils/adt/pg_locale_icu.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ wc_isxdigit_icu(pg_wchar wc, pg_locale_t locale)
223223
return u_isxdigit(wc);
224224
}
225225

226+
static bool
227+
wc_iscased_icu(pg_wchar wc, pg_locale_t locale)
228+
{
229+
return u_hasBinaryProperty(wc, UCHAR_CASED);
230+
}
231+
226232
static const struct ctype_methods ctype_methods_icu = {
227233
.strlower = strlower_icu,
228234
.strtitle = strtitle_icu,
@@ -239,6 +245,7 @@ static const struct ctype_methods ctype_methods_icu = {
239245
.wc_isspace = wc_isspace_icu,
240246
.wc_isxdigit = wc_isxdigit_icu,
241247
.char_is_cased = char_is_cased_icu,
248+
.wc_iscased = wc_iscased_icu,
242249
.wc_toupper = toupper_icu,
243250
.wc_tolower = tolower_icu,
244251
};

src/backend/utils/adt/pg_locale_libc.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ wc_isxdigit_libc_sb(pg_wchar wc, pg_locale_t locale)
184184
#endif
185185
}
186186

187+
static bool
188+
wc_iscased_libc_sb(pg_wchar wc, pg_locale_t locale)
189+
{
190+
return isupper_l((unsigned char) wc, locale->lt) ||
191+
islower_l((unsigned char) wc, locale->lt);
192+
}
193+
187194
static bool
188195
wc_isdigit_libc_mb(pg_wchar wc, pg_locale_t locale)
189196
{
@@ -248,6 +255,13 @@ wc_isxdigit_libc_mb(pg_wchar wc, pg_locale_t locale)
248255
#endif
249256
}
250257

258+
static bool
259+
wc_iscased_libc_mb(pg_wchar wc, pg_locale_t locale)
260+
{
261+
return iswupper_l((wint_t) wc, locale->lt) ||
262+
iswlower_l((wint_t) wc, locale->lt);
263+
}
264+
251265
static bool
252266
char_is_cased_libc(char ch, pg_locale_t locale)
253267
{
@@ -332,6 +346,7 @@ static const struct ctype_methods ctype_methods_libc_sb = {
332346
.wc_isspace = wc_isspace_libc_sb,
333347
.wc_isxdigit = wc_isxdigit_libc_sb,
334348
.char_is_cased = char_is_cased_libc,
349+
.wc_iscased = wc_iscased_libc_sb,
335350
.wc_toupper = toupper_libc_sb,
336351
.wc_tolower = tolower_libc_sb,
337352
};
@@ -357,6 +372,7 @@ static const struct ctype_methods ctype_methods_libc_other_mb = {
357372
.wc_isspace = wc_isspace_libc_sb,
358373
.wc_isxdigit = wc_isxdigit_libc_sb,
359374
.char_is_cased = char_is_cased_libc,
375+
.wc_iscased = wc_iscased_libc_sb,
360376
.wc_toupper = toupper_libc_sb,
361377
.wc_tolower = tolower_libc_sb,
362378
};
@@ -378,6 +394,7 @@ static const struct ctype_methods ctype_methods_libc_utf8 = {
378394
.wc_isspace = wc_isspace_libc_mb,
379395
.wc_isxdigit = wc_isxdigit_libc_mb,
380396
.char_is_cased = char_is_cased_libc,
397+
.wc_iscased = wc_iscased_libc_mb,
381398
.wc_toupper = toupper_libc_mb,
382399
.wc_tolower = tolower_libc_mb,
383400
};

src/include/utils/pg_locale.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ struct ctype_methods
122122
bool (*wc_ispunct) (pg_wchar wc, pg_locale_t locale);
123123
bool (*wc_isspace) (pg_wchar wc, pg_locale_t locale);
124124
bool (*wc_isxdigit) (pg_wchar wc, pg_locale_t locale);
125+
bool (*wc_iscased) (pg_wchar wc, pg_locale_t locale);
125126
pg_wchar (*wc_toupper) (pg_wchar wc, pg_locale_t locale);
126127
pg_wchar (*wc_tolower) (pg_wchar wc, pg_locale_t locale);
127128

@@ -214,6 +215,7 @@ extern bool pg_iswprint(pg_wchar wc, pg_locale_t locale);
214215
extern bool pg_iswpunct(pg_wchar wc, pg_locale_t locale);
215216
extern bool pg_iswspace(pg_wchar wc, pg_locale_t locale);
216217
extern bool pg_iswxdigit(pg_wchar wc, pg_locale_t locale);
218+
extern bool pg_iswcased(pg_wchar wc, pg_locale_t locale);
217219
extern pg_wchar pg_towupper(pg_wchar wc, pg_locale_t locale);
218220
extern pg_wchar pg_towlower(pg_wchar wc, pg_locale_t locale);
219221

0 commit comments

Comments
 (0)