42static size_t convert_case(
char *dst,
size_t dstsize,
const char *src, ssize_t srclen,
46 const char *src,
size_t srclen,
size_t srcoff,
54 return cp != 0 ? cp : code;
62 return cp != 0 ? cp : code;
70 return cp != 0 ? cp : code;
78 return cp != 0 ? cp : code;
213convert_case(
char *dst,
size_t dstsize,
const char *src, ssize_t srclen,
218 CaseKind chr_casekind = str_casekind;
220 size_t result_len = 0;
224 (str_casekind !=
CaseTitle && !wbnext && !wbstate));
228 boundary = wbnext(wbstate);
232 while ((srclen < 0 || srcoff < srclen) && src[srcoff] !=
'\0')
242 if (srcoff == boundary)
245 boundary = wbnext(wbstate);
251 casemap_result =
casemap(u1, chr_casekind, full, src, srclen, srcoff,
254 switch (casemap_result)
260 if (result_len + u1len <= dstsize)
261 memcpy(dst + result_len, src + srcoff, u1len);
272 if (result_len + u2len <= dstsize)
286 if (result_len + u2len <= dstsize)
297 if (result_len < dstsize)
298 dst[result_len] =
'\0';
319 for (
int i = offset - 1;
i >= 0;
i--)
321 if ((
str[
i] & 0x80) == 0 || (
str[
i] & 0xC0) == 0xC0)
332 else if ((
str[
i] & 0xC0) == 0x80)
343 for (
int i = offset + 1;
i <
len &&
str[
i] !=
'\0';
i++)
345 if ((
str[
i] & 0x80) == 0 || (
str[
i] & 0xC0) == 0xC0)
356 else if ((
str[
i] & 0xC0) == 0x80)
398 const char *src,
size_t srclen,
size_t srcoff,
422 src, srclen, srcoff))
Datum idx(PG_FUNCTION_ARGS)
Assert(PointerIsAligned(start, uint64))
static pg_wchar utf8_to_unicode(const unsigned char *c)
static unsigned char * unicode_to_utf8(pg_wchar c, unsigned char *utf8string)
static int unicode_utf8len(pg_wchar c)
pg_wchar map[NCaseKind][MAX_CASE_EXPANSION]
pg_wchar unicode_uppercase_simple(pg_wchar code)
pg_wchar unicode_titlecase_simple(pg_wchar code)
size_t unicode_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, bool full)
static enum CaseMapResult casemap(pg_wchar u1, CaseKind casekind, bool full, const char *src, size_t srclen, size_t srcoff, pg_wchar *simple, const pg_wchar **special)
size_t unicode_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, bool full)
static size_t convert_case(char *dst, size_t dstsize, const char *src, ssize_t srclen, CaseKind str_casekind, bool full, WordBoundaryNext wbnext, void *wbstate)
size_t unicode_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, bool full, WordBoundaryNext wbnext, void *wbstate)
static pg_wchar find_case_map(pg_wchar ucs, const pg_wchar *map)
static bool check_special_conditions(int conditions, const char *str, size_t len, size_t offset)
static const pg_wchar *const casekind_map[NCaseKind]
pg_wchar unicode_lowercase_simple(pg_wchar code)
size_t unicode_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, bool full)
pg_wchar unicode_casefold_simple(pg_wchar code)
static bool check_final_sigma(const unsigned char *str, size_t len, size_t offset)
size_t(* WordBoundaryNext)(void *wbstate)
static const uint8 case_map_special[1704]
#define MAX_CASE_EXPANSION
static const pg_special_case special_case[106]
static const pg_wchar case_map_title[1704]
static const pg_wchar case_map_upper[1704]
static const pg_wchar case_map_fold[1704]
static const pg_wchar case_map_lower[1704]
static uint16 case_index(pg_wchar cp)
bool pg_u_prop_cased(pg_wchar code)
bool pg_u_prop_case_ignorable(pg_wchar code)