1
0
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:
Peter Eisentraut
2025-09-30 12:23:47 +02:00
parent 3bf31dd243
commit 4b7e6c73b0
4 changed files with 55 additions and 55 deletions

View File

@@ -72,7 +72,7 @@ strlower_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
return unicode_strlower(dest, destsize, src, srclen, return unicode_strlower(dest, destsize, src, srclen,
locale->info.builtin.casemap_full); locale->builtin.casemap_full);
} }
static size_t static size_t
@@ -83,13 +83,13 @@ strtitle_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
.str = src, .str = src,
.len = srclen, .len = srclen,
.offset = 0, .offset = 0,
.posix = !locale->info.builtin.casemap_full, .posix = !locale->builtin.casemap_full,
.init = false, .init = false,
.prev_alnum = false, .prev_alnum = false,
}; };
return unicode_strtitle(dest, destsize, src, srclen, return unicode_strtitle(dest, destsize, src, srclen,
locale->info.builtin.casemap_full, locale->builtin.casemap_full,
initcap_wbnext, &wbstate); initcap_wbnext, &wbstate);
} }
@@ -98,7 +98,7 @@ strupper_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
return unicode_strupper(dest, destsize, src, srclen, return unicode_strupper(dest, destsize, src, srclen,
locale->info.builtin.casemap_full); locale->builtin.casemap_full);
} }
static size_t static size_t
@@ -106,13 +106,13 @@ strfold_builtin(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
return unicode_strfold(dest, destsize, src, srclen, return unicode_strfold(dest, destsize, src, srclen,
locale->info.builtin.casemap_full); locale->builtin.casemap_full);
} }
static bool static bool
wc_isdigit_builtin(pg_wchar wc, pg_locale_t locale) 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 static bool
@@ -124,7 +124,7 @@ wc_isalpha_builtin(pg_wchar wc, pg_locale_t locale)
static bool static bool
wc_isalnum_builtin(pg_wchar wc, pg_locale_t locale) 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 static bool
@@ -154,7 +154,7 @@ wc_isprint_builtin(pg_wchar wc, pg_locale_t locale)
static bool static bool
wc_ispunct_builtin(pg_wchar wc, pg_locale_t locale) 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 static bool
@@ -238,8 +238,8 @@ create_pg_locale_builtin(Oid collid, MemoryContext context)
result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct)); result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct));
result->info.builtin.locale = MemoryContextStrdup(context, locstr); result->builtin.locale = MemoryContextStrdup(context, locstr);
result->info.builtin.casemap_full = (strcmp(locstr, "PG_UNICODE_FAST") == 0); result->builtin.casemap_full = (strcmp(locstr, "PG_UNICODE_FAST") == 0);
result->deterministic = true; result->deterministic = true;
result->collate_is_c = true; result->collate_is_c = true;
result->ctype_is_c = (strcmp(locstr, "C") == 0); result->ctype_is_c = (strcmp(locstr, "C") == 0);

View File

@@ -290,8 +290,8 @@ create_pg_locale_icu(Oid collid, MemoryContext context)
collator = make_icu_collator(iculocstr, icurules); collator = make_icu_collator(iculocstr, icurules);
result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct)); result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct));
result->info.icu.locale = MemoryContextStrdup(context, iculocstr); result->icu.locale = MemoryContextStrdup(context, iculocstr);
result->info.icu.ucol = collator; result->icu.ucol = collator;
result->deterministic = deterministic; result->deterministic = deterministic;
result->collate_is_c = false; result->collate_is_c = false;
result->ctype_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); Assert(GetDatabaseEncoding() == PG_UTF8);
status = U_ZERO_ERROR; status = U_ZERO_ERROR;
result = ucol_strcollUTF8(locale->info.icu.ucol, result = ucol_strcollUTF8(locale->icu.ucol,
arg1, len1, arg1, len1,
arg2, len2, arg2, len2,
&status); &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); 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, uchar, ulen,
(uint8_t *) dest, destsize); (uint8_t *) dest, destsize);
@@ -644,7 +644,7 @@ strnxfrm_prefix_icu_utf8(char *dest, size_t destsize,
uiter_setUTF8(&iter, src, srclen); uiter_setUTF8(&iter, src, srclen);
state[0] = state[1] = 0; /* won't need that again */ state[0] = state[1] = 0; /* won't need that again */
status = U_ZERO_ERROR; status = U_ZERO_ERROR;
result = ucol_nextSortKeyPart(locale->info.icu.ucol, result = ucol_nextSortKeyPart(locale->icu.ucol,
&iter, &iter,
state, state,
(uint8_t *) dest, (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)); *buff_dest = palloc(len_dest * sizeof(**buff_dest));
status = U_ZERO_ERROR; status = U_ZERO_ERROR;
len_dest = func(*buff_dest, len_dest, buff_source, len_source, 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) if (status == U_BUFFER_OVERFLOW_ERROR)
{ {
/* try again with adjusted length */ /* 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)); *buff_dest = palloc(len_dest * sizeof(**buff_dest));
status = U_ZERO_ERROR; status = U_ZERO_ERROR;
len_dest = func(*buff_dest, len_dest, buff_source, len_source, len_dest = func(*buff_dest, len_dest, buff_source, len_source,
mylocale->info.icu.locale, &status); mylocale->icu.locale, &status);
} }
if (U_FAILURE(status)) if (U_FAILURE(status))
ereport(ERROR, ereport(ERROR,
@@ -859,7 +859,7 @@ strncoll_icu(const char *arg1, ssize_t len1,
ulen1 = uchar_convert(icu_converter, uchar1, ulen1 + 1, arg1, len1); ulen1 = uchar_convert(icu_converter, uchar1, ulen1 + 1, arg1, len1);
ulen2 = uchar_convert(icu_converter, uchar2, ulen2 + 1, arg2, len2); 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, uchar1, ulen1,
uchar2, ulen2); uchar2, ulen2);
@@ -904,7 +904,7 @@ strnxfrm_prefix_icu(char *dest, size_t destsize,
uiter_setString(&iter, uchar, ulen); uiter_setString(&iter, uchar, ulen);
state[0] = state[1] = 0; /* won't need that again */ state[0] = state[1] = 0; /* won't need that again */
status = U_ZERO_ERROR; status = U_ZERO_ERROR;
result_bsize = ucol_nextSortKeyPart(locale->info.icu.ucol, result_bsize = ucol_nextSortKeyPart(locale->icu.ucol,
&iter, &iter,
state, state,
(uint8_t *) dest, (uint8_t *) dest,

View File

@@ -121,116 +121,116 @@ static size_t strupper_libc_mb(char *dest, size_t destsize,
static bool static bool
wc_isdigit_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isalpha_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isalnum_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isupper_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_islower_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isgraph_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isprint_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_ispunct_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isspace_libc_sb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isdigit_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isalpha_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isalnum_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isupper_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_islower_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isgraph_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isprint_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_ispunct_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static bool
wc_isspace_libc_mb(pg_wchar wc, pg_locale_t locale) 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 static char
char_tolower_libc(unsigned char ch, pg_locale_t locale) char_tolower_libc(unsigned char ch, pg_locale_t locale)
{ {
Assert(pg_database_encoding_max_length() == 1); Assert(pg_database_encoding_max_length() == 1);
return tolower_l(ch, locale->info.lt); return tolower_l(ch, locale->lt);
} }
static bool static bool
@@ -241,7 +241,7 @@ char_is_cased_libc(char ch, pg_locale_t locale)
if (is_multibyte && IS_HIGHBIT_SET(ch)) if (is_multibyte && IS_HIGHBIT_SET(ch))
return true; return true;
else else
return isalpha_l((unsigned char) ch, locale->info.lt); return isalpha_l((unsigned char) ch, locale->lt);
} }
static pg_wchar 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) if (locale->is_default && wc <= (pg_wchar) 127)
return pg_ascii_toupper((unsigned char) wc); return pg_ascii_toupper((unsigned char) wc);
if (wc <= (pg_wchar) UCHAR_MAX) if (wc <= (pg_wchar) UCHAR_MAX)
return toupper_l((unsigned char) wc, locale->info.lt); return toupper_l((unsigned char) wc, locale->lt);
else else
return wc; return wc;
} }
@@ -267,7 +267,7 @@ toupper_libc_mb(pg_wchar wc, pg_locale_t locale)
if (locale->is_default && wc <= (pg_wchar) 127) if (locale->is_default && wc <= (pg_wchar) 127)
return pg_ascii_toupper((unsigned char) wc); return pg_ascii_toupper((unsigned char) wc);
if (sizeof(wchar_t) >= 4 || wc <= (pg_wchar) 0xFFFF) 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 else
return wc; return wc;
} }
@@ -281,7 +281,7 @@ tolower_libc_sb(pg_wchar wc, pg_locale_t locale)
if (locale->is_default && wc <= (pg_wchar) 127) if (locale->is_default && wc <= (pg_wchar) 127)
return pg_ascii_tolower((unsigned char) wc); return pg_ascii_tolower((unsigned char) wc);
if (wc <= (pg_wchar) UCHAR_MAX) if (wc <= (pg_wchar) UCHAR_MAX)
return tolower_l((unsigned char) wc, locale->info.lt); return tolower_l((unsigned char) wc, locale->lt);
else else
return wc; return wc;
} }
@@ -295,7 +295,7 @@ tolower_libc_mb(pg_wchar wc, pg_locale_t locale)
if (locale->is_default && wc <= (pg_wchar) 127) if (locale->is_default && wc <= (pg_wchar) 127)
return pg_ascii_tolower((unsigned char) wc); return pg_ascii_tolower((unsigned char) wc);
if (sizeof(wchar_t) >= 4 || wc <= (pg_wchar) 0xFFFF) 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 else
return wc; return wc;
} }
@@ -406,7 +406,7 @@ strlower_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen,
if (srclen + 1 <= destsize) if (srclen + 1 <= destsize)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
char *p; char *p;
if (srclen + 1 > destsize) 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, strlower_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
size_t result_size; size_t result_size;
wchar_t *workspace; wchar_t *workspace;
char *result; char *result;
@@ -491,7 +491,7 @@ strtitle_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen,
if (srclen + 1 <= destsize) if (srclen + 1 <= destsize)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
int wasalnum = false; int wasalnum = false;
char *p; char *p;
@@ -532,7 +532,7 @@ static size_t
strtitle_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen, strtitle_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
int wasalnum = false; int wasalnum = false;
size_t result_size; size_t result_size;
wchar_t *workspace; 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) if (srclen + 1 <= destsize)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
char *p; char *p;
memcpy(dest, src, srclen); 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, strupper_libc_mb(char *dest, size_t destsize, const char *src, ssize_t srclen,
pg_locale_t locale) pg_locale_t locale)
{ {
locale_t loc = locale->info.lt; locale_t loc = locale->lt;
size_t result_size; size_t result_size;
wchar_t *workspace; wchar_t *workspace;
char *result; char *result;
@@ -718,7 +718,7 @@ create_pg_locale_libc(Oid collid, MemoryContext context)
(strcmp(collate, "POSIX") == 0); (strcmp(collate, "POSIX") == 0);
result->ctype_is_c = (strcmp(ctype, "C") == 0) || result->ctype_is_c = (strcmp(ctype, "C") == 0) ||
(strcmp(ctype, "POSIX") == 0); (strcmp(ctype, "POSIX") == 0);
result->info.lt = loc; result->lt = loc;
if (!result->collate_is_c) if (!result->collate_is_c)
{ {
#ifdef WIN32 #ifdef WIN32
@@ -862,7 +862,7 @@ strncoll_libc(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2,
arg2n = buf2; arg2n = buf2;
} }
result = strcoll_l(arg1n, arg2n, locale->info.lt); result = strcoll_l(arg1n, arg2n, locale->lt);
if (buf != sbuf) if (buf != sbuf)
pfree(buf); pfree(buf);
@@ -887,7 +887,7 @@ strnxfrm_libc(char *dest, size_t destsize, const char *src, ssize_t srclen,
size_t result; size_t result;
if (srclen == -1) if (srclen == -1)
return strxfrm_l(dest, src, destsize, locale->info.lt); return strxfrm_l(dest, src, destsize, locale->lt);
if (bufsize > TEXTBUFLEN) if (bufsize > TEXTBUFLEN)
buf = palloc(bufsize); buf = palloc(bufsize);
@@ -896,7 +896,7 @@ strnxfrm_libc(char *dest, size_t destsize, const char *src, ssize_t srclen,
memcpy(buf, src, srclen); memcpy(buf, src, srclen);
buf[srclen] = '\0'; buf[srclen] = '\0';
result = strxfrm_l(dest, buf, destsize, locale->info.lt); result = strxfrm_l(dest, buf, destsize, locale->lt);
if (buf != sbuf) if (buf != sbuf)
pfree(buf); pfree(buf);
@@ -1038,7 +1038,7 @@ strncoll_libc_win32_utf8(const char *arg1, ssize_t len1, const char *arg2,
((LPWSTR) a2p)[r] = 0; ((LPWSTR) a2p)[r] = 0;
errno = 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 */ if (result == 2147483647) /* _NLSCMPERROR; missing from mingw headers */
ereport(ERROR, ereport(ERROR,
(errmsg("could not compare Unicode strings: %m"))); (errmsg("could not compare Unicode strings: %m")));

View File

@@ -171,7 +171,7 @@ struct pg_locale_struct
UCollator *ucol; UCollator *ucol;
} icu; } icu;
#endif #endif
} info; };
}; };
extern void init_database_collation(void); extern void init_database_collation(void);