diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2017-02-21 12:36:55 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-02-24 15:46:41 +0000 |
commit | 8dc27a0bbf74646969074414c071410ad7d07b74 (patch) | |
tree | 64c6dab2252f66f533804979197662c86fe46c8f | |
parent | 2793561bb6dd439a8010780e9bb58572ccac99e1 (diff) |
Always enable liblangtag
The license should not be an issue any more since liblangtag now has an
LGPL/MPLv2 dual licence.
Change-Id: I4dfffcccf5d710bd16b21c3254c1449ae041b8ab
Reviewed-on: https://gerrit.libreoffice.org/34511
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | RepositoryExternal.mk | 7 | ||||
-rw-r--r-- | config_host.mk.in | 1 | ||||
-rw-r--r-- | config_host/config_liblangtag.h.in | 1 | ||||
-rw-r--r-- | configure.ac | 53 | ||||
-rw-r--r-- | distro-configs/LibreOfficeOssFuzz.conf | 1 | ||||
-rw-r--r-- | external/libetonyek/UnpackedTarball_libetonyek.mk | 1 | ||||
-rw-r--r-- | external/libetonyek/libetonyek-support-disable-liblangtag.patch.0 | 130 | ||||
-rw-r--r-- | i18nlangtag/CppunitTest_i18nlangtag_test_languagetag.mk | 2 | ||||
-rw-r--r-- | i18nlangtag/Library_i18nlangtag.mk | 2 | ||||
-rw-r--r-- | i18nlangtag/qa/cppunit/test_languagetag.cxx | 34 | ||||
-rw-r--r-- | i18nlangtag/source/languagetag/languagetag.cxx | 9 | ||||
-rw-r--r-- | i18nlangtag/source/languagetag/simple-langtag.cxx | 590 |
12 files changed, 18 insertions, 813 deletions
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index 429e3c379179..650c1b74d27a 100644 --- a/RepositoryExternal.mk +++ b/RepositoryExternal.mk @@ -926,7 +926,6 @@ endef endif # SYSTEM_LIBXSLT -ifeq ($(ENABLE_LIBLANGTAG),TRUE) ifneq ($(SYSTEM_LIBLANGTAG),) @@ -985,12 +984,6 @@ endef endif # SYSTEM_LIBLANGTAG -else - -gb_LinkTarget__use_liblangtag := -gb_ExternalProject__use_liblangtag := - -endif # ENABLE_LIBLANGTAG gb_ExternalProject__use_apr := diff --git a/config_host.mk.in b/config_host.mk.in index 5c35440ed0ad..68309d3b858d 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -142,7 +142,6 @@ export ENABLE_GTK_PRINT=@ENABLE_GTK_PRINT@ export ENABLE_HEADLESS=@ENABLE_HEADLESS@ export ENABLE_JAVA=@ENABLE_JAVA@ export ENABLE_KDE4=@ENABLE_KDE4@ -export ENABLE_LIBLANGTAG=@ENABLE_LIBLANGTAG@ export ENABLE_LPSOLVE=@ENABLE_LPSOLVE@ export ENABLE_LTO=@ENABLE_LTO@ export ENABLE_LWP=@ENABLE_LWP@ diff --git a/config_host/config_liblangtag.h.in b/config_host/config_liblangtag.h.in index 18a9c122276e..f639fb76c11a 100644 --- a/config_host/config_liblangtag.h.in +++ b/config_host/config_liblangtag.h.in @@ -1,7 +1,6 @@ #ifndef CONFIG_LIBLANGTAG_H #define CONFIG_LIBLANGTAG_H -#define ENABLE_LIBLANGTAG 0 #define LIBLANGTAG_INLINE_FIX 0 #endif diff --git a/configure.ac b/configure.ac index a2448e416577..8756e529a9b1 100644 --- a/configure.ac +++ b/configure.ac @@ -1485,12 +1485,6 @@ libo_FUZZ_ARG_ENABLE(firebird-sdbc, [Disable the build of the Firebird-SDBC driver if it doesn't compile for you.]), ,test "${enable_firebird_sdbc+set}" = set || enable_firebird_sdbc=yes) -libo_FUZZ_ARG_ENABLE(liblangtag, - AS_HELP_STRING([--disable-liblangtag], - [Disable use of liblangtag, and instead use an own simple - implementation.]), -) - AC_ARG_ENABLE(bogus-pkg-config, AS_HELP_STRING([--enable-bogus-pkg-config], [MACOSX only: on MacOSX pkg-config can cause trouble. by default if one is found in the PATH, an error is issued. This flag turn that error into a warning.]), @@ -11585,39 +11579,28 @@ AC_SUBST(AVAHI_LIBS) dnl =================================================================== dnl Test whether to use liblangtag dnl =================================================================== -ENABLE_LIBLANGTAG= SYSTEM_LIBLANGTAG= -AC_MSG_CHECKING([whether to use liblangtag]) -if test "$enable_liblangtag" = "yes" -o "$enable_liblangtag" = ""; then - ENABLE_LIBLANGTAG=TRUE +AC_MSG_CHECKING([whether to use system liblangtag]) +if test "$with_system_liblangtag" = yes; then + SYSTEM_LIBLANGTAG=TRUE AC_MSG_RESULT([yes]) - AC_MSG_CHECKING([whether to use system liblangtag]) - if test "$with_system_liblangtag" = yes; then - SYSTEM_LIBLANGTAG=TRUE - AC_MSG_RESULT([yes]) - PKG_CHECK_MODULES( LIBLANGTAG, liblangtag >= 0.4.0) - dnl cf. <https://bitbucket.org/tagoh/liblangtag/commits/9324836a0d1c> "Fix a build issue with inline keyword" - PKG_CHECK_EXISTS([liblangtag >= 0.5.5], [], [AC_DEFINE([LIBLANGTAG_INLINE_FIX])]) - LIBLANGTAG_CFLAGS=$(printf '%s' "$LIBLANGTAG_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g") - FilterLibs "${LIBLANGTAG_LIBS}" - LIBLANGTAG_LIBS="${filteredlibs}" - else - SYSTEM_LIBLANGTAG= - AC_MSG_RESULT([no]) - BUILD_TYPE="$BUILD_TYPE LIBLANGTAG" - LIBLANGTAG_CFLAGS="-I${WORKDIR}/UnpackedTarball/langtag" - if test "$COM" = "MSC"; then - LIBLANGTAG_LIBS="${WORKDIR}/UnpackedTarball/langtag/liblangtag/.libs/liblangtag.lib" - else - LIBLANGTAG_LIBS="-L${WORKDIR}/UnpackedTarball/langtag/liblangtag/.libs -llangtag" - fi - fi - AC_DEFINE(ENABLE_LIBLANGTAG) -else + PKG_CHECK_MODULES( LIBLANGTAG, liblangtag >= 0.4.0) + dnl cf. <https://bitbucket.org/tagoh/liblangtag/commits/9324836a0d1c> "Fix a build issue with inline keyword" + PKG_CHECK_EXISTS([liblangtag >= 0.5.5], [], [AC_DEFINE([LIBLANGTAG_INLINE_FIX])]) + LIBLANGTAG_CFLAGS=$(printf '%s' "$LIBLANGTAG_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g") + FilterLibs "${LIBLANGTAG_LIBS}" + LIBLANGTAG_LIBS="${filteredlibs}" +else + SYSTEM_LIBLANGTAG= AC_MSG_RESULT([no]) - LIBLANGTAG_CFLAGS="-DDISABLE_LIBLANGTAG" + BUILD_TYPE="$BUILD_TYPE LIBLANGTAG" + LIBLANGTAG_CFLAGS="-I${WORKDIR}/UnpackedTarball/langtag" + if test "$COM" = "MSC"; then + LIBLANGTAG_LIBS="${WORKDIR}/UnpackedTarball/langtag/liblangtag/.libs/liblangtag.lib" + else + LIBLANGTAG_LIBS="-L${WORKDIR}/UnpackedTarball/langtag/liblangtag/.libs -llangtag" + fi fi -AC_SUBST(ENABLE_LIBLANGTAG) AC_SUBST(SYSTEM_LIBLANGTAG) AC_SUBST(LIBLANGTAG_CFLAGS) AC_SUBST(LIBLANGTAG_LIBS) diff --git a/distro-configs/LibreOfficeOssFuzz.conf b/distro-configs/LibreOfficeOssFuzz.conf index 9476647b3573..7caa28c683a5 100644 --- a/distro-configs/LibreOfficeOssFuzz.conf +++ b/distro-configs/LibreOfficeOssFuzz.conf @@ -4,7 +4,6 @@ --enable-mergelibs --disable-runtime-optimizations --disable-database-connectivity ---disable-liblangtag --disable-gui --disable-gtk --disable-gtk3 diff --git a/external/libetonyek/UnpackedTarball_libetonyek.mk b/external/libetonyek/UnpackedTarball_libetonyek.mk index e95fb13348e6..eba2f6a8b574 100644 --- a/external/libetonyek/UnpackedTarball_libetonyek.mk +++ b/external/libetonyek/UnpackedTarball_libetonyek.mk @@ -24,7 +24,6 @@ ifneq ($(OS),MACOSX) ifneq ($(OS),WNT) $(eval $(call gb_UnpackedTarball_add_patches,libetonyek,\ external/libetonyek/libetonyek-bundled-soname.patch.0 \ - external/libetonyek/libetonyek-support-disable-liblangtag.patch.0 \ )) endif endif diff --git a/external/libetonyek/libetonyek-support-disable-liblangtag.patch.0 b/external/libetonyek/libetonyek-support-disable-liblangtag.patch.0 deleted file mode 100644 index 9f1db3f6761c..000000000000 --- a/external/libetonyek/libetonyek-support-disable-liblangtag.patch.0 +++ /dev/null @@ -1,130 +0,0 @@ ---- src/lib/IWORKLanguageManager.cpp.orig 2017-02-21 10:28:39.646017140 +0000 -+++ src/lib/IWORKLanguageManager.cpp 2017-02-21 10:29:26.601817549 +0000 -@@ -12,7 +12,9 @@ - #include <cstdlib> - #include <stdexcept> - -+#if !defined(DISABLE_LIBLANGTAG) - #include <liblangtag/langtag.h> -+#endif - - #include "libetonyek_utils.h" - -@@ -27,6 +29,7 @@ - - using std::string; - -+#if !defined(DISABLE_LIBLANGTAG) - namespace - { - -@@ -56,6 +59,7 @@ - } - - } -+#endif - - struct IWORKLanguageManager::LangDB - { -@@ -67,6 +71,7 @@ - IWORKLanguageManager::LangDB::LangDB() - : m_db() - { -+#if !defined(DISABLE_LIBLANGTAG) - shared_ptr<lt_lang_db_t> langDB(lt_db_get_lang(), lt_lang_db_unref); - shared_ptr<lt_iter_t> it(LT_ITER_INIT(langDB.get()), lt_iter_finish); - lt_pointer_t key(0); -@@ -77,6 +82,7 @@ - lt_lang_t *const lang = reinterpret_cast<lt_lang_t *>(value); - m_db[lt_lang_get_name(lang)] = tag; - } -+#endif - } - - IWORKLanguageManager::IWORKLanguageManager() -@@ -102,6 +108,10 @@ - if (invIt != m_invalidTags.end()) - return ""; - -+#if defined(DISABLE_LIBLANGTAG) -+ m_invalidTags.insert(tag); -+ return ""; -+#else - const shared_ptr<lt_tag_t> &langTag = parseTag(tag); - if (!langTag) - { -@@ -114,6 +124,7 @@ - addProperties(fullTag); - - return fullTag; -+#endif - } - - const std::string IWORKLanguageManager::addLanguage(const std::string &lang) -@@ -134,6 +145,10 @@ - return ""; - } - -+#if defined(DISABLE_LIBLANGTAG) -+ m_invalidLangs.insert(lang); -+ return ""; -+#else - const shared_ptr<lt_tag_t> &langTag = parseTag(langIt->second); - if (!langTag) - throw std::logic_error("cannot parse tag that came from liblangtag language DB"); -@@ -143,6 +158,7 @@ - addProperties(fullTag); - - return fullTag; -+#endif - } - - const std::string IWORKLanguageManager::addLocale(const std::string &locale) -@@ -156,6 +172,9 @@ - if (invIt != m_invalidLocales.end()) - return ""; - -+#if defined(DISABLE_LIBLANGTAG) -+ return ""; -+#else - lt_error_t *error = 0; - const shared_ptr<lt_tag_t> tag(lt_tag_convert_from_locale_string(locale.c_str(), &error), lt_tag_unref); - if ((error && lt_error_is_set(error, LT_ERR_ANY)) || !tag) -@@ -170,14 +189,19 @@ - addProperties(fullTag); - - return fullTag; -+#endif - } - - const std::string IWORKLanguageManager::getLanguage(const std::string &tag) const - { -+#if defined(DISABLE_LIBLANGTAG) -+ return ""; -+#else - const shared_ptr<lt_tag_t> &langTag = parseTag(tag); - if (!langTag) - throw std::logic_error("cannot parse tag that has been successfully parsed before"); - return lt_lang_get_name(lt_tag_get_language(langTag.get())); -+#endif - } - - const IWORKLanguageManager::LangDB &IWORKLanguageManager::getLangDB() const -@@ -189,6 +213,9 @@ - - void IWORKLanguageManager::addProperties(const std::string &tag) - { -+#if defined(DISABLE_LIBLANGTAG) -+ return; -+#else - const shared_ptr<lt_tag_t> &langTag = parseTag(tag); - if (!langTag) - throw std::logic_error("cannot parse tag that has been successfully parsed before"); -@@ -205,6 +232,7 @@ - props.insert("fo:script", lt_script_get_tag(script)); - - m_propsMap[tag] = props; -+#endif - } - - void IWORKLanguageManager::writeProperties(const std::string &tag, librevenge::RVNGPropertyList &props) const diff --git a/i18nlangtag/CppunitTest_i18nlangtag_test_languagetag.mk b/i18nlangtag/CppunitTest_i18nlangtag_test_languagetag.mk index 41993f9515b2..975a1dd0d566 100644 --- a/i18nlangtag/CppunitTest_i18nlangtag_test_languagetag.mk +++ b/i18nlangtag/CppunitTest_i18nlangtag_test_languagetag.mk @@ -21,7 +21,6 @@ $(eval $(call gb_CppunitTest_use_libraries,i18nlangtag_test_languagetag,\ $(gb_UWINAPI) \ )) -ifeq ($(ENABLE_LIBLANGTAG),TRUE) $(eval $(call gb_CppunitTest_use_externals,i18nlangtag_test_languagetag,\ liblangtag \ libxml2 \ @@ -32,7 +31,6 @@ $(eval $(call gb_CppunitTest_add_defs,i18nlangtag_test_languagetag,-DSYSTEM_LIBL else $(eval $(call gb_CppunitTest_use_package,i18nlangtag_test_languagetag,liblangtag_data)) endif -endif $(eval $(call gb_CppunitTest_add_exception_objects,i18nlangtag_test_languagetag,\ i18nlangtag/qa/cppunit/test_languagetag \ diff --git a/i18nlangtag/Library_i18nlangtag.mk b/i18nlangtag/Library_i18nlangtag.mk index f493558413df..140d8678429a 100644 --- a/i18nlangtag/Library_i18nlangtag.mk +++ b/i18nlangtag/Library_i18nlangtag.mk @@ -35,7 +35,6 @@ $(eval $(call gb_Library_add_exception_objects,i18nlangtag,\ )) -ifeq ($(ENABLE_LIBLANGTAG),TRUE) $(eval $(call gb_Library_use_external,i18nlangtag,liblangtag)) $(eval $(call gb_Library_use_external,i18nlangtag,libxml2)) $(eval $(call gb_Library_use_system_win32_libs,i18nlangtag,\ @@ -43,6 +42,5 @@ $(eval $(call gb_Library_use_system_win32_libs,i18nlangtag,\ kernel32 \ ) \ )) -endif # vim: set noet sw=4 ts=4: diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index 8f08d04ce758..c211c68422a9 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -17,7 +17,6 @@ #include <i18nlangtag/mslangid.hxx> #include <i18nlangtag/languagetag.hxx> -#include <config_liblangtag.h> #include <rtl/ustring.hxx> #include <rtl/ustrbuf.hxx> #include <osl/file.hxx> @@ -51,7 +50,6 @@ void TestLanguageTag::testAllTags() OUString aBcp47 = de_DE.getBcp47(); lang::Locale aLocale = de_DE.getLocale(); LanguageType nLanguageType = de_DE.getLanguageType(); -#if ENABLE_LIBLANGTAG CPPUNIT_ASSERT_EQUAL_MESSAGE("Default script should be stripped after canonicalize.", OUString("de-DE"), aBcp47 ); CPPUNIT_ASSERT_EQUAL( OUString("de"), aLocale.Language ); CPPUNIT_ASSERT_EQUAL( OUString("DE"), aLocale.Country ); @@ -61,18 +59,6 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT_EQUAL( OUString("DE"), de_DE.getCountry() ); CPPUNIT_ASSERT( de_DE.getScript().isEmpty() ); CPPUNIT_ASSERT_EQUAL( OUString("de"), de_DE.getLanguageAndScript() ); -#else - // The simple replacement code doesn't do any fancy stuff. - CPPUNIT_ASSERT_MESSAGE("Default script was stripped after canonicalize!?!", aBcp47 == s_de_Latn_DE ); - CPPUNIT_ASSERT( aLocale.Language == "qlt" ); - CPPUNIT_ASSERT( aLocale.Country == "DE" ); - CPPUNIT_ASSERT( aLocale.Variant == "de-Latn-DE" ); - CPPUNIT_ASSERT( LanguageTag::isOnTheFlyID( nLanguageType) ); // XXX not canonicalized! - CPPUNIT_ASSERT( de_DE.getLanguage() == "de" ); - CPPUNIT_ASSERT( de_DE.getCountry() == "DE" ); - CPPUNIT_ASSERT( de_DE.getScript() == "Latn" ); - CPPUNIT_ASSERT( de_DE.getLanguageAndScript() == "de-Latn" ); -#endif CPPUNIT_ASSERT_EQUAL( OUString("de-DE"), de_DE.makeFallback().getBcp47() ); } @@ -80,7 +66,6 @@ void TestLanguageTag::testAllTags() OUString s_klingon( "i-klingon" ); LanguageTag klingon( s_klingon, true ); lang::Locale aLocale = klingon.getLocale(); -#if ENABLE_LIBLANGTAG CPPUNIT_ASSERT_EQUAL( OUString("tlh"), klingon.getBcp47() ); CPPUNIT_ASSERT_EQUAL( OUString("tlh"), aLocale.Language ); CPPUNIT_ASSERT( aLocale.Country.isEmpty() ); @@ -92,19 +77,6 @@ void TestLanguageTag::testAllTags() LanguageType nLang = klingon.getLanguageType(); LanguageTag klingon_id( nLang); CPPUNIT_ASSERT_EQUAL( OUString("tlh"), klingon_id.getBcp47() ); -#else - CPPUNIT_ASSERT( klingon.getBcp47() == s_klingon ); - CPPUNIT_ASSERT( aLocale.Language == "qlt" ); - CPPUNIT_ASSERT_EQUAL( OUString(), aLocale.Country ); - CPPUNIT_ASSERT( aLocale.Variant == s_klingon ); - CPPUNIT_ASSERT( LanguageTag::isOnTheFlyID( klingon.getLanguageType()) ); - CPPUNIT_ASSERT( klingon.isValidBcp47() ); - CPPUNIT_ASSERT( !klingon.isIsoLocale() ); - CPPUNIT_ASSERT( !klingon.isIsoODF() ); - LanguageType nLang = klingon.getLanguageType(); - LanguageTag klingon_id( nLang); - CPPUNIT_ASSERT( klingon_id.getBcp47() == s_klingon ); -#endif } { @@ -462,7 +434,6 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT_EQUAL( OUString("en"), en_GB_oxendict_Fallbacks[4]); } -#if ENABLE_LIBLANGTAG // 'zh-yue-HK' uses redundant 'zh-yue' and should be preferred 'yue-HK' #if 0 /* XXX Disabled because liblangtag in lt_tag_canonicalize() after replacing @@ -492,7 +463,6 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT( zh_yue_HK_Fallbacks[1] == "yue"); } #endif -#endif // 'qtz' is a local use known pseudolocale for key ID resource { @@ -651,7 +621,6 @@ void TestLanguageTag::testAllTags() CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "en-US", &aCanonicalized, true) && aCanonicalized == "en-US" ); CPPUNIT_ASSERT( !LanguageTag::isValidBcp47( "x-foobar", &aCanonicalized, true) && aCanonicalized == "x-foobar" ); CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "qaa", &aCanonicalized, true) && aCanonicalized == "qaa" ); -#if ENABLE_LIBLANGTAG CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "de-Latn-DE", &aCanonicalized) && aCanonicalized == "de-DE" ); /* TODO: at least some (those we know) grandfathered tags should be * recognized by the replacement code. */ @@ -659,9 +628,6 @@ void TestLanguageTag::testAllTags() // en-GB-oed has become deprecated in updated language-subtag-registry database // (liblangtag 0.5.7) CPPUNIT_ASSERT( ( aCanonicalized == "en-GB-oxendict" ) || ( aCanonicalized == "en-GB-oed" ) ); -#else - CPPUNIT_ASSERT( LanguageTag::isValidBcp47( "de-Latn-DE", &aCanonicalized) && aCanonicalized == "de-Latn-DE" ); -#endif } } diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 11df86060d79..ac69abf9add0 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -24,19 +24,10 @@ //#define erDEBUG -#if ENABLE_LIBLANGTAG #if LIBLANGTAG_INLINE_FIX #define LT_HAVE_INLINE #endif #include <liblangtag/langtag.h> -#else -/* Replacement code for LGPL phobic and Android systems. - * For iOS we could probably use NSLocale instead, that should have more or - * less required functionality. If it is good enough, it could be used for Mac - * OS X, too. - */ -#include "simple-langtag.cxx" -#endif using namespace com::sun::star; diff --git a/i18nlangtag/source/languagetag/simple-langtag.cxx b/i18nlangtag/source/languagetag/simple-langtag.cxx deleted file mode 100644 index f5194a430bbc..000000000000 --- a/i18nlangtag/source/languagetag/simple-langtag.cxx +++ /dev/null @@ -1,590 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -/** Cheap and cheesy replacement code for liblangtag on systems that do not - allow / want LGPL code or dependencies on glib. - - XXX NOTE: This code does not check language tags for validity or if they - are registered with IANA, does not canonicalize or strip default script - tags if included nor does it do any other fancy stuff that liblangtag is - capable of. It just makes depending code work without. - */ - -#include <cstdlib> -#include <cstring> -#include <cstdio> - -namespace { - -typedef void* lt_pointer_t; - -struct lt_error_t { - void *something; - lt_error_t() : something(nullptr) {} -}; - -void* g_malloc(size_t s) -{ - return malloc(s); -} - -void g_free(void* p) -{ - if (p) - free(p); -} - -void lt_error_unref(lt_error_t *error) -{ - if (error) - { - g_free( error->something); - g_free( error); - } -} - -struct my_ref -{ - sal_uInt32 mnRef; - explicit my_ref() : mnRef(1) {} - virtual ~my_ref() {} - void incRef() { ++mnRef; } - void decRef() { if (--mnRef == 0) delete this; } -}; - -struct my_t_impl : public my_ref -{ - char* mpStr; - explicit my_t_impl() : my_ref(), mpStr(nullptr) {} - virtual ~my_t_impl() override { g_free( mpStr); } - explicit my_t_impl( const my_t_impl& r ) - : - my_ref(), - mpStr(r.mpStr ? strdup( r.mpStr) : nullptr) - { - } - my_t_impl& operator=( const my_t_impl& r ) - { - if (this == &r) - return *this; - g_free( mpStr); - mpStr = (r.mpStr ? strdup( r.mpStr) : nullptr); - return *this; - } - void assign( const char* str ) - { - g_free( mpStr); - mpStr = (str ? strdup( str) : nullptr); - } - void assign( const char* str, const char* stop ) - { - g_free( mpStr); - if (str && str < stop) - { - mpStr = static_cast<char*>(g_malloc( stop - str + 1)); - memcpy( mpStr, str, stop - str); - mpStr[stop - str] = 0; - } - else - mpStr = nullptr; - } - virtual void append( const char* str, const char* stop ) - { - if (str && str < stop) - { - size_t nOld = mpStr ? strlen( mpStr) : 0; - size_t nNew = nOld + (stop - str) + 1; - char* p = static_cast<char*>(g_malloc( nNew)); - if (nOld) - memcpy( p, mpStr, nOld); - memcpy( p + nOld, str, stop - str); - p[nNew-1] = 0; - g_free( mpStr); - mpStr = p; - } - } - virtual void zero() - { - g_free( mpStr); - mpStr = nullptr; - } -}; - -struct lt_lang_t : public my_t_impl -{ - explicit lt_lang_t() : my_t_impl() {} - virtual ~lt_lang_t() override {} -}; - -struct lt_script_t : public my_t_impl -{ - explicit lt_script_t() : my_t_impl() {} - virtual ~lt_script_t() override {} -}; - -struct lt_region_t : public my_t_impl -{ - explicit lt_region_t() : my_t_impl() {} - virtual ~lt_region_t() override {} -}; - -struct lt_variant_t : public my_t_impl -{ - explicit lt_variant_t() : my_t_impl() {} - virtual ~lt_variant_t() override {} -}; - -struct lt_string_t : public my_t_impl -{ - explicit lt_string_t() : my_t_impl() {} - virtual ~lt_string_t() override {} -}; - -struct lt_list_t : public my_t_impl -{ - lt_list_t* mpPrev; - lt_list_t* mpNext; - explicit lt_list_t() : my_t_impl(), mpPrev(nullptr), mpNext(nullptr) {} - explicit lt_list_t( const lt_list_t& r ) - : - my_t_impl( r), mpPrev(nullptr), mpNext(nullptr) - { - } - virtual ~lt_list_t() override - { - if (mpPrev) - mpPrev->mpNext = mpNext; - if (mpNext) - mpNext->mpPrev = mpPrev; - } -}; - -lt_pointer_t lt_list_value( const lt_list_t* p ) -{ - // This may look odd, but in this implementation the list element itself - // holds the char* mpStr to be obtained with lt_variant_get_tag() - return static_cast<lt_pointer_t>(const_cast<lt_list_t*>(p)); -} - -const lt_list_t* lt_list_next( const lt_list_t* p ) -{ - return p ? p->mpNext : nullptr; -} - -lt_list_t* my_copyList( const lt_list_t * pList ) -{ - lt_list_t* pNewList = nullptr; - lt_list_t* pLast = nullptr; - 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; -} - -void my_unrefList( lt_list_t* pList ) -{ - while (pList) - { - lt_list_t* pNext = pList->mpNext; - pList->decRef(); - pList = pNext; - } -} - -void my_appendToList( lt_list_t** ppList, lt_list_t* pEntry ) -{ - if (ppList) - { - if (!*ppList) - *ppList = pEntry; - else - { - lt_list_t* pThat = *ppList; - for (lt_list_t* pNext = pThat->mpNext; pNext; pNext = pThat->mpNext) - pThat = pNext; - pThat->mpNext = pEntry; - pEntry->mpPrev = pThat; - } - } -} - -// my_t_impl has a superfluous mpStr here, but simplifies things much in the -// parser. -struct my_t_list : public my_t_impl -{ - lt_list_t* mpList; - explicit my_t_list() : my_t_impl(), mpList(nullptr) {} - explicit my_t_list( const my_t_list& r ) : my_t_impl( r), mpList( my_copyList( r.mpList)) {} - virtual ~my_t_list() override - { - my_unrefList( mpList); - } - my_t_list& operator=( const my_t_list& r ) - { - if (this == &r) - return *this; - my_t_impl::operator=( r); - lt_list_t* pList = my_copyList( r.mpList); - my_unrefList( mpList); - mpList = pList; - return *this; - } - virtual void append( const char* str, const char* stop ) override - { - lt_list_t* p = new lt_list_t; - p->assign( str, stop); - my_appendToList( &mpList, p); - } - virtual void zero() override - { - my_t_impl::zero(); - my_unrefList( mpList); - mpList = nullptr; - } -}; - -struct lt_tag_t : public my_t_impl -{ - lt_lang_t maLanguage; - lt_script_t maScript; - lt_region_t maRegion; - my_t_list maVariants; - lt_string_t maPrivateUse; - explicit lt_tag_t() : my_t_impl(), maLanguage(), maScript(), maRegion(), maVariants() {} - virtual ~lt_tag_t() override {} - explicit lt_tag_t( const lt_tag_t& r ) - : - my_t_impl( r), - maLanguage( r.maLanguage), - maScript( r.maScript), - maRegion( r.maRegion), - maVariants( r.maVariants) - { - } - lt_tag_t& operator=( const lt_tag_t& r ) - { - if (this == &r) - return *this; - my_t_impl::operator=( r); - maLanguage = r.maLanguage; - maScript = r.maScript; - maRegion = r.maRegion; - maVariants = r.maVariants; - return *this; - } - void assign( const char* str ) - { - maLanguage.zero(); - maScript.zero(); - maRegion.zero(); - maVariants.zero(); - my_t_impl::assign( str); - } -}; - -void lt_db_initialize() { } -void lt_db_finalize() { } -void lt_db_set_datadir( const char* /* dir */ ) { } - -lt_tag_t* lt_tag_new() -{ - return new lt_tag_t; -} - -lt_tag_t* lt_tag_copy(lt_tag_t *tag) -{ - return (tag ? new lt_tag_t( *tag) : nullptr); -} - -void lt_tag_unref(lt_tag_t *tag) -{ - if (tag) - tag->decRef(); -} - -/** See http://tools.ietf.org/html/rfc5646 - - We are simply ignorant of grandfathered (irregular and regular) subtags and - may either bail out or accept them, sorry (or not). However, we do accept - any i-* irregular and x-* privateuse. Subtags are not checked for validity - (alpha, digit, registered, ...). - */ -int lt_tag_parse(lt_tag_t *tag, - const char *tag_string, - lt_error_t **error) -{ - (void) error; - if (!tag) - return 0; - tag->assign( tag_string); - if (!tag_string) - return 0; - // In case we supported other subtags this would get more complicated. - my_t_impl* aSubtags[] = { &tag->maLanguage, &tag->maScript, &tag->maRegion, &tag->maVariants, nullptr }; - my_t_impl** ppSub = &aSubtags[0]; - const char* pStart = tag_string; - const char* p = pStart; - const char* pEnd = pStart + strlen( pStart); // scanning includes \0 - bool bStartLang = true; - bool bPrivate = false; - for ( ; p <= pEnd && ppSub && *ppSub; ++p) - { - if (p == pEnd || *p == '-') - { - size_t nLen = p - pStart; - if (*ppSub == &tag->maLanguage) - { - if (bStartLang) - { - bStartLang = false; - switch (nLen) - { - case 1: // irregular or privateuse - if (*pStart == 'i' || *pStart == 'x') - { - (*ppSub)->assign( pStart, p); - bPrivate = true; - if (*pStart == 'x') - { - // Simply copy all to privateuse field, we - // do not care here what part actually is - // private. - tag->maPrivateUse.assign( pStart, pEnd); - } - } - else - return 0; // bad - break; - case 2: // ISO 639 alpha-2 - case 3: // ISO 639 alpha-3 - (*ppSub)->assign( pStart, p); - break; - case 4: // reserved for future use - return 0; // bad - break; - case 5: - case 6: - case 7: - case 8: // registered language subtag - (*ppSub++)->assign( pStart, p); - break; - default: - return 0; // bad - } - } - else - { - if (nLen > 8) - return 0; // bad - if (bPrivate) - { - // Any combination of "x" 1*("-" (2*8alphanum)) - // allowed, store first as language and return ok. - // For i-* simply assume the same. - (*ppSub)->append( pStart-1, p); - return 1; // ok - } - else if (nLen == 3) - { - // extlang subtag, 1 to 3 allowed we don't check that. - // But if it's numeric it's a region UN M.49 code - // instead and no script subtag is present, so advance. - if ('0' <= *pStart && *pStart <= '9') - { - ppSub += 2; // &tag->maRegion XXX watch this when inserting fields - --p; - continue; // for - } - else - (*ppSub)->append( pStart-1, p); - } - else - { - // Not part of language subtag, advance. - ++ppSub; - --p; - continue; // for - } - } - } - else if (*ppSub == &tag->maScript) - { - switch (nLen) - { - case 4: - // script subtag, or a (DIGIT 3alphanum) variant with - // no script and no region - if ('0' <= *pStart && *pStart <= '9') - { - ppSub += 2; // &tag->maVariants XXX watch this when inserting fields - --p; - continue; // for - } - else - (*ppSub++)->assign( pStart, p); - break; - case 3: - // This may be a region UN M.49 code if 3DIGIT and no - // script code present. Just check first character and - // advance. - if ('0' <= *pStart && *pStart <= '9') - { - ++ppSub; - --p; - continue; // for - } - else - return 0; // bad - break; - case 2: - // script omitted, region subtag, advance. - ++ppSub; - --p; - continue; // for - break; - case 1: - // script omitted, region omitted, extension subtag - // with singleton, stop parsing - ppSub = nullptr; - break; - case 5: - case 6: - case 7: - case 8: - // script omitted, region omitted, variant subtag - ppSub += 2; // &tag->maVariants XXX watch this when inserting fields - --p; - continue; // for - break; - default: - return 0; // bad - } - } - else if (*ppSub == &tag->maRegion) - { - if (nLen == 2 || nLen == 3) - (*ppSub++)->assign( pStart, p); - else - { - // advance to variants - ++ppSub; - --p; - continue; // for - } - } - else if (*ppSub == &tag->maVariants) - { - // Stuff the remainder into variants, might not be correct, but ... - switch (nLen) - { - case 4: - // a (DIGIT 3alphanum) variant - if ('0' <= *pStart && *pStart <= '9') - ; // nothing - else - return 0; // bad - break; - case 5: - case 6: - case 7: - case 8: - ; // nothing, variant - break; - default: - return 0; // bad - } - (*ppSub)->append( pStart, p); - } - pStart = p+1; - } - } - return 1; -} - -char* lt_tag_canonicalize(lt_tag_t *tag, - lt_error_t **error) -{ - (void) error; - return tag && tag->mpStr ? strdup( tag->mpStr) : nullptr; -} - -const lt_lang_t* lt_tag_get_language(const lt_tag_t *tag) -{ - return tag && tag->maLanguage.mpStr ? &tag->maLanguage : nullptr; -} - -const lt_script_t *lt_tag_get_script(const lt_tag_t *tag) -{ - return tag && tag->maScript.mpStr ? &tag->maScript : nullptr; -} - -const lt_region_t *lt_tag_get_region(const lt_tag_t *tag) -{ - return tag && tag->maRegion.mpStr ? &tag->maRegion : nullptr; -} - -const lt_list_t *lt_tag_get_variants(const lt_tag_t *tag) -{ - return tag ? tag->maVariants.mpList : nullptr; -} - -const lt_string_t *lt_tag_get_privateuse(const lt_tag_t *tag) -{ - return tag && tag->maPrivateUse.mpStr ? &tag->maPrivateUse : nullptr; -} - -const char *lt_lang_get_tag(const lt_lang_t *lang) -{ - return lang ? lang->mpStr : nullptr; -} - -const char *lt_script_get_tag(const lt_script_t *script) -{ - return script ? script->mpStr : nullptr; -} - -const char *lt_region_get_tag(const lt_region_t *region) -{ - return region ? region->mpStr : nullptr; -} - -const char *lt_variant_get_tag(const lt_variant_t *variant) -{ - return variant ? variant->mpStr : nullptr; -} - -size_t lt_string_length(const lt_string_t *string) -{ - return string ? strlen(string->mpStr) : 0; -} - -#ifdef erDEBUG -void lt_tag_dump(const lt_tag_t *tag) -{ - fprintf( stderr, "\n"); - fprintf( stderr, "SimpleLangtag langtag: %s\n", tag->mpStr); - fprintf( stderr, "SimpleLangtag language: %s\n", tag->maLanguage.mpStr); - fprintf( stderr, "SimpleLangtag script: %s\n", tag->maScript.mpStr); - fprintf( stderr, "SimpleLangtag region: %s\n", tag->maRegion.mpStr); -} -#endif - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |