[Libreoffice-commits] core.git: sal/osl

Stephan Bergmann sbergman at redhat.com
Fri Mar 24 08:06:41 UTC 2017


 sal/osl/unx/nlsupport.cxx |   71 +++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 34 deletions(-)

New commits:
commit ce6e07ebfcbb589f22cbc8dda2bb4a1d0a683beb
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Mar 24 09:00:51 2017 +0100

    Handle "POSIX" in parse_locale, 2nd attempt
    
    ...with the silly errors fixed past 61ecebe0d0febe8429d965355356a9f0f34b323b
    "Revert 'Handle 'POSIX' in parse_locale'"
    
    Change-Id: I0b8e4de0377b92b8cb96efa13e4b39316ffbf707

diff --git a/sal/osl/unx/nlsupport.cxx b/sal/osl/unx/nlsupport.cxx
index 589439fffe94..48558b9489d3 100644
--- a/sal/osl/unx/nlsupport.cxx
+++ b/sal/osl/unx/nlsupport.cxx
@@ -17,6 +17,10 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <sal/config.h>
+
+#include <algorithm>
+
 #include <osl/nlsupport.h>
 #include <osl/diagnose.h>
 #include <osl/process.h>
@@ -173,52 +177,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") == 0
+        || std::strcmp(locale, "POSIX") == 0)
+    {
+        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 = std::min<size_t>(len, 2);
 
-        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) || \


More information about the Libreoffice-commits mailing list