[Libreoffice-commits] core.git: i18nlangtag/qa i18nlangtag/source

Eike Rathke erack at redhat.com
Thu Aug 29 05:07:54 PDT 2013


 i18nlangtag/qa/cppunit/test_languagetag.cxx       |   11 ++
 i18nlangtag/source/languagetag/simple-langtag.cxx |   89 +++++++++++++++++++++-
 2 files changed, 98 insertions(+), 2 deletions(-)

New commits:
commit 71902872bfffbbc73f11d5a12fae6115d9bd458b
Author: Eike Rathke <erack at redhat.com>
Date:   Thu Aug 29 14:05:32 2013 +0200

    implemented missing replacement bits for Android build
    
    Change-Id: I7492cb80f37dc99b3b4a16d2d812c9e301a1a4a7

diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx
index 915d5cb..fd55e0b 100644
--- a/i18nlangtag/qa/cppunit/test_languagetag.cxx
+++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx
@@ -167,11 +167,19 @@ void TestLanguageTag::testAllTags()
         CPPUNIT_ASSERT( ca_ES_valencia.getScript() == "" );
         CPPUNIT_ASSERT( ca_ES_valencia.getLanguageAndScript() == "ca" );
         ::std::vector< OUString > ca_ES_valencia_Fallbacks( ca_ES_valencia.getFallbackStrings());
+        /* TODO: replacement doesn't handle variants yet. */
+#if USE_LIBLANGTAG
         CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks.size() == 4);
         CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[0] == "ca-ES-valencia");
         CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[1] == "ca-valencia");
         CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[2] == "ca-ES");
         CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[3] == "ca");
+#else
+        CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks.size() == 3);
+        CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[0] == "ca-ES-valencia");
+        CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[1] == "ca-ES");
+        CPPUNIT_ASSERT( ca_ES_valencia_Fallbacks[2] == "ca");
+#endif
         /* TODO: conversion doesn't know this yet, once it does activate test. */
 #if 0
         CPPUNIT_ASSERT( ca_ES_valencia.makeFallback().getBcp47() == "ca-ES-valencia");
@@ -181,6 +189,8 @@ void TestLanguageTag::testAllTags()
     }
 
     {
+        /* TODO: replacement doesn't handle variants yet. */
+#if USE_LIBLANGTAG
         OUString s_ca_valencia( "ca-valencia" );
         LanguageTag ca_valencia( s_ca_valencia, true );
         lang::Locale aLocale = ca_valencia.getLocale();
@@ -206,6 +216,7 @@ void TestLanguageTag::testAllTags()
 #else
         CPPUNIT_ASSERT( ca_valencia.makeFallback().getBcp47() == "ca-ES");
 #endif
+#endif
     }
 
     {
diff --git a/i18nlangtag/source/languagetag/simple-langtag.cxx b/i18nlangtag/source/languagetag/simple-langtag.cxx
index d96f721..eb92e42 100644
--- a/i18nlangtag/source/languagetag/simple-langtag.cxx
+++ b/i18nlangtag/source/languagetag/simple-langtag.cxx
@@ -19,10 +19,12 @@
 #include <cstdlib>
 #include <cstring>
 #include <cstdio>
+#include <vector>
 
 namespace {
 
 typedef int lt_bool_t;
+typedef void* lt_pointer_t;
 
 struct lt_error_t {
     void *something;
@@ -134,19 +136,87 @@ struct lt_region_t : public my_t_impl
     virtual ~lt_region_t() {}
 };
 
+struct lt_variant_t : public my_t_impl
+{
+    explicit lt_variant_t() : my_t_impl() {}
+    virtual ~lt_variant_t() {}
+};
+
+struct lt_list_t : public my_t_impl
+{
+    lt_list_t* mpPrev;
+    lt_list_t* mpNext;
+    explicit lt_list_t() : my_t_impl(), mpPrev(NULL), mpNext(NULL) {}
+    explicit lt_list_t( const lt_list_t& r )
+        :
+            my_t_impl( r), mpPrev(NULL), mpNext(NULL)
+    {
+    }
+    virtual ~lt_list_t()
+    {
+        if (mpPrev)
+            mpPrev->mpNext = mpNext;
+        if (mpNext)
+            mpNext->mpPrev = mpPrev;
+    }
+};
+
+static lt_pointer_t lt_list_value( const lt_list_t* p )
+{
+    // Assuming only char* here.
+    return p ? p->mpStr : NULL;
+}
+
+static const lt_list_t* lt_list_next( const lt_list_t* p )
+{
+    return p ? p->mpNext : NULL;
+}
+
+static lt_list_t* my_copyList( const lt_list_t * pList )
+{
+    lt_list_t* pNewList = NULL;
+    lt_list_t* pLast = NULL;
+    while (pList)
+    {
+        lt_list_t* p = new lt_list_t( *pList);
+        if (!pNewList)
+            pNewList = p;
+        if (pLast)
+        {
+            pLast->mpNext = p;
+            p->mpPrev = pLast;
+        }
+        pLast = p;
+        pList = pList->mpNext;
+    }
+    return pNewList;
+}
+
+static void my_unrefList( lt_list_t* pList )
+{
+    while (pList)
+    {
+        lt_list_t* pNext = pList->mpNext;
+        pList->decRef();
+        pList = pNext;
+    }
+}
+
 struct lt_tag_t : public my_t_impl
 {
     lt_lang_t   maLanguage;
     lt_script_t maScript;
     lt_region_t maRegion;
-    explicit lt_tag_t() : my_t_impl(), maLanguage(), maScript(), maRegion() {}
+    lt_list_t*  mpVariants;
+    explicit lt_tag_t() : my_t_impl(), maLanguage(), maScript(), maRegion(), mpVariants(NULL) {}
     virtual ~lt_tag_t() {}
     explicit lt_tag_t( const lt_tag_t& r )
         :
             my_t_impl( r),
             maLanguage( r.maLanguage),
             maScript( r.maScript),
-            maRegion( r.maRegion)
+            maRegion( r.maRegion),
+            mpVariants( my_copyList( r.mpVariants))
     {
     }
     lt_tag_t& operator=( const lt_tag_t& r )
@@ -157,6 +227,8 @@ struct lt_tag_t : public my_t_impl
         maLanguage = r.maLanguage;
         maScript = r.maScript;
         maRegion = r.maRegion;
+        my_unrefList( mpVariants);
+        mpVariants = my_copyList( r.mpVariants);
         return *this;
     }
     void assign( const char* str )
@@ -164,6 +236,8 @@ struct lt_tag_t : public my_t_impl
         maLanguage.zero();
         maScript.zero();
         maRegion.zero();
+        my_unrefList( mpVariants);
+        mpVariants = NULL;
         my_t_impl::assign( str);
     }
 };
@@ -206,6 +280,7 @@ static lt_bool_t lt_tag_parse(lt_tag_t *tag,
     if (!tag_string)
         return 0;
     // In case we supported other subtags this would get more complicated.
+    /* TODO: variants */
     my_t_impl* aSubtags[] = { &tag->maLanguage, &tag->maScript, &tag->maRegion, NULL };
     my_t_impl** ppSub = &aSubtags[0];
     const char* pStart = tag_string;
@@ -369,6 +444,11 @@ static const lt_region_t *lt_tag_get_region(const lt_tag_t  *tag)
     return tag && tag->maRegion.mpStr ? &tag->maRegion : NULL;
 }
 
+static const lt_list_t *lt_tag_get_variants(const lt_tag_t  *tag)
+{
+    return tag ? tag->mpVariants : NULL;
+}
+
 static const char *lt_lang_get_tag(const lt_lang_t *lang)
 {
     return lang ? lang->mpStr : NULL;
@@ -384,6 +464,11 @@ static const char *lt_region_get_tag(const lt_region_t *region)
     return region ? region->mpStr : NULL;
 }
 
+static const char *lt_variant_get_tag(const lt_variant_t *variant)
+{
+    return variant ? variant->mpStr : NULL;
+}
+
 #ifdef erDEBUG
 static void lt_tag_dump(const lt_tag_t *tag)
 {


More information about the Libreoffice-commits mailing list