@@ -1257,35 +1257,99 @@ get_collation_actual_version(char collprovider, const char *collcollate)
12571257 return collversion ;
12581258}
12591259
1260+ /* lowercasing/casefolding in C locale */
1261+ static size_t
1262+ strlower_c (char * dst , size_t dstsize , const char * src , ssize_t srclen )
1263+ {
1264+ int i ;
1265+
1266+ srclen = (srclen >= 0 ) ? srclen : strlen (src );
1267+ for (i = 0 ; i < srclen && i < dstsize ; i ++ )
1268+ dst [i ] = pg_ascii_tolower (src [i ]);
1269+ if (i < dstsize )
1270+ dst [i ] = '\0' ;
1271+ return srclen ;
1272+ }
1273+
1274+ /* titlecasing in C locale */
1275+ static size_t
1276+ strtitle_c (char * dst , size_t dstsize , const char * src , ssize_t srclen )
1277+ {
1278+ bool wasalnum = false;
1279+ int i ;
1280+
1281+ srclen = (srclen >= 0 ) ? srclen : strlen (src );
1282+ for (i = 0 ; i < srclen && i < dstsize ; i ++ )
1283+ {
1284+ char c = src [i ];
1285+
1286+ if (wasalnum )
1287+ dst [i ] = pg_ascii_tolower (c );
1288+ else
1289+ dst [i ] = pg_ascii_toupper (c );
1290+
1291+ wasalnum = ((c >= '0' && c <= '9' ) ||
1292+ (c >= 'A' && c <= 'Z' ) ||
1293+ (c >= 'a' && c <= 'z' ));
1294+ }
1295+ if (i < dstsize )
1296+ dst [i ] = '\0' ;
1297+ return srclen ;
1298+ }
1299+
1300+ /* uppercasing in C locale */
1301+ static size_t
1302+ strupper_c (char * dst , size_t dstsize , const char * src , ssize_t srclen )
1303+ {
1304+ int i ;
1305+
1306+ srclen = (srclen >= 0 ) ? srclen : strlen (src );
1307+ for (i = 0 ; i < srclen && i < dstsize ; i ++ )
1308+ dst [i ] = pg_ascii_toupper (src [i ]);
1309+ if (i < dstsize )
1310+ dst [i ] = '\0' ;
1311+ return srclen ;
1312+ }
1313+
12601314size_t
12611315pg_strlower (char * dst , size_t dstsize , const char * src , ssize_t srclen ,
12621316 pg_locale_t locale )
12631317{
1264- return locale -> ctype -> strlower (dst , dstsize , src , srclen , locale );
1318+ if (locale -> ctype == NULL )
1319+ return strlower_c (dst , dstsize , src , srclen );
1320+ else
1321+ return locale -> ctype -> strlower (dst , dstsize , src , srclen , locale );
12651322}
12661323
12671324size_t
12681325pg_strtitle (char * dst , size_t dstsize , const char * src , ssize_t srclen ,
12691326 pg_locale_t locale )
12701327{
1271- return locale -> ctype -> strtitle (dst , dstsize , src , srclen , locale );
1328+ if (locale -> ctype == NULL )
1329+ return strtitle_c (dst , dstsize , src , srclen );
1330+ else
1331+ return locale -> ctype -> strtitle (dst , dstsize , src , srclen , locale );
12721332}
12731333
12741334size_t
12751335pg_strupper (char * dst , size_t dstsize , const char * src , ssize_t srclen ,
12761336 pg_locale_t locale )
12771337{
1278- return locale -> ctype -> strupper (dst , dstsize , src , srclen , locale );
1338+ if (locale -> ctype == NULL )
1339+ return strupper_c (dst , dstsize , src , srclen );
1340+ else
1341+ return locale -> ctype -> strupper (dst , dstsize , src , srclen , locale );
12791342}
12801343
12811344size_t
12821345pg_strfold (char * dst , size_t dstsize , const char * src , ssize_t srclen ,
12831346 pg_locale_t locale )
12841347{
1285- if (locale -> ctype -> strfold )
1286- return locale -> ctype -> strfold (dst , dstsize , src , srclen , locale );
1348+ /* in the C locale, casefolding is the same as lowercasing */
1349+ if (locale -> ctype == NULL )
1350+ return strlower_c (dst , dstsize , src , srclen );
12871351 else
1288- return locale -> ctype -> strlower (dst , dstsize , src , srclen , locale );
1352+ return locale -> ctype -> strfold (dst , dstsize , src , srclen , locale );
12891353}
12901354
12911355/*
@@ -1560,6 +1624,8 @@ pg_towlower(pg_wchar wc, pg_locale_t locale)
15601624bool
15611625char_is_cased (char ch , pg_locale_t locale )
15621626{
1627+ if (locale -> ctype == NULL )
1628+ return (ch >= 'A' && ch <= 'Z' ) || (ch >= 'a' && ch <= 'z' );
15631629 return locale -> ctype -> char_is_cased (ch , locale );
15641630}
15651631
@@ -1571,6 +1637,8 @@ char_is_cased(char ch, pg_locale_t locale)
15711637bool
15721638char_tolower_enabled (pg_locale_t locale )
15731639{
1640+ if (locale -> ctype == NULL )
1641+ return true;
15741642 return (locale -> ctype -> char_tolower != NULL );
15751643}
15761644
@@ -1582,6 +1650,8 @@ char_tolower_enabled(pg_locale_t locale)
15821650char
15831651char_tolower (unsigned char ch , pg_locale_t locale )
15841652{
1653+ if (locale -> ctype == NULL )
1654+ return pg_ascii_tolower (ch );
15851655 return locale -> ctype -> char_tolower (ch , locale );
15861656}
15871657
0 commit comments