mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Make some use of anonymous unions [pg_locale_t]
Make some use of anonymous unions, which are allowed as of C11, as examples and encouragement for future code, and to test compilers. This commit changes the pg_locale_t type. Reviewed-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/f00a9968-388e-4f8c-b5ef-5102e962d997%40eisentraut.org
This commit is contained in:
@@ -72,7 +72,7 @@ strlower_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
return unicode_strlower(dest, destsize, src, srclen,
|
||||
locale->info.builtin.casemap_full);
|
||||
locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static size_t
|
||||
@@ -83,13 +83,13 @@ strtitle_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
.str = src,
|
||||
.len = srclen,
|
||||
.offset = 0,
|
||||
.posix = !locale->info.builtin.casemap_full,
|
||||
.posix = !locale->builtin.casemap_full,
|
||||
.init = false,
|
||||
.prev_alnum = false,
|
||||
};
|
||||
|
||||
return unicode_strtitle(dest, destsize, src, srclen,
|
||||
locale->info.builtin.casemap_full,
|
||||
locale->builtin.casemap_full,
|
||||
initcap_wbnext, &wbstate);
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ strupper_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
return unicode_strupper(dest, destsize, src, srclen,
|
||||
locale->info.builtin.casemap_full);
|
||||
locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static size_t
|
||||
@@ -106,13 +106,13 @@ strfold_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
return unicode_strfold(dest, destsize, src, srclen,
|
||||
locale->info.builtin.casemap_full);
|
||||
locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isdigit_builtin(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return pg_u_isdigit(wc, !locale->info.builtin.casemap_full);
|
||||
return pg_u_isdigit(wc, !locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -124,7 +124,7 @@ wc_isalpha_builtin(pg_wchar wc, pg_locale_t locale)
|
||||
static bool
|
||||
wc_isalnum_builtin(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return pg_u_isalnum(wc, !locale->info.builtin.casemap_full);
|
||||
return pg_u_isalnum(wc, !locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -154,7 +154,7 @@ wc_isprint_builtin(pg_wchar wc, pg_locale_t locale)
|
||||
static bool
|
||||
wc_ispunct_builtin(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return pg_u_ispunct(wc, !locale->info.builtin.casemap_full);
|
||||
return pg_u_ispunct(wc, !locale->builtin.casemap_full);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -238,8 +238,8 @@ create_pg_locale_builtin(Oid collid, MemoryContext context)
|
||||
|
||||
result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct));
|
||||
|
||||
result->info.builtin.locale = MemoryContextStrdup(context, locstr);
|
||||
result->info.builtin.casemap_full = (strcmp(locstr, "PG_UNICODE_FAST") == 0);
|
||||
result->builtin.locale = MemoryContextStrdup(context, locstr);
|
||||
result->builtin.casemap_full = (strcmp(locstr, "PG_UNICODE_FAST") == 0);
|
||||
result->deterministic = true;
|
||||
result->collate_is_c = true;
|
||||
result->ctype_is_c = (strcmp(locstr, "C") == 0);
|
||||
|
||||
@@ -290,8 +290,8 @@ create_pg_locale_icu(Oid collid, MemoryContext context)
|
||||
collator = make_icu_collator(iculocstr, icurules);
|
||||
|
||||
result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct));
|
||||
result->info.icu.locale = MemoryContextStrdup(context, iculocstr);
|
||||
result->info.icu.ucol = collator;
|
||||
result->icu.locale = MemoryContextStrdup(context, iculocstr);
|
||||
result->icu.ucol = collator;
|
||||
result->deterministic = deterministic;
|
||||
result->collate_is_c = false;
|
||||
result->ctype_is_c = false;
|
||||
@@ -571,7 +571,7 @@ strncoll_icu_utf8(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2
|
||||
Assert(GetDatabaseEncoding() == PG_UTF8);
|
||||
|
||||
status = U_ZERO_ERROR;
|
||||
result = ucol_strcollUTF8(locale->info.icu.ucol,
|
||||
result = ucol_strcollUTF8(locale->icu.ucol,
|
||||
arg1, len1,
|
||||
arg2, len2,
|
||||
&status);
|
||||
@@ -608,7 +608,7 @@ strnxfrm_icu(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
|
||||
ulen = uchar_convert(icu_converter, uchar, ulen + 1, src, srclen);
|
||||
|
||||
result_bsize = ucol_getSortKey(locale->info.icu.ucol,
|
||||
result_bsize = ucol_getSortKey(locale->icu.ucol,
|
||||
uchar, ulen,
|
||||
(uint8_t *) dest, destsize);
|
||||
|
||||
@@ -644,7 +644,7 @@ strnxfrm_prefix_icu_utf8(char *dest, size_t destsize,
|
||||
uiter_setUTF8(&iter, src, srclen);
|
||||
state[0] = state[1] = 0; /* won't need that again */
|
||||
status = U_ZERO_ERROR;
|
||||
result = ucol_nextSortKeyPart(locale->info.icu.ucol,
|
||||
result = ucol_nextSortKeyPart(locale->icu.ucol,
|
||||
&iter,
|
||||
state,
|
||||
(uint8_t *) dest,
|
||||
@@ -755,7 +755,7 @@ icu_convert_case(ICU_Convert_Func func, pg_locale_t mylocale,
|
||||
*buff_dest = palloc(len_dest * sizeof(**buff_dest));
|
||||
status = U_ZERO_ERROR;
|
||||
len_dest = func(*buff_dest, len_dest, buff_source, len_source,
|
||||
mylocale->info.icu.locale, &status);
|
||||
mylocale->icu.locale, &status);
|
||||
if (status == U_BUFFER_OVERFLOW_ERROR)
|
||||
{
|
||||
/* try again with adjusted length */
|
||||
@@ -763,7 +763,7 @@ icu_convert_case(ICU_Convert_Func func, pg_locale_t mylocale,
|
||||
*buff_dest = palloc(len_dest * sizeof(**buff_dest));
|
||||
status = U_ZERO_ERROR;
|
||||
len_dest = func(*buff_dest, len_dest, buff_source, len_source,
|
||||
mylocale->info.icu.locale, &status);
|
||||
mylocale->icu.locale, &status);
|
||||
}
|
||||
if (U_FAILURE(status))
|
||||
ereport(ERROR,
|
||||
@@ -859,7 +859,7 @@ strncoll_icu(const char *arg1, ssize_t len1,
|
||||
ulen1 = uchar_convert(icu_converter, uchar1, ulen1 + 1, arg1, len1);
|
||||
ulen2 = uchar_convert(icu_converter, uchar2, ulen2 + 1, arg2, len2);
|
||||
|
||||
result = ucol_strcoll(locale->info.icu.ucol,
|
||||
result = ucol_strcoll(locale->icu.ucol,
|
||||
uchar1, ulen1,
|
||||
uchar2, ulen2);
|
||||
|
||||
@@ -904,7 +904,7 @@ strnxfrm_prefix_icu(char *dest, size_t destsize,
|
||||
uiter_setString(&iter, uchar, ulen);
|
||||
state[0] = state[1] = 0; /* won't need that again */
|
||||
status = U_ZERO_ERROR;
|
||||
result_bsize = ucol_nextSortKeyPart(locale->info.icu.ucol,
|
||||
result_bsize = ucol_nextSortKeyPart(locale->icu.ucol,
|
||||
&iter,
|
||||
state,
|
||||
(uint8_t *) dest,
|
||||
|
||||
@@ -121,116 +121,116 @@ static size_t strupper_libc_mb(char *dest, size_t destsize,
|
||||
static bool
|
||||
wc_isdigit_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isdigit_l((unsigned char) wc, locale->info.lt);
|
||||
return isdigit_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isalpha_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isalpha_l((unsigned char) wc, locale->info.lt);
|
||||
return isalpha_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isalnum_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isalnum_l((unsigned char) wc, locale->info.lt);
|
||||
return isalnum_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isupper_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isupper_l((unsigned char) wc, locale->info.lt);
|
||||
return isupper_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_islower_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return islower_l((unsigned char) wc, locale->info.lt);
|
||||
return islower_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isgraph_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isgraph_l((unsigned char) wc, locale->info.lt);
|
||||
return isgraph_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isprint_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isprint_l((unsigned char) wc, locale->info.lt);
|
||||
return isprint_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_ispunct_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return ispunct_l((unsigned char) wc, locale->info.lt);
|
||||
return ispunct_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isspace_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return isspace_l((unsigned char) wc, locale->info.lt);
|
||||
return isspace_l((unsigned char) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isdigit_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswdigit_l((wint_t) wc, locale->info.lt);
|
||||
return iswdigit_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isalpha_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswalpha_l((wint_t) wc, locale->info.lt);
|
||||
return iswalpha_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isalnum_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswalnum_l((wint_t) wc, locale->info.lt);
|
||||
return iswalnum_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isupper_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswupper_l((wint_t) wc, locale->info.lt);
|
||||
return iswupper_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_islower_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswlower_l((wint_t) wc, locale->info.lt);
|
||||
return iswlower_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isgraph_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswgraph_l((wint_t) wc, locale->info.lt);
|
||||
return iswgraph_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isprint_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswprint_l((wint_t) wc, locale->info.lt);
|
||||
return iswprint_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_ispunct_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswpunct_l((wint_t) wc, locale->info.lt);
|
||||
return iswpunct_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
wc_isspace_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
{
|
||||
return iswspace_l((wint_t) wc, locale->info.lt);
|
||||
return iswspace_l((wint_t) wc, locale->lt);
|
||||
}
|
||||
|
||||
static char
|
||||
char_tolower_libc(unsigned char ch, pg_locale_t locale)
|
||||
{
|
||||
Assert(pg_database_encoding_max_length() == 1);
|
||||
return tolower_l(ch, locale->info.lt);
|
||||
return tolower_l(ch, locale->lt);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -241,7 +241,7 @@ char_is_cased_libc(char ch, pg_locale_t locale)
|
||||
if (is_multibyte && IS_HIGHBIT_SET(ch))
|
||||
return true;
|
||||
else
|
||||
return isalpha_l((unsigned char) ch, locale->info.lt);
|
||||
return isalpha_l((unsigned char) ch, locale->lt);
|
||||
}
|
||||
|
||||
static pg_wchar
|
||||
@@ -253,7 +253,7 @@ toupper_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
if (locale->is_default && wc <= (pg_wchar) 127)
|
||||
return pg_ascii_toupper((unsigned char) wc);
|
||||
if (wc <= (pg_wchar) UCHAR_MAX)
|
||||
return toupper_l((unsigned char) wc, locale->info.lt);
|
||||
return toupper_l((unsigned char) wc, locale->lt);
|
||||
else
|
||||
return wc;
|
||||
}
|
||||
@@ -267,7 +267,7 @@ toupper_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
if (locale->is_default && wc <= (pg_wchar) 127)
|
||||
return pg_ascii_toupper((unsigned char) wc);
|
||||
if (sizeof(wchar_t) >= 4 || wc <= (pg_wchar) 0xFFFF)
|
||||
return towupper_l((wint_t) wc, locale->info.lt);
|
||||
return towupper_l((wint_t) wc, locale->lt);
|
||||
else
|
||||
return wc;
|
||||
}
|
||||
@@ -281,7 +281,7 @@ tolower_libc_sb(pg_wchar wc, pg_locale_t locale)
|
||||
if (locale->is_default && wc <= (pg_wchar) 127)
|
||||
return pg_ascii_tolower((unsigned char) wc);
|
||||
if (wc <= (pg_wchar) UCHAR_MAX)
|
||||
return tolower_l((unsigned char) wc, locale->info.lt);
|
||||
return tolower_l((unsigned char) wc, locale->lt);
|
||||
else
|
||||
return wc;
|
||||
}
|
||||
@@ -295,7 +295,7 @@ tolower_libc_mb(pg_wchar wc, pg_locale_t locale)
|
||||
if (locale->is_default && wc <= (pg_wchar) 127)
|
||||
return pg_ascii_tolower((unsigned char) wc);
|
||||
if (sizeof(wchar_t) >= 4 || wc <= (pg_wchar) 0xFFFF)
|
||||
return towlower_l((wint_t) wc, locale->info.lt);
|
||||
return towlower_l((wint_t) wc, locale->lt);
|
||||
else
|
||||
return wc;
|
||||
}
|
||||
@@ -406,7 +406,7 @@ strlower_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
|
||||
if (srclen + 1 <= destsize)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
char *p;
|
||||
|
||||
if (srclen + 1 > destsize)
|
||||
@@ -438,7 +438,7 @@ static size_t
|
||||
strlower_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
size_t result_size;
|
||||
wchar_t *workspace;
|
||||
char *result;
|
||||
@@ -491,7 +491,7 @@ strtitle_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
|
||||
if (srclen + 1 <= destsize)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
int wasalnum = false;
|
||||
char *p;
|
||||
|
||||
@@ -532,7 +532,7 @@ static size_t
|
||||
strtitle_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
int wasalnum = false;
|
||||
size_t result_size;
|
||||
wchar_t *workspace;
|
||||
@@ -592,7 +592,7 @@ strupper_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
|
||||
if (srclen + 1 <= destsize)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
char *p;
|
||||
|
||||
memcpy(dest, src, srclen);
|
||||
@@ -621,7 +621,7 @@ static size_t
|
||||
strupper_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
pg_locale_t locale)
|
||||
{
|
||||
locale_t loc = locale->info.lt;
|
||||
locale_t loc = locale->lt;
|
||||
size_t result_size;
|
||||
wchar_t *workspace;
|
||||
char *result;
|
||||
@@ -718,7 +718,7 @@ create_pg_locale_libc(Oid collid, MemoryContext context)
|
||||
(strcmp(collate, "POSIX") == 0);
|
||||
result->ctype_is_c = (strcmp(ctype, "C") == 0) ||
|
||||
(strcmp(ctype, "POSIX") == 0);
|
||||
result->info.lt = loc;
|
||||
result->lt = loc;
|
||||
if (!result->collate_is_c)
|
||||
{
|
||||
#ifdef WIN32
|
||||
@@ -862,7 +862,7 @@ strncoll_libc(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2,
|
||||
arg2n = buf2;
|
||||
}
|
||||
|
||||
result = strcoll_l(arg1n, arg2n, locale->info.lt);
|
||||
result = strcoll_l(arg1n, arg2n, locale->lt);
|
||||
|
||||
if (buf != sbuf)
|
||||
pfree(buf);
|
||||
@@ -887,7 +887,7 @@ strnxfrm_libc(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
size_t result;
|
||||
|
||||
if (srclen == -1)
|
||||
return strxfrm_l(dest, src, destsize, locale->info.lt);
|
||||
return strxfrm_l(dest, src, destsize, locale->lt);
|
||||
|
||||
if (bufsize > TEXTBUFLEN)
|
||||
buf = palloc(bufsize);
|
||||
@@ -896,7 +896,7 @@ strnxfrm_libc(char *dest, size_t destsize, const char *src, ssize_t srclen,
|
||||
memcpy(buf, src, srclen);
|
||||
buf[srclen] = '\0';
|
||||
|
||||
result = strxfrm_l(dest, buf, destsize, locale->info.lt);
|
||||
result = strxfrm_l(dest, buf, destsize, locale->lt);
|
||||
|
||||
if (buf != sbuf)
|
||||
pfree(buf);
|
||||
@@ -1038,7 +1038,7 @@ strncoll_libc_win32_utf8(const char *arg1, ssize_t len1, const char *arg2,
|
||||
((LPWSTR) a2p)[r] = 0;
|
||||
|
||||
errno = 0;
|
||||
result = wcscoll_l((LPWSTR) a1p, (LPWSTR) a2p, locale->info.lt);
|
||||
result = wcscoll_l((LPWSTR) a1p, (LPWSTR) a2p, locale->lt);
|
||||
if (result == 2147483647) /* _NLSCMPERROR; missing from mingw headers */
|
||||
ereport(ERROR,
|
||||
(errmsg("could not compare Unicode strings: %m")));
|
||||
|
||||
Reference in New Issue
Block a user