PostgreSQL Source Code: src/include/utils/pg_locale.h File Reference (original) (raw)
Go to the source code of this file.
Functions | |
---|---|
bool | check_locale (int category, const char *locale, char **canonname) |
char * | pg_perm_setlocale (int category, const char *locale) |
struct lconv * | PGLC_localeconv (void) |
void | cache_locale_time (void) |
void | init_database_collation (void) |
pg_locale_t | pg_newlocale_from_collation (Oid collid) |
char * | get_collation_actual_version (char collprovider, const char *collcollate) |
size_t | pg_strlower (char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) |
size_t | pg_strtitle (char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) |
size_t | pg_strupper (char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) |
size_t | pg_strfold (char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) |
int | pg_strcoll (const char *arg1, const char *arg2, pg_locale_t locale) |
int | pg_strncoll (const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale) |
bool | pg_strxfrm_enabled (pg_locale_t locale) |
size_t | pg_strxfrm (char *dest, const char *src, size_t destsize, pg_locale_t locale) |
size_t | pg_strnxfrm (char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale) |
bool | pg_strxfrm_prefix_enabled (pg_locale_t locale) |
size_t | pg_strxfrm_prefix (char *dest, const char *src, size_t destsize, pg_locale_t locale) |
size_t | pg_strnxfrm_prefix (char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale) |
int | builtin_locale_encoding (const char *locale) |
const char * | builtin_validate_locale (int encoding, const char *locale) |
void | icu_validate_locale (const char *loc_str) |
char * | icu_language_tag (const char *loc_str, int elevel) |
void | report_newlocale_failure (const char *localename) |
size_t | wchar2char (char *to, const wchar_t *from, size_t tolen, pg_locale_t locale) |
size_t | char2wchar (wchar_t *to, size_t tolen, const char *from, size_t fromlen, pg_locale_t locale) |
Variables | |
---|---|
PGDLLIMPORT char * | locale_messages |
PGDLLIMPORT char * | locale_monetary |
PGDLLIMPORT char * | locale_numeric |
PGDLLIMPORT char * | locale_time |
PGDLLIMPORT int | icu_validation_level |
PGDLLIMPORT char * | localized_abbrev_days [] |
PGDLLIMPORT char * | localized_full_days [] |
PGDLLIMPORT char * | localized_abbrev_months [] |
PGDLLIMPORT char * | localized_full_months [] |
PGDLLIMPORT bool | database_ctype_is_c |
◆ LOCALE_NAME_BUFLEN
#define LOCALE_NAME_BUFLEN 128
◆ pg_locale_t
◆ builtin_locale_encoding()
int builtin_locale_encoding | ( | const char * | locale | ) |
---|
Definition at line 1472 of file pg_locale.c.
1473{
1474 if (strcmp(locale, "C") == 0)
1475 return -1;
1476 else if (strcmp(locale, "C.UTF-8") == 0)
1478 else if (strcmp(locale, "PG_UNICODE_FAST") == 0)
1480
1481
1483 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1484 errmsg("invalid locale name \"%s\" for builtin provider",
1486
1487 return 0;
1488}
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
References ereport, errcode(), errmsg(), ERROR, locale, and PG_UTF8.
Referenced by builtin_validate_locale(), and DefineCollation().
◆ builtin_validate_locale()
const char * builtin_validate_locale | ( | int | encoding, |
---|---|---|---|
const char * | locale | ||
) |
Definition at line 1496 of file pg_locale.c.
1497{
1498 const char *canonical_name = NULL;
1499 int required_encoding;
1500
1501 if (strcmp(locale, "C") == 0)
1502 canonical_name = "C";
1503 else if (strcmp(locale, "C.UTF-8") == 0 || strcmp(locale, "C.UTF8") == 0)
1504 canonical_name = "C.UTF-8";
1505 else if (strcmp(locale, "PG_UNICODE_FAST") == 0)
1506 canonical_name = "PG_UNICODE_FAST";
1507
1508 if (!canonical_name)
1510 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1511 errmsg("invalid locale name \"%s\" for builtin provider",
1513
1515 if (required_encoding >= 0 && encoding != required_encoding)
1517 (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1518 errmsg("encoding \"%s\" does not match locale \"%s\"",
1520
1521 return canonical_name;
1522}
int builtin_locale_encoding(const char *locale)
#define pg_encoding_to_char
References builtin_locale_encoding(), encoding, ereport, errcode(), errmsg(), ERROR, locale, and pg_encoding_to_char.
Referenced by create_pg_locale_builtin(), createdb(), and DefineCollation().
◆ cache_locale_time()
void cache_locale_time | ( | void | ) |
---|
Definition at line 721 of file pg_locale.c.
722{
724 char *bufptr;
725 time_t timenow;
726 struct tm *timeinfo;
727 struct tm timeinfobuf;
728 bool strftimefail = false;
730 int i;
732
733
735 return;
736
738
739 errno = ENOENT;
740#ifdef WIN32
744#else
746#endif
749
750
751 timenow = time(NULL);
752 timeinfo = gmtime_r(&timenow, &timeinfobuf);
753
754
755 bufptr = buf;
756
757
758
759
760
761
762
763
764
765 errno = 0;
766
767
769 {
770 timeinfo->tm_wday = i;
772 strftimefail = true;
775 strftimefail = true;
777 }
778
779
781 {
782 timeinfo->tm_mon = i;
783 timeinfo->tm_mday = 1;
785 strftimefail = true;
788 strftimefail = true;
790 }
791
792#ifdef WIN32
793 _free_locale(locale);
794#else
796#endif
797
798
799
800
801
802 if (strftimefail)
803 elog(ERROR, "strftime_l() failed");
804
805#ifndef WIN32
806
807
808
809
810
811
815
816#else
817
818
819
820
821
823
824#endif
825
826 bufptr = buf;
827
828
830 {
835 }
838
839
841 {
846 }
849
851}
char * localized_full_months[12+1]
static bool CurrentLCTimeValid
static void cache_single_string(char **dst, const char *src, int encoding)
char * localized_abbrev_months[12+1]
char * localized_full_days[7+1]
char * localized_abbrev_days[7+1]
void report_newlocale_failure(const char *localename)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
void _dosmaperr(unsigned long)
References _dosmaperr(), buf, cache_single_string(), CurrentLCTimeValid, DEBUG3, elog, encoding, ERROR, i, locale, locale_t, locale_time, localized_abbrev_days, localized_abbrev_months, localized_full_days, localized_full_months, MAX_L10N_DATA, pg_get_encoding_from_locale(), PG_SQL_ASCII, PG_UTF8, report_newlocale_failure(), and tm.
Referenced by DCH_from_char(), and DCH_to_char().
◆ char2wchar()
size_t char2wchar | ( | wchar_t * | to, |
---|---|---|---|
size_t | tolen, | ||
const char * | from, | ||
size_t | fromlen, | ||
pg_locale_t | locale | ||
) |
Definition at line 936 of file pg_locale_libc.c.
938{
939 size_t result;
940
941 if (tolen == 0)
942 return 0;
943
944#ifdef WIN32
945
947 {
948
949 if (fromlen == 0)
950 result = 0;
951 else
952 {
953 result = MultiByteToWideChar(CP_UTF8, 0, from, fromlen, to, tolen - 1);
954
955 if (result == 0)
956 result = -1;
957 }
958
959 if (result != -1)
960 {
961 Assert(result < tolen);
962
963 to[result] = 0;
964 }
965 }
966 else
967#endif
968 {
969
971
973 {
974
975 result = mbstowcs(to, str, tolen);
976 }
977 else
978 {
979
981 }
982
984 }
985
986 if (result == -1)
987 {
988
989
990
991
992
993
994
995
996 pg_verifymbstr(from, fromlen, false);
997
999 (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
1000 errmsg("invalid multibyte character for locale"),
1001 errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
1002 }
1003
1004 return result;
1005}
int errhint(const char *fmt,...)
Assert(PointerIsAligned(start, uint64))
int GetDatabaseEncoding(void)
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
void pfree(void *pointer)
char * pnstrdup(const char *in, Size len)
static size_t mbstowcs_l(wchar_t *dest, const char *src, size_t n, locale_t loc)
References Assert(), ereport, errcode(), errhint(), errmsg(), ERROR, GetDatabaseEncoding(), locale, mbstowcs_l(), pfree(), PG_UTF8, pg_verifymbstr(), pnstrdup(), and str.
Referenced by strlower_libc_mb(), strtitle_libc_mb(), strupper_libc_mb(), t_isalnum(), t_isalpha(), and TParserInit().
◆ check_locale()
bool check_locale | ( | int | category, |
---|---|---|---|
const char * | locale, | ||
char ** | canonname | ||
) |
Definition at line 294 of file pg_locale.c.
295{
296 char *save;
297 char *res;
298
299
301 {
303 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
304 errmsg("locale name \"%s\" contains non-ASCII characters",
306 return false;
307 }
308
309 if (canonname)
310 *canonname = NULL;
311
312 save = setlocale(category, NULL);
313 if (!save)
314 return false;
315
316
318
319
321
322
323 if (res && canonname)
324 *canonname = pstrdup(res);
325
326
328 elog(WARNING, "failed to restore old locale \"%s\"", save);
330
331
332 if (canonname && *canonname && (*canonname))
333 {
335 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
336 errmsg("locale name \"%s\" contains non-ASCII characters",
337 *canonname)));
338 pfree(*canonname);
339 *canonname = NULL;
340 return false;
341 }
342
343 return (res != NULL);
344}
char * pstrdup(const char *in)
bool pg_is_ascii(const char *str)
References elog, ereport, errcode(), errmsg(), locale, pfree(), pg_is_ascii(), pstrdup(), setlocale, and WARNING.
Referenced by check_locale_messages(), check_locale_monetary(), check_locale_numeric(), check_locale_time(), and createdb().
◆ get_collation_actual_version()
char * get_collation_actual_version | ( | char | collprovider, |
---|---|---|---|
const char * | collcollate | ||
) |
◆ icu_language_tag()
char * icu_language_tag | ( | const char * | loc_str, |
---|---|---|---|
int | elevel | ||
) |
Definition at line 1536 of file pg_locale.c.
1537{
1538#ifdef USE_ICU
1539 UErrorCode status;
1540 char *langtag;
1541 size_t buflen = 32;
1542 const bool strict = true;
1543
1544
1545
1546
1547
1548
1549
1550 langtag = palloc(buflen);
1551 while (true)
1552 {
1553 status = U_ZERO_ERROR;
1554 uloc_toLanguageTag(loc_str, langtag, buflen, strict, &status);
1555
1556
1557 if ((status == U_BUFFER_OVERFLOW_ERROR ||
1558 status == U_STRING_NOT_TERMINATED_WARNING) &&
1560 {
1562 langtag = repalloc(langtag, buflen);
1563 continue;
1564 }
1565
1566 break;
1567 }
1568
1569 if (U_FAILURE(status))
1570 {
1572
1573 if (elevel > 0)
1575 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1576 errmsg("could not convert locale name \"%s\" to language tag: %s",
1577 loc_str, u_errorName(status))));
1578 return NULL;
1579 }
1580
1581 return langtag;
1582#else
1584 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1585 errmsg("ICU is not supported in this build")));
1586 return NULL;
1587#endif
1588}
void * repalloc(void *pointer, Size size)
References ereport, errcode(), errmsg(), ERROR, MaxAllocSize, Min, palloc(), pfree(), and repalloc().
Referenced by createdb(), DefineCollation(), and pg_import_system_collations().
◆ icu_validate_locale()
void icu_validate_locale | ( | const char * | loc_str | ) |
---|
Definition at line 1594 of file pg_locale.c.
1595{
1596#ifdef USE_ICU
1597 UCollator *collator;
1598 UErrorCode status;
1599 char lang[ULOC_LANG_CAPACITY];
1600 bool found = false;
1602
1603
1604 if (elevel < 0)
1605 return;
1606
1607
1610
1611
1612 status = U_ZERO_ERROR;
1613 uloc_getLanguage(loc_str, lang, ULOC_LANG_CAPACITY, &status);
1614 if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING)
1615 {
1617 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1618 errmsg("could not get language from ICU locale \"%s\": %s",
1619 loc_str, u_errorName(status)),
1620 errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".",
1621 "icu_validation_level", "disabled")));
1622 return;
1623 }
1624
1625
1626 if (strcmp(lang, "") == 0 ||
1627 strcmp(lang, "root") == 0 || strcmp(lang, "und") == 0)
1628 found = true;
1629
1630
1631 for (int32_t i = 0; !found && i < uloc_countAvailable(); i++)
1632 {
1633 const char *otherloc = uloc_getAvailable(i);
1634 char otherlang[ULOC_LANG_CAPACITY];
1635
1636 status = U_ZERO_ERROR;
1637 uloc_getLanguage(otherloc, otherlang, ULOC_LANG_CAPACITY, &status);
1638 if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING)
1639 continue;
1640
1641 if (strcmp(lang, otherlang) == 0)
1642 found = true;
1643 }
1644
1645 if (!found)
1647 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1648 errmsg("ICU locale \"%s\" has unknown language \"%s\"",
1649 loc_str, lang),
1650 errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".",
1651 "icu_validation_level", "disabled")));
1652
1653
1654 collator = pg_ucol_open(loc_str);
1655 ucol_close(collator);
1656#else
1657
1659 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1660 errmsg("ICU is not supported in this build")));
1661#endif
1662}
References ereport, errcode(), errhint(), errmsg(), ERROR, i, icu_validation_level, IsBinaryUpgrade, and WARNING.
Referenced by createdb(), and DefineCollation().
◆ init_database_collation()
void init_database_collation | ( | void | ) |
---|
Definition at line 1147 of file pg_locale.c.
1148{
1152
1154
1155
1160
1161 if (dbform->datlocprovider == COLLPROVIDER_BUILTIN)
1164 else if (dbform->datlocprovider == COLLPROVIDER_ICU)
1167 else if (dbform->datlocprovider == COLLPROVIDER_LIBC)
1170 else
1171
1173
1176
1178}
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
MemoryContext TopMemoryContext
FormData_pg_database * Form_pg_database
pg_locale_t create_pg_locale_libc(Oid collid, MemoryContext context)
pg_locale_t create_pg_locale_builtin(Oid collid, MemoryContext context)
#define PGLOCALE_SUPPORT_ERROR(provider)
pg_locale_t create_pg_locale_icu(Oid collid, MemoryContext context)
static pg_locale_t default_locale
static Datum ObjectIdGetDatum(Oid X)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
References Assert(), create_pg_locale_builtin(), create_pg_locale_icu(), create_pg_locale_libc(), default_locale, elog, ERROR, GETSTRUCT(), HeapTupleIsValid, pg_locale_struct::is_default, MyDatabaseId, ObjectIdGetDatum(), PGLOCALE_SUPPORT_ERROR, ReleaseSysCache(), SearchSysCache1(), and TopMemoryContext.
Referenced by CheckMyDatabase().
◆ pg_newlocale_from_collation()
Definition at line 1189 of file pg_locale.c.
1190{
1192 bool found;
1193
1194 if (collid == DEFAULT_COLLATION_OID)
1196
1198 elog(ERROR, "cache lookup failed for collation %u", collid);
1199
1201
1204
1206 {
1208 "collation cache",
1211 16, NULL);
1212 }
1213
1215 if (!found)
1216 {
1217
1218
1219
1220
1221 cache_entry->locale = 0;
1222 }
1223
1224 if (cache_entry->locale == 0)
1225 {
1227 }
1228
1231
1232 return cache_entry->locale;
1233}
#define OidIsValid(objectId)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
static pg_locale_t last_collation_cache_locale
static pg_locale_t create_pg_locale(Oid collid, MemoryContext context)
static MemoryContext CollationCacheContext
static collation_cache_hash * CollationCache
static Oid last_collation_cache_oid
static void AssertCouldGetRelation(void)
References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, AssertCouldGetRelation(), CollationCache, CollationCacheContext, collid, create_pg_locale(), default_locale, elog, ERROR, last_collation_cache_locale, last_collation_cache_oid, collation_cache_entry::locale, OidIsValid, and TopMemoryContext.
Referenced by bpchareq(), bpcharne(), btvarstrequalimage(), convert_string_datum(), DefineCollation(), Generic_Text_IC_like(), GenericMatchText(), hashbpchar(), hashbpcharextended(), hashtext(), hashtextextended(), like_fixed_prefix(), make_greater_string(), match_pattern_prefix(), pg_set_regex_collation(), spg_text_inner_consistent(), str_casefold(), str_initcap(), str_tolower(), str_toupper(), text_position(), text_position_setup(), text_starts_with(), texteq(), textne(), varstr_cmp(), and varstr_sortsupport().
◆ pg_perm_setlocale()
char * pg_perm_setlocale | ( | int | category, |
---|---|---|---|
const char * | locale | ||
) |
Definition at line 191 of file pg_locale.c.
192{
193 char *result;
194 const char *envvar;
195
196#ifndef WIN32
198#else
199
200
201
202
203
204
205
206#ifdef LC_MESSAGES
207 if (category == LC_MESSAGES)
208 {
209 result = (char *) locale;
211 return result;
212 }
213 else
214#endif
216#endif
217
218 if (result == NULL)
219 return result;
220
221
222
223
224
225
226
227
228 if (category == LC_CTYPE)
229 {
231
232
233 strlcpy(save_lc_ctype, result, sizeof(save_lc_ctype));
234 result = save_lc_ctype;
235
236#ifdef ENABLE_NLS
238#else
240#endif
241 }
242
243 switch (category)
244 {
245 case LC_COLLATE:
246 envvar = "LC_COLLATE";
247 break;
248 case LC_CTYPE:
249 envvar = "LC_CTYPE";
250 break;
251#ifdef LC_MESSAGES
252 case LC_MESSAGES:
253 envvar = "LC_MESSAGES";
254#ifdef WIN32
255 result = IsoLocaleName(locale);
256 if (result == NULL)
257 result = (char *) locale;
258 elog(DEBUG3, "IsoLocaleName() executed; locale: \"%s\"", result);
259#endif
260 break;
261#endif
262 case LC_MONETARY:
263 envvar = "LC_MONETARY";
264 break;
265 case LC_NUMERIC:
266 envvar = "LC_NUMERIC";
267 break;
268 case LC_TIME:
269 envvar = "LC_TIME";
270 break;
271 default:
272 elog(FATAL, "unrecognized LC category: %d", category);
273 return NULL;
274 }
275
276 if (setenv(envvar, result, 1) != 0)
277 return NULL;
278
279 return result;
280}
void SetMessageEncoding(int encoding)
#define LOCALE_NAME_BUFLEN
size_t strlcpy(char *dst, const char *src, size_t siz)
References DEBUG3, elog, FATAL, GetDatabaseEncoding(), locale, LOCALE_NAME_BUFLEN, setenv, setlocale, SetMessageEncoding(), and strlcpy().
Referenced by assign_locale_messages(), CheckMyDatabase(), and init_locale().
◆ pg_strcoll()
int pg_strcoll | ( | const char * | arg1, |
---|---|---|---|
const char * | arg2, | ||
pg_locale_t | locale | ||
) |
◆ pg_strfold()
size_t pg_strfold | ( | char * | dst, |
---|---|---|---|
size_t | dstsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
Definition at line 1314 of file pg_locale.c.
1316{
1317 if (locale->provider == COLLPROVIDER_BUILTIN)
1319#ifdef USE_ICU
1320 else if (locale->provider == COLLPROVIDER_ICU)
1322#endif
1323
1324 else if (locale->provider == COLLPROVIDER_LIBC)
1326 else
1327
1329
1330 return 0;
1331}
size_t strfold_icu(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strlower_libc(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strfold_builtin(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
References locale, PGLOCALE_SUPPORT_ERROR, strfold_builtin(), strfold_icu(), and strlower_libc().
Referenced by str_casefold().
◆ pg_strlower()
size_t pg_strlower | ( | char * | dst, |
---|---|---|---|
size_t | dstsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
Definition at line 1257 of file pg_locale.c.
1259{
1260 if (locale->provider == COLLPROVIDER_BUILTIN)
1262#ifdef USE_ICU
1263 else if (locale->provider == COLLPROVIDER_ICU)
1265#endif
1266 else if (locale->provider == COLLPROVIDER_LIBC)
1268 else
1269
1271
1272 return 0;
1273}
size_t strlower_icu(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strlower_builtin(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
References locale, PGLOCALE_SUPPORT_ERROR, strlower_builtin(), strlower_icu(), and strlower_libc().
Referenced by str_tolower().
◆ pg_strncoll()
int pg_strncoll | ( | const char * | arg1, |
---|---|---|---|
ssize_t | len1, | ||
const char * | arg2, | ||
ssize_t | len2, | ||
pg_locale_t | locale | ||
) |
◆ pg_strnxfrm()
size_t pg_strnxfrm | ( | char * | dest, |
---|---|---|---|
size_t | destsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
◆ pg_strnxfrm_prefix()
size_t pg_strnxfrm_prefix | ( | char * | dest, |
---|---|---|---|
size_t | destsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
◆ pg_strtitle()
size_t pg_strtitle | ( | char * | dst, |
---|---|---|---|
size_t | dstsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
Definition at line 1276 of file pg_locale.c.
1278{
1279 if (locale->provider == COLLPROVIDER_BUILTIN)
1281#ifdef USE_ICU
1282 else if (locale->provider == COLLPROVIDER_ICU)
1284#endif
1285 else if (locale->provider == COLLPROVIDER_LIBC)
1287 else
1288
1290
1291 return 0;
1292}
size_t strtitle_libc(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strtitle_icu(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strtitle_builtin(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
References locale, PGLOCALE_SUPPORT_ERROR, strtitle_builtin(), strtitle_icu(), and strtitle_libc().
Referenced by str_initcap().
◆ pg_strupper()
size_t pg_strupper | ( | char * | dst, |
---|---|---|---|
size_t | dstsize, | ||
const char * | src, | ||
ssize_t | srclen, | ||
pg_locale_t | locale | ||
) |
Definition at line 1295 of file pg_locale.c.
1297{
1298 if (locale->provider == COLLPROVIDER_BUILTIN)
1300#ifdef USE_ICU
1301 else if (locale->provider == COLLPROVIDER_ICU)
1303#endif
1304 else if (locale->provider == COLLPROVIDER_LIBC)
1306 else
1307
1309
1310 return 0;
1311}
size_t strupper_icu(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strupper_libc(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
size_t strupper_builtin(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale)
References locale, PGLOCALE_SUPPORT_ERROR, strupper_builtin(), strupper_icu(), and strupper_libc().
Referenced by str_toupper().
◆ pg_strxfrm()
size_t pg_strxfrm | ( | char * | dest, |
---|---|---|---|
const char * | src, | ||
size_t | destsize, | ||
pg_locale_t | locale | ||
) |
◆ pg_strxfrm_enabled()
◆ pg_strxfrm_prefix()
size_t pg_strxfrm_prefix | ( | char * | dest, |
---|---|---|---|
const char * | src, | ||
size_t | destsize, | ||
pg_locale_t | locale | ||
) |
◆ pg_strxfrm_prefix_enabled()
◆ PGLC_localeconv()
struct lconv * PGLC_localeconv | ( | void | ) |
---|
Definition at line 525 of file pg_locale.c.
526{
527 static struct lconv CurrentLocaleConv;
528 static bool CurrentLocaleConvAllocated = false;
529 struct lconv *extlconv;
530 struct lconv tmp;
531 struct lconv worklconv = {0};
532
533
535 return &CurrentLocaleConv;
536
537
538 if (CurrentLocaleConvAllocated)
539 {
541 CurrentLocaleConvAllocated = false;
542 }
543
544
545
546
547
550 &tmp) != 0)
552 "could not get lconv for LC_MONETARY = \"%s\", LC_NUMERIC = \"%s\": %m",
554
555
556 extlconv = &tmp;
557 worklconv.decimal_point = strdup(extlconv->decimal_point);
558 worklconv.thousands_sep = strdup(extlconv->thousands_sep);
559 worklconv.grouping = strdup(extlconv->grouping);
560 worklconv.int_curr_symbol = strdup(extlconv->int_curr_symbol);
561 worklconv.currency_symbol = strdup(extlconv->currency_symbol);
562 worklconv.mon_decimal_point = strdup(extlconv->mon_decimal_point);
563 worklconv.mon_thousands_sep = strdup(extlconv->mon_thousands_sep);
564 worklconv.mon_grouping = strdup(extlconv->mon_grouping);
565 worklconv.positive_sign = strdup(extlconv->positive_sign);
566 worklconv.negative_sign = strdup(extlconv->negative_sign);
567
568 worklconv.int_frac_digits = extlconv->int_frac_digits;
569 worklconv.frac_digits = extlconv->frac_digits;
570 worklconv.p_cs_precedes = extlconv->p_cs_precedes;
571 worklconv.p_sep_by_space = extlconv->p_sep_by_space;
572 worklconv.n_cs_precedes = extlconv->n_cs_precedes;
573 worklconv.n_sep_by_space = extlconv->n_sep_by_space;
574 worklconv.p_sign_posn = extlconv->p_sign_posn;
575 worklconv.n_sign_posn = extlconv->n_sign_posn;
576
577
579
580
583 (errcode(ERRCODE_OUT_OF_MEMORY),
584 errmsg("out of memory")));
585
587 {
589
590
591
592
593
594
595
596
600
603
604
608
613
616 }
618 {
621 }
623
624
625
626
627 CurrentLocaleConv = worklconv;
628 CurrentLocaleConvAllocated = true;
630 return &CurrentLocaleConv;
631}
static void db_encoding_convert(int encoding, char **str)
static void free_struct_lconv(struct lconv *s)
static bool CurrentLocaleConvValid
static bool struct_lconv_is_valid(struct lconv *s)
int pg_localeconv_r(const char *lc_monetary, const char *lc_numeric, struct lconv *output)
void pg_localeconv_free(struct lconv *lconv)
References CurrentLocaleConvValid, db_encoding_convert(), elog, encoding, ereport, errcode(), errmsg(), ERROR, free_struct_lconv(), locale_monetary, locale_numeric, PG_CATCH, PG_END_TRY, pg_get_encoding_from_locale(), pg_localeconv_free(), pg_localeconv_r(), PG_RE_THROW, PG_SQL_ASCII, PG_TRY, and struct_lconv_is_valid().
Referenced by cash_in(), cash_numeric(), cash_out(), int4_cash(), int8_cash(), NUM_prepare_locale(), and numeric_cash().
◆ report_newlocale_failure()
void report_newlocale_failure | ( | const char * | localename | ) |
---|
Definition at line 804 of file pg_locale_libc.c.
805{
806 int save_errno;
807
808
809
810
811
812
813
814
815 if (errno == 0)
816 errno = ENOENT;
817
818
819
820
821
822 save_errno = errno;
824 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
825 errmsg("could not create locale \"%s\": %m",
826 localename),
827 (save_errno == ENOENT ?
828 errdetail("The operating system could not find any locale data for the locale name \"%s\".",
829 localename) : 0)));
830}
int errdetail(const char *fmt,...)
References ereport, errcode(), errdetail(), errmsg(), and ERROR.
Referenced by cache_locale_time(), and make_libc_collator().
◆ wchar2char()
size_t wchar2char | ( | char * | to, |
---|---|---|---|
const wchar_t * | from, | ||
size_t | tolen, | ||
pg_locale_t | locale | ||
) |
Definition at line 882 of file pg_locale_libc.c.
883{
884 size_t result;
885
886 if (tolen == 0)
887 return 0;
888
889#ifdef WIN32
890
891
892
893
894
895
897 {
898 result = WideCharToMultiByte(CP_UTF8, 0, from, -1, to, tolen,
899 NULL, NULL);
900
901 if (result <= 0)
902 result = -1;
903 else
904 {
905 Assert(result <= tolen);
906
907 result--;
908 }
909 }
910 else
911#endif
913 {
914
915 result = wcstombs(to, from, tolen);
916 }
917 else
918 {
919
921 }
922
923 return result;
924}
static size_t wcstombs_l(char *dest, const wchar_t *src, size_t n, locale_t loc)
References Assert(), GetDatabaseEncoding(), locale, PG_UTF8, and wcstombs_l().
Referenced by strlower_libc_mb(), strtitle_libc_mb(), and strupper_libc_mb().