summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-03-23 11:09:39 +0100
committerStephan Bergmann <sbergman@redhat.com>2017-03-23 11:09:39 +0100
commit646cbbfbc67b07d5f58166228bca1ac710175cd0 (patch)
tree6270ec2e36296623d84b0bd7ada66424370028f9
parent4a3f2cb747b2553485f48dc440e141e30ade5a70 (diff)
Handle "POSIX" in parse_locale
Change-Id: Ib3ce9efd2933170777689db152d35f586f5afe2d
-rw-r--r--sal/osl/unx/nlsupport.cxx67
1 files changed, 33 insertions, 34 deletions
diff --git a/sal/osl/unx/nlsupport.cxx b/sal/osl/unx/nlsupport.cxx
index 589439fffe94..d6359ee6c538 100644
--- a/sal/osl/unx/nlsupport.cxx
+++ b/sal/osl/unx/nlsupport.cxx
@@ -173,52 +173,51 @@ static rtl_Locale * parse_locale( const char * locale )
{
assert(locale != nullptr);
- static sal_Unicode c_locale[2] = { (sal_Unicode) 'C', 0 };
+ if (*locale == '\0' || std::strcmp(locale, "C")
+ || std::strcmp(locale, "POSIX"))
+ {
+ return rtl_locale_register(u"C", u"", u"");
+ }
size_t len = strlen( locale );
- if( len >= 2 )
- {
- rtl_uString * pLanguage = nullptr;
- rtl_uString * pCountry = nullptr;
- rtl_uString * pVariant = nullptr;
+ rtl_uString * pLanguage = nullptr;
+ rtl_uString * pCountry = nullptr;
+ rtl_uString * pVariant = nullptr;
- size_t offset = 2;
+ size_t offset = len;
- rtl_Locale * ret;
+ rtl_Locale * ret;
- /* language is a two or three letter code */
- if( (len > 3 && locale[3] == '_') || (len == 3 && locale[2] != '_') )
- offset = 3;
+ /* language is a two or three letter code */
+ if( (len > 3 && locale[3] == '_') || (len == 3 && locale[2] != '_') )
+ offset = 3;
- /* convert language code to unicode */
- rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
- OSL_ASSERT(pLanguage != nullptr);
+ /* convert language code to unicode */
+ rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pLanguage != nullptr);
- /* convert country code to unicode */
- if( len >= offset+3 && locale[offset] == '_' )
- {
- rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
- OSL_ASSERT(pCountry != nullptr);
- offset += 3;
- }
+ /* convert country code to unicode */
+ if( len >= offset+3 && locale[offset] == '_' )
+ {
+ rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pCountry != nullptr);
+ offset += 3;
+ }
- /* convert variant code to unicode - do not rely on "." as delimiter */
- if( len > offset ) {
- rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
- OSL_ASSERT(pVariant != nullptr);
- }
+ /* convert variant code to unicode - do not rely on "." as delimiter */
+ if( len > offset ) {
+ rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pVariant != nullptr);
+ }
- ret = rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : c_locale + 1, pVariant ? pVariant->buffer : c_locale + 1 );
+ ret = rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : u"", pVariant ? pVariant->buffer : u"" );
- if (pVariant) rtl_uString_release(pVariant);
- if (pCountry) rtl_uString_release(pCountry);
- if (pLanguage) rtl_uString_release(pLanguage);
+ if (pVariant) rtl_uString_release(pVariant);
+ if (pCountry) rtl_uString_release(pCountry);
+ if (pLanguage) rtl_uString_release(pLanguage);
- return ret;
- }
- else
- return rtl_locale_register( c_locale, c_locale + 1, c_locale + 1 );
+ return ret;
}
#if defined(LINUX) || defined(__sun) || defined(NETBSD) || \