[Libreoffice-commits] core.git: l10ntools/inc l10ntools/source l10ntools/StaticLibrary_transex.mk

Zolnai Tamás zolnaitamas2000 at gmail.com
Wed Mar 27 12:10:07 PDT 2013


 l10ntools/StaticLibrary_transex.mk |    3 
 l10ntools/inc/common.hxx           |   53 +++++
 l10ntools/inc/export.hxx           |  122 +-----------
 l10ntools/inc/helper.hxx           |   39 +++
 l10ntools/inc/helpmerge.hxx        |    1 
 l10ntools/inc/lngmerge.hxx         |    2 
 l10ntools/inc/xrmmerge.hxx         |    1 
 l10ntools/source/cfgmerge.cxx      |  100 +++++++++-
 l10ntools/source/common.cxx        |  153 +++++++++++++++
 l10ntools/source/common.hxx        |   76 -------
 l10ntools/source/export.cxx        |  114 ++++++++---
 l10ntools/source/export2.cxx       |  364 -------------------------------------
 l10ntools/source/helper.cxx        |   88 ++++++++
 l10ntools/source/helper.hxx        |  181 ------------------
 l10ntools/source/helpex.cxx        |    5 
 l10ntools/source/helpmerge.cxx     |    3 
 l10ntools/source/lngex.cxx         |    6 
 l10ntools/source/lngmerge.cxx      |   15 +
 l10ntools/source/merge.cxx         |  102 ++++++++++
 l10ntools/source/propex.cxx        |    8 
 l10ntools/source/propmerge.cxx     |    2 
 l10ntools/source/stringex.cxx      |    8 
 l10ntools/source/stringmerge.cxx   |   23 --
 l10ntools/source/treemerge.cxx     |   26 --
 l10ntools/source/treex.cxx         |    6 
 l10ntools/source/uimerge.cxx       |   72 -------
 l10ntools/source/xmlparse.cxx      |   78 +++----
 l10ntools/source/xrmmerge.cxx      |   11 -
 28 files changed, 714 insertions(+), 948 deletions(-)

New commits:
commit 8e26b4783f1f47ff5d489e7df5869240eefd1071
Author: Zolnai Tamás <zolnaitamas2000 at gmail.com>
Date:   Wed Mar 27 20:08:50 2013 +0100

    Refactor l10ntools
    
    Delete unused functions.
    Make Export class more encapsulated.
    Move to local that functions which are used only in one file.
    Common contans method which are used by all executables.
    Helper contains methods belong to xml parsing.
    
    Change-Id: I28773a2c7eea90da7df7f32720fd38de2cb661ac

diff --git a/l10ntools/StaticLibrary_transex.mk b/l10ntools/StaticLibrary_transex.mk
index 033358a..0c3bbff4 100644
--- a/l10ntools/StaticLibrary_transex.mk
+++ b/l10ntools/StaticLibrary_transex.mk
@@ -43,7 +43,8 @@ $(eval $(call gb_StaticLibrary_use_externals,transex,\
 ))
 
 $(eval $(call gb_StaticLibrary_add_exception_objects,transex,\
-    l10ntools/source/export2 \
+    l10ntools/source/helper \
+    l10ntools/source/common \
     l10ntools/source/merge \
     l10ntools/source/po \
 ))
diff --git a/l10ntools/inc/common.hxx b/l10ntools/inc/common.hxx
new file mode 100644
index 0000000..93f2d00
--- /dev/null
+++ b/l10ntools/inc/common.hxx
@@ -0,0 +1,53 @@
+/* -*- 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/.
+ */
+
+/// Methods used by all of executables
+
+#ifndef INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX
+#define INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX
+
+#include "sal/config.h"
+
+#include <iostream>
+#include <rtl/string.hxx>
+#include "po.hxx"
+
+namespace common {
+
+//result type of handleArguments()
+struct HandledArgs
+{
+    OString m_sInputFile;
+    OString m_sOutputFile;
+    OString m_sMergeSrc;
+    OString m_sLanguage;
+    bool m_bMergeMode;
+    HandledArgs()
+        : m_sInputFile( OString() )
+        , m_sOutputFile( OString() )
+        , m_sMergeSrc( OString() )
+        , m_sLanguage( OString() )
+        , m_bMergeMode( false )
+    {}
+};
+
+bool handleArguments(int argc, char * argv[], HandledArgs& o_aHandledArgs);
+
+void writeUsage(const OString& rName, const OString& rFileType);
+
+void writePoEntry(
+    const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile,
+    const OString& rResType, const OString& rGroupId, const OString& rLocalId,
+    const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType = PoEntry::TTEXT );
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/inc/export.hxx b/l10ntools/inc/export.hxx
index fbe7ada..e3a0913 100644
--- a/l10ntools/inc/export.hxx
+++ b/l10ntools/inc/export.hxx
@@ -109,6 +109,8 @@ public:
 class ResData
 {
 public:
+    ResData(const rtl::OString &rPF, const rtl::OString &rGId);
+    ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename);
     ~ResData();
     sal_Bool SetId(const rtl::OString &rId, sal_uInt16 nLevel);
 
@@ -153,67 +155,6 @@ public:
     ExportList  *pPairedList;
 
     rtl::OString sPForm;
-
-    ResData(const rtl::OString &rPF, const rtl::OString &rGId)
-            :
-            nWidth( 0 ),
-            nChildIndex( 0 ),
-            nIdLevel( ID_LEVEL_NULL ),
-            bChild( sal_False ),
-            bChildWithText( sal_False ),
-            bText( sal_False ),
-            bHelpText( sal_False ),
-            bQuickHelpText( sal_False ),
-            bTitle( sal_False ),
-            bList( sal_False ),
-            bRestMerged( sal_False ),
-            sGId( rGId ),
-            nTextRefId( REFID_NONE ),
-            nHelpTextRefId( REFID_NONE ),
-            nQuickHelpTextRefId( REFID_NONE ),
-            nTitleRefId( REFID_NONE ),
-            sTextTyp( "Text" ),
-            pStringList( NULL ),
-            pUIEntries( NULL ),
-            pItemList( NULL ),
-            pFilterList( NULL ),
-            pPairedList( NULL ),
-            sPForm( rPF )
-    {
-        sGId = sGId.replaceAll("\r", rtl::OString());
-        sPForm = sPForm.replaceAll("\r", rtl::OString());
-    }
-
-    ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename)
-            :
-            nWidth( 0 ),
-            nChildIndex( 0 ),
-            nIdLevel( ID_LEVEL_NULL ),
-            bChild( sal_False ),
-            bChildWithText( sal_False ),
-            bText( sal_False ),
-            bHelpText( sal_False ),
-            bQuickHelpText( sal_False ),
-            bTitle( sal_False ),
-            bList( sal_False ),
-            bRestMerged( sal_False ),
-            sGId( rGId ),
-            sFilename( rFilename ),
-            nTextRefId( REFID_NONE ),
-            nHelpTextRefId( REFID_NONE ),
-            nQuickHelpTextRefId( REFID_NONE ),
-            nTitleRefId( REFID_NONE ),
-            sTextTyp( "Text" ),
-            pStringList( NULL ),
-            pUIEntries( NULL ),
-            pItemList( NULL ),
-            pFilterList( NULL ),
-            pPairedList( NULL ),
-            sPForm( rPF )
-    {
-        sGId = sGId.replaceAll("\r", rtl::OString());
-        sPForm = sPForm.replaceAll("\r", rtl::OString());
-    }
 };
 
 
@@ -244,23 +185,6 @@ typedef ::std::vector< ResData* > ResStack;
 class WordTransformer;
 class ParserQueue;
 
-//result type of handleArguments()
-struct HandledArgs
-{
-    OString m_sInputFile;
-    OString m_sOutputFile;
-    OString m_sMergeSrc;
-    OString m_sLanguage;
-    bool m_bMergeMode;
-    HandledArgs()
-        : m_sInputFile( OString() )
-        , m_sOutputFile( OString() )
-        , m_sMergeSrc( OString() )
-        , m_sLanguage( OString() )
-        , m_bMergeMode( false )
-    {}
-};
-
 class Export
 {
 private:
@@ -292,40 +216,11 @@ private:
     sal_Bool bReadOver;
     sal_Bool bDontWriteOutput;
     rtl::OString sLastTextTyp;
-    static bool isInitialized;
+    bool isInitialized;
     rtl::OString sFilename;
+    rtl::OString sLanguages;
 
-
-public:
-    ParserQueue* pParseQueue; // public ?
-    static rtl::OString sLanguages; // public ?
-
-    static bool handleArguments(int argc, char * argv[], HandledArgs& o_aHandledArgs);
-    static void writeUsage(const OString& rName, const OString& rFileType);
-    static void writePoEntry(const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile,
-                             const OString& rResType, const OString& rGroupId, const OString& rLocalId,
-                             const OString& rHelpText, const OString& rText,
-                             const PoEntry::TYPE eType = PoEntry::TTEXT);
-
-    static void InitLanguages( bool bMergeMode = false );
-    static void InitForcedLanguages( bool bMergeMode = false );
-    static std::vector<rtl::OString> GetLanguages();
-
-    static void SetLanguages( std::vector<rtl::OString> val );
-    static void RemoveUTF8ByteOrderMarker( rtl::OString &rString );
-    static bool hasUTF8ByteOrderMarker( const rtl::OString &rString );
-    static rtl::OString QuoteHTML( rtl::OString const &rString );
-
-    static rtl::OString UnquoteHTML( rtl::OString const &rString );
-
-    static bool isSourceLanguage(const rtl::OString &rLanguage);
-    static bool isAllowed(const rtl::OString &rLanguage);
-
-    static void Languages( std::vector<rtl::OString>::const_iterator& begin , std::vector<rtl::OString>::const_iterator& end );
-
-private:
-    static std::vector<rtl::OString> aLanguages;
-    static std::vector<rtl::OString> aForcedLanguages;
+    std::vector<rtl::OString> aLanguages;
 
     sal_Bool WriteData( ResData *pResData, sal_Bool bCreateNew = sal_False );// called befor dest. cur ResData
     sal_Bool WriteExportList( ResData *pResData, ExportList *pExportList,
@@ -352,17 +247,20 @@ private:
     void WriteToMerged(const rtl::OString &rText , bool bSDFContent);
     void SetChildWithText();
 
+    void InitLanguages( bool bMergeMode = false );
+
     void CutComment( rtl::OString &rText );
 
 public:
-    Export(const rtl::OString &rOutput);
-    Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput);
+    Export(const OString &rOutput, const OString &rLanguage);
+    Export(const OString &rMergeSource, const OString &rOutput, const OString &rLanguage);
     ~Export();
 
     void Init();
     int Execute( int nToken, const char * pToken ); // called from lexer
     void SetError() { bError = sal_True; }
     sal_Bool GetError() { return bError; }
+    ParserQueue* pParseQueue; // public!!
 };
 
 
diff --git a/l10ntools/inc/helper.hxx b/l10ntools/inc/helper.hxx
new file mode 100644
index 0000000..4dd2dd1
--- /dev/null
+++ b/l10ntools/inc/helper.hxx
@@ -0,0 +1,39 @@
+/* -*- 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/.
+ */
+
+/// Helper methods to work with xml files
+
+#ifndef INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX
+#define INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX
+
+#include "sal/config.h"
+#include "sal/types.h"
+
+#include <cassert>
+
+#include <libxml/parser.h>
+
+#include <rtl/string.hxx>
+#include <rtl/strbuf.hxx>
+
+
+namespace helper {
+
+OString QuotHTML(const rtl::OString &rString);
+
+bool isWellFormedXML( OString const & text );
+
+//Convert xmlChar* to OString
+OString xmlStrToOString( const xmlChar* pString );
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/inc/helpmerge.hxx b/l10ntools/inc/helpmerge.hxx
index fd11609..1f11726 100644
--- a/l10ntools/inc/helpmerge.hxx
+++ b/l10ntools/inc/helpmerge.hxx
@@ -17,7 +17,6 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#include "export.hxx"
 #include "xmlparse.hxx"
 #include <rtl/ustring.hxx>
 #include <rtl/ustrbuf.hxx>
diff --git a/l10ntools/inc/lngmerge.hxx b/l10ntools/inc/lngmerge.hxx
index 4631bb3..8c5940c 100644
--- a/l10ntools/inc/lngmerge.hxx
+++ b/l10ntools/inc/lngmerge.hxx
@@ -22,8 +22,8 @@
 #include <iosfwd>
 #include <vector>
 
+#include "common.hxx"
 #include "export.hxx"
-#include "po.hxx"
 
 typedef std::vector< rtl::OString* > LngLineList;
 
diff --git a/l10ntools/inc/xrmmerge.hxx b/l10ntools/inc/xrmmerge.hxx
index 8373626..8659fe1 100644
--- a/l10ntools/inc/xrmmerge.hxx
+++ b/l10ntools/inc/xrmmerge.hxx
@@ -20,7 +20,6 @@
 #include "sal/config.h"
 
 #include <fstream>
-#include "po.hxx"
 
 //
 // XRMResParser
diff --git a/l10ntools/source/cfgmerge.cxx b/l10ntools/source/cfgmerge.cxx
index 4586e71..6956200 100644
--- a/l10ntools/source/cfgmerge.cxx
+++ b/l10ntools/source/cfgmerge.cxx
@@ -47,10 +47,10 @@ extern "C" {
 
 FILE * init(int argc, char ** argv) {
 
-    HandledArgs aArgs;
-    if ( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("cfgex","*.xcu");
+        common::writeUsage("cfgex","*.xcu");
         std::exit(EXIT_FAILURE);
     }
     global::inputPathname = aArgs.m_sInputFile;
@@ -83,6 +83,88 @@ void workOnTokenSet(int nTyp, char * pTokenText) {
 
 }
 
+namespace
+{
+
+static OString lcl_QuoteHTML( const OString& rString )
+{
+    rtl::OStringBuffer sReturn;
+    for ( sal_Int32 i = 0; i < rString.getLength(); i++ ) {
+        rtl::OString sTemp = rString.copy( i );
+        if ( sTemp.match( "<Arg n=" ) ) {
+            while ( i < rString.getLength() && rString[i] != '>' ) {
+                 sReturn.append(rString[i]);
+                i++;
+            }
+            if ( rString[i] == '>' ) {
+                sReturn.append('>');
+                i++;
+            }
+        }
+        if ( i < rString.getLength()) {
+            switch ( rString[i]) {
+                case '<':
+                    sReturn.append("<");
+                break;
+
+                case '>':
+                    sReturn.append(">");
+                break;
+
+                case '\"':
+                    sReturn.append(""");
+                break;
+
+                case '\'':
+                    sReturn.append("'");
+                break;
+
+                case '&':
+                    if ((( i + 4 ) < rString.getLength()) &&
+                        ( rString.copy( i, 5 ) == "&" ))
+                            sReturn.append(rString[i]);
+                    else
+                        sReturn.append("&");
+                break;
+
+                default:
+                    sReturn.append(rString[i]);
+                break;
+            }
+        }
+    }
+    return sReturn.makeStringAndClear();
+}
+
+static OString lcl_UnquoteHTML( const OString& rString )
+{
+    rtl::OStringBuffer sReturn;
+    for (sal_Int32 i = 0; i != rString.getLength();) {
+        if (rString.match("&", i)) {
+            sReturn.append('&');
+            i += RTL_CONSTASCII_LENGTH("&");
+        } else if (rString.match("<", i)) {
+            sReturn.append('<');
+            i += RTL_CONSTASCII_LENGTH("<");
+        } else if (rString.match(">", i)) {
+            sReturn.append('>');
+            i += RTL_CONSTASCII_LENGTH(">");
+        } else if (rString.match(""", i)) {
+            sReturn.append('"');
+            i += RTL_CONSTASCII_LENGTH(""");
+        } else if (rString.match("'", i)) {
+            sReturn.append('\'');
+            i += RTL_CONSTASCII_LENGTH("'");
+        } else {
+            sReturn.append(rString[i]);
+            ++i;
+        }
+    }
+    return sReturn.makeStringAndClear();
+}
+
+} // anonymous namespace
+
 //
 // class CfgStackData
 //
@@ -407,9 +489,9 @@ void CfgExport::WorkOnResourceEnd()
                 if ( sText.isEmpty())
                     sText = sFallback;
 
-                sText = Export::UnquoteHTML( sText );
+                sText = lcl_UnquoteHTML( sText );
 
-                Export::writePoEntry(
+                common::writePoEntry(
                     "Cfgex", pOutputStream, sPath, pStackData->sResTyp,
                     sGroupId, sLocalId, sXComment, sText);
             }
@@ -422,7 +504,7 @@ void CfgExport::WorkOnText(
     const rtl::OString &rIsoLang
 )
 {
-    if( rIsoLang.getLength() ) rText = Export::UnquoteHTML( rText );
+    if( rIsoLang.getLength() ) rText = lcl_UnquoteHTML( rText );
 }
 
 
@@ -499,10 +581,10 @@ void CfgMerge::WorkOnText(rtl::OString &rText, const rtl::OString& rLangIndex)
             rtl::OString sContent;
             pEntrys->GetText( sContent, STRING_TYP_TEXT, rLangIndex );
 
-            if ( Export::isAllowed( rLangIndex ) &&
+            if ( !rLangIndex.equalsIgnoreAsciiCase("en-US") &&
                 ( sContent != "-" ) && !sContent.isEmpty())
             {
-                rText = Export::QuoteHTML( rText );
+                rText = lcl_QuoteHTML( rText );
             }
         }
     }
@@ -534,7 +616,7 @@ void CfgMerge::WorkOnResourceEnd()
                     ( sContent != "-" ) && !sContent.isEmpty())
                 {
 
-                    rtl::OString sText = Export::QuoteHTML( sContent);
+                    rtl::OString sText = lcl_QuoteHTML( sContent);
 
                     rtl::OString sAdditionalLine( "\t" );
 
diff --git a/l10ntools/source/common.cxx b/l10ntools/source/common.cxx
new file mode 100644
index 0000000..3530211
--- /dev/null
+++ b/l10ntools/source/common.cxx
@@ -0,0 +1,153 @@
+/* -*- 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/.
+ */
+
+#include "common.hxx"
+#include "po.cxx"
+
+//flags for handleArguments()
+#define STATE_NON       0x0001
+#define STATE_INPUT     0x0002
+#define STATE_OUTPUT    0x0003
+#define STATE_MERGESRC  0x0005
+#define STATE_LANGUAGES 0x0006
+
+namespace common {
+
+bool handleArguments(
+    int argc, char * argv[], HandledArgs& o_aHandledArgs)
+{
+    o_aHandledArgs = HandledArgs();
+    sal_uInt16 nState = STATE_NON;
+
+    for( int i = 1; i < argc; i++ )
+    {
+        if ( OString( argv[ i ] ).toAsciiUpperCase() == "-I" )
+        {
+            nState = STATE_INPUT; // next token specifies source file
+        }
+        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-O" )
+        {
+            nState = STATE_OUTPUT; // next token specifies the dest file
+        }
+        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-M" )
+        {
+            nState = STATE_MERGESRC; // next token specifies the merge database
+        }
+        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-L" )
+        {
+            nState = STATE_LANGUAGES;
+        }
+        else
+        {
+            switch ( nState )
+            {
+                case STATE_NON:
+                {
+                    return false;    // no valid command line
+                }
+                case STATE_INPUT:
+                {
+                    o_aHandledArgs.m_sInputFile = OString( argv[i] );
+                }
+                break;
+                case STATE_OUTPUT:
+                {
+                    o_aHandledArgs.m_sOutputFile = OString( argv[i] );
+                }
+                break;
+                case STATE_MERGESRC:
+                {
+                    o_aHandledArgs.m_sMergeSrc = OString( argv[i] );
+                    o_aHandledArgs.m_bMergeMode = true;
+                }
+                break;
+                case STATE_LANGUAGES:
+                {
+                    o_aHandledArgs.m_sLanguage = OString( argv[i] );
+                }
+                break;
+            }
+        }
+    }
+    if( !o_aHandledArgs.m_sInputFile.isEmpty() &&
+        !o_aHandledArgs.m_sOutputFile.isEmpty() )
+    {
+        return true;
+    }
+    else
+    {
+        o_aHandledArgs = HandledArgs();
+        return false;
+    }
+}
+
+void writeUsage(const OString& rName, const OString& rFileType)
+{
+    std::cout
+        << " Syntax: " << rName.getStr()
+        << " -i FileIn -o FileOut [-m DataBase] [-l Lang]\n"
+        << " FileIn:   Source files (" << rFileType.getStr() << ")\n"
+        << " FileOut:  Destination file (*.*)\n"
+        << " DataBase: Mergedata (*.po)\n"
+        << " Lang: Restrict the handled languag; one element of\n"
+        << " (de, en-US, ...) or all\n";
+}
+
+void writePoEntry(
+    const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile,
+    const OString& rResType, const OString& rGroupId, const OString& rLocalId,
+    const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType )
+{
+    try
+    {
+        PoEntry aPO(rSourceFile, rResType, rGroupId, rLocalId, rHelpText, rText, eType);
+        rPoStream.writeEntry( aPO );
+    }
+    catch( PoEntry::Exception& aException )
+    {
+        if(aException == PoEntry::NOSOURCFILE)
+        {
+            std::cerr << rExecutable << " warning: no sourcefile specified for po entry\n";
+        }
+        else
+        {
+            std::cerr << rExecutable << " warning: inavlid po attributes extracted from " <<  rSourceFile << "\n";
+            if(aException == PoEntry::NOGROUPID)
+            {
+                std::cerr << "No groupID specified!\n";
+                std::cerr << "String: " << rText << "\n";
+            }
+            else if (aException == PoEntry::NOSTRING)
+            {
+                std::cerr << "No string specified!\n";
+                std::cerr << "GroupID: " << rGroupId << "\n";
+                if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n";
+            }
+            else
+            {
+                if (aException == PoEntry::NORESTYPE)
+                {
+                    std::cerr << "No resource type specified!\n";
+                }
+                else if (aException == PoEntry::WRONGHELPTEXT)
+                {
+                    std::cerr << "x-comment length is 5 characters:" << rHelpText << "\n";
+                }
+
+                std::cerr << "GroupID: " << rGroupId << "\n";
+                if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n";
+                std::cerr << "String: " << rText << "\n";
+            }
+        }
+    }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/source/common.hxx b/l10ntools/source/common.hxx
deleted file mode 100644
index 6c2d2c7..0000000
--- a/l10ntools/source/common.hxx
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * Version: MPL 1.1 / GPLv3+ / LGPLv3+
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License or as specified alternatively below. You may obtain a copy of
- * the License at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * Major Contributor(s):
- * [ Copyright (C) 2012 Red Hat, Inc., Stephan Bergmann <sbergman at redhat.com>
- *   (initial developer) ]
- *
- * All Rights Reserved.
- *
- * For minor contributions see the git repository.
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
- * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
- * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
- * instead of those above.
- */
-
-#ifndef INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX
-#define INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX
-
-#include "sal/config.h"
-
-#include <cstdlib>
-#include <iostream>
-
-#include "osl/file.hxx"
-#include "osl/process.h"
-#include "osl/thread.h"
-#include "rtl/string.h"
-#include "rtl/string.hxx"
-#include "rtl/textcvt.h"
-#include "rtl/uri.hxx"
-#include "rtl/ustring.h"
-#include "rtl/ustring.hxx"
-
-namespace common {
-
-inline rtl::OUString pathnameToAbsoluteUrl(rtl::OUString const & pathname) {
-    rtl::OUString url;
-    if (osl::FileBase::getFileURLFromSystemPath(pathname, url)
-        != osl::FileBase::E_None)
-    {
-        std::cerr << "Error: Cannot convert input pathname to URL\n";
-        std::exit(EXIT_FAILURE);
-    }
-    rtl::OUString cwd;
-    if (osl_getProcessWorkingDir(&cwd.pData) != osl_Process_E_None) {
-        std::cerr << "Error: Cannot determine cwd\n";
-        std::exit(EXIT_FAILURE);
-    }
-    if (osl::FileBase::getAbsoluteFileURL(cwd, url, url)
-        != osl::FileBase::E_None)
-    {
-        std::cerr << "Error: Cannot convert input URL to absolute URL\n";
-        std::exit(EXIT_FAILURE);
-    }
-    return url;
-}
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/source/export.cxx b/l10ntools/source/export.cxx
index 912f80b..900e850 100644
--- a/l10ntools/source/export.cxx
+++ b/l10ntools/source/export.cxx
@@ -27,7 +27,6 @@
 #include <stdlib.h>
 #include "common.hxx"
 #include "export.hxx"
-#include "helper.hxx"
 #include "tokens.h"
 #include <iostream>
 #include <rtl/strbuf.hxx>
@@ -45,20 +44,19 @@ OString inputPathname;
 boost::scoped_ptr< Export > exporter;
 
 }
+
 }
 
 extern "C" {
 
 FILE * init(int argc, char ** argv) {
 
-    HandledArgs aArgs;
-    if ( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("transex3","*.src/*.hrc");
+        common::writeUsage("transex3","*.src/*.hrc");
         std::exit(EXIT_FAILURE);
     }
-    Export::sLanguages = aArgs.m_sLanguage;
-    Export::InitLanguages();
     global::inputPathname =  aArgs.m_sInputFile;
 
     FILE * pFile = std::fopen(global::inputPathname.getStr(), "r");
@@ -71,9 +69,9 @@ FILE * init(int argc, char ** argv) {
 
     if (aArgs.m_bMergeMode) {
         global::exporter.reset(
-            new Export(aArgs.m_sMergeSrc.getStr(), aArgs.m_sOutputFile.getStr()));
+            new Export(aArgs.m_sMergeSrc, aArgs.m_sOutputFile, aArgs.m_sLanguage));
     } else {
-        global::exporter.reset(new Export(aArgs.m_sOutputFile.getStr()));
+        global::exporter.reset(new Export(aArgs.m_sOutputFile, aArgs.m_sLanguage));
     }
 
     global::exporter->Init();
@@ -159,7 +157,25 @@ sal_Bool ResData::SetId( const rtl::OString& rId, sal_uInt16 nLevel )
 // class Export
 //
 
-Export::Export(const rtl::OString &rOutput)
+namespace
+{
+
+static sal_Int32 lcl_countOccurrences(const OString& text, char c)
+{
+    sal_Int32 n = 0;
+    for (sal_Int32 i = 0;; ++i) {
+        i = text.indexOf(c, i);
+        if (i == -1) {
+            break;
+        }
+        ++n;
+    }
+    return n;
+}
+
+}
+
+Export::Export(const OString &rOutput, const OString &rLanguage)
                 :
                 pWordTransformer( NULL ),
                 bDefine( sal_False ),
@@ -173,11 +189,12 @@ Export::Export(const rtl::OString &rOutput)
                 bError( sal_False ),
                 bReadOver( sal_False ),
                 bDontWriteOutput( sal_False ),
-                sFilename( global::inputPathname )
+                isInitialized( false ),
+                sFilename( global::inputPathname ),
+                sLanguages( rLanguage ),
+                pParseQueue( new ParserQueue( *this ) )
 {
-    pParseQueue = new ParserQueue( *this );
-
-    if( !isInitialized ) InitLanguages();
+    InitLanguages();
     // used when export is enabled
 
     // open output stream
@@ -188,7 +205,9 @@ Export::Export(const rtl::OString &rOutput)
     }
 }
 
-Export::Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput)
+Export::Export(
+    const OString &rMergeSource, const OString &rOutput,
+    const OString &rLanguage )
                 :
                 pWordTransformer( NULL ),
                 bDefine( sal_False ),
@@ -203,10 +222,12 @@ Export::Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput)
                 bError( sal_False ),
                 bReadOver( sal_False ),
                 bDontWriteOutput( sal_False ),
-                sFilename( global::inputPathname )
+                isInitialized( false ),
+                sFilename( global::inputPathname ),
+                sLanguages( rLanguage ),
+                pParseQueue( new ParserQueue( *this ) )
 {
-    pParseQueue = new ParserQueue( *this );
-    if( !isInitialized ) InitLanguages( bMergeMode );
+    InitLanguages( bMergeMode );
     // used when merge is enabled
 
     // open output stream
@@ -544,8 +565,8 @@ int Export::Execute( int nToken, const char * pToken )
                 nListLevel = 0;
             }
             if (sToken.indexOf( '{' ) != -1
-                && (helper::countOccurrences(sToken, '{')
-                    > helper::countOccurrences(sToken, '}')))
+                && (lcl_countOccurrences(sToken, '{')
+                    > lcl_countOccurrences(sToken, '}')))
             {
                 Parse( LEVELUP, "" );
             }
@@ -642,7 +663,7 @@ int Export::Execute( int nToken, const char * pToken )
                 SetChildWithText();
                 sal_Int32 n = 0;
                 rtl::OString sEntry(sToken.getToken(1, '"', n));
-                if ( helper::countOccurrences(sToken, '"') > 2 )
+                if ( lcl_countOccurrences(sToken, '"') > 2 )
                     sEntry += "\"";
                 if ( sEntry == "\\\"" )
                     sEntry = "\"";
@@ -686,7 +707,7 @@ int Export::Execute( int nToken, const char * pToken )
                         sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UINAME")))
                     {
                         SetChildWithText();
-                        if ( Export::isSourceLanguage( sLangIndex ) )
+                        if ( sLangIndex.equalsIgnoreAsciiCase("en-US") )
                             pResData->SetId( sText, ID_LEVEL_TEXT );
 
                         pResData->bText = sal_True;
@@ -935,16 +956,16 @@ sal_Bool Export::WriteData( ResData *pResData, sal_Bool bCreateNew )
         if (sXText.isEmpty())
             sXText = "-";
 
-        writePoEntry(
+        common::writePoEntry(
             "Transex3", *aOutput.mPo, global::inputPathname,
             pResData->sResTyp, sGID, sLID, sXHText, sXText);
         if( !sXQHText.isEmpty() )
-            writePoEntry(
+            common::writePoEntry(
                 "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp,
                 sGID, sLID, OString(), sXQHText, PoEntry::TQUICKHELPTEXT );
 
         if( !sXTitle.isEmpty() )
-            writePoEntry(
+            common::writePoEntry(
                 "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp,
                 sGID, sLID, OString(), sXTitle, PoEntry::TTITLE );
 
@@ -1051,7 +1072,7 @@ sal_Bool Export::WriteExportList(ResData *pResData, ExportList *pExportList,
                     if( sText == "\\\"" )
                         sText = "\"";
                 }
-                writePoEntry(
+                common::writePoEntry(
                     "Transex3", *aOutput.mPo, global::inputPathname,
                     rTyp, sGID, sLID, OString(), sText);
             }
@@ -1150,7 +1171,7 @@ void Export::InsertListEntry(const rtl::OString &rText, const rtl::OString &rLin
     }else
         (*pCurEntry)[ m_sListLang ] = rText;
 
-    if ( Export::isSourceLanguage( m_sListLang ) ) {
+    if ( m_sListLang.equalsIgnoreAsciiCase("en-US") ) {
         (*pCurEntry)[ SOURCE_LANGUAGE ] = rLine;
 
         pList->NewSourceLanguageListEntry();
@@ -1204,7 +1225,7 @@ rtl::OString Export::GetText(const rtl::OString &rSource, int nToken)
                 replaceAll("\\0x7F", "-=<[0x7F]>=-");
 
             sal_uInt16 nState = TXT_STATE_TEXT;
-            for (sal_Int32 i = 1; i <= helper::countOccurrences(sTmp, '"'); ++i)
+            for (sal_Int32 i = 1; i <= lcl_countOccurrences(sTmp, '"'); ++i)
             {
                 rtl::OString sToken(sTmp.getToken(i, '"'));
                 if (!sToken.isEmpty()) {
@@ -1501,7 +1522,10 @@ sal_Bool Export::PrepareTextToMerge(rtl::OString &rText, sal_uInt16 nTyp,
 
         // Init Languages
         if( Export::sLanguages.equalsIgnoreAsciiCase("ALL") )
-            SetLanguages( pMergeDataFile->GetLanguages() );
+        {
+            aLanguages = pMergeDataFile->GetLanguages();
+            isInitialized = true;
+        }
         else if( !isInitialized )InitLanguages();
 
     }
@@ -1518,13 +1542,13 @@ sal_Bool Export::PrepareTextToMerge(rtl::OString &rText, sal_uInt16 nTyp,
 
     rtl::OString sContent;
     pEntrys->GetTransex3Text(sContent, nTyp, rLangIndex);
-    if (sContent.isEmpty() && (!Export::isSourceLanguage(rLangIndex)))
+    if (sContent.isEmpty() && !rLangIndex.equalsIgnoreAsciiCase("en-US"))
     {
         rText = sOrigText;
         return sal_False; // no data found
     }
 
-    if (Export::isSourceLanguage(rLangIndex))
+    if (rLangIndex.equalsIgnoreAsciiCase("en-US"))
         return sal_False;
 
     rtl::OString sPostFix( rText.copy( ++nEnd ));
@@ -1565,7 +1589,7 @@ void Export::ResData2Output( PFormEntrys *pEntry, sal_uInt16 nType, const rtl::O
 
             sOutput += rTextType;
 
-            if ( ! Export::isSourceLanguage( sCur ) ) {
+            if ( !sCur.equalsIgnoreAsciiCase("en-US") ) {
                 sOutput += "[ ";
                 sOutput += sCur;
                 sOutput += " ] ";
@@ -1602,7 +1626,10 @@ void Export::MergeRest( ResData *pResData, sal_uInt16 nMode )
 
         // Init Languages
         if (Export::sLanguages.equalsIgnoreAsciiCase("ALL"))
-            SetLanguages( pMergeDataFile->GetLanguages() );
+        {
+            aLanguages = pMergeDataFile->GetLanguages();
+            isInitialized = true;
+        }
         else if( !isInitialized )InitLanguages();
 
     }
@@ -1898,6 +1925,29 @@ void Export::SetChildWithText()
     }
 }
 
+void Export::InitLanguages( bool bMerge ){
+
+    if( !isInitialized )
+    {
+        rtl::OString sTmp;
+        OStringBoolHashMap aEnvLangs;
+
+        sal_Int32 nIndex = 0;
+        do
+        {
+            rtl::OString aToken = sLanguages.getToken(0, ',', nIndex);
+            sTmp = aToken.getToken(0, '=').trim();
+            if( bMerge && sTmp.equalsIgnoreAsciiCase("en-US") ){}
+            else if( !( (sTmp[0]=='x' || sTmp[0]=='X') && sTmp[1]=='-' ) ){
+                aLanguages.push_back( sTmp );
+            }
+        }
+        while ( nIndex >= 0 );
+
+        isInitialized = true;
+    }
+}
+
 void ParserQueue::Push( const QueueEntry& aEntry )
 {
     sal_Int32 nLen = aEntry.sLine.getLength();
diff --git a/l10ntools/source/export2.cxx b/l10ntools/source/export2.cxx
deleted file mode 100644
index 9e69db2..0000000
--- a/l10ntools/source/export2.cxx
+++ /dev/null
@@ -1,364 +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/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "sal/config.h"
-
-#include "export.hxx"
-#include <stdio.h>
-#include <osl/time.h>
-#include <osl/process.h>
-#include <rtl/strbuf.hxx>
-#include <rtl/ustring.hxx>
-#include <sal/macros.h>
-#include <iostream>
-#include <iomanip>
-#include <time.h>
-#include <stdlib.h>
-
-//flags for handleArguments()
-#define STATE_NON       0x0001
-#define STATE_INPUT     0x0002
-#define STATE_OUTPUT    0x0003
-#define STATE_MERGESRC  0x0006
-#define STATE_LANGUAGES 0x0007
-
-//
-// class ResData();
-//
-
-/*****************************************************************************/
-ResData::~ResData()
-/*****************************************************************************/
-{
-    if ( pStringList ) {
-        // delete existing res. of type StringList
-        for ( size_t i = 0; i < pStringList->size(); i++ ) {
-            ExportListEntry* test = (*pStringList)[ i ];
-            if( test != NULL ) delete test;
-        }
-        delete pStringList;
-    }
-    if ( pFilterList ) {
-        // delete existing res. of type FilterList
-        for ( size_t i = 0; i < pFilterList->size(); i++ ) {
-            ExportListEntry* test = (*pFilterList)[ i ];
-            delete test;
-        }
-        delete pFilterList;
-    }
-    if ( pItemList ) {
-        // delete existing res. of type ItemList
-        for ( size_t i = 0; i < pItemList->size(); i++ ) {
-            ExportListEntry* test = (*pItemList)[ i ];
-            delete test;
-        }
-        delete pItemList;
-    }
-    if ( pUIEntries ) {
-        // delete existing res. of type UIEntries
-        for ( size_t i = 0; i < pUIEntries->size(); i++ ) {
-            ExportListEntry* test = (*pUIEntries)[ i ];
-            delete test;
-        }
-        delete pUIEntries;
-    }
-}
-
-//
-// class Export
-//
-
-/*****************************************************************************/
-rtl::OString Export::sLanguages;
-/*****************************************************************************/
-
-bool Export::handleArguments(
-    int argc, char * argv[], HandledArgs& o_aHandledArgs)
-{
-    o_aHandledArgs = HandledArgs();
-    sal_uInt16 nState = STATE_NON;
-
-    for( int i = 1; i < argc; i++ )
-    {
-        if ( OString( argv[ i ] ).toAsciiUpperCase() == "-I" )
-        {
-            nState = STATE_INPUT; // next token specifies source file
-        }
-        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-O" )
-        {
-            nState = STATE_OUTPUT; // next token specifies the dest file
-        }
-        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-M" )
-        {
-            nState = STATE_MERGESRC; // next token specifies the merge database
-        }
-        else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-L" )
-        {
-            nState = STATE_LANGUAGES;
-        }
-        else
-        {
-            switch ( nState )
-            {
-                case STATE_NON:
-                {
-                    return false;    // no valid command line
-                }
-                case STATE_INPUT:
-                {
-                    o_aHandledArgs.m_sInputFile = OString( argv[i] );
-                }
-                break;
-                case STATE_OUTPUT:
-                {
-                    o_aHandledArgs.m_sOutputFile = OString( argv[i] );
-                }
-                break;
-                case STATE_MERGESRC:
-                {
-                    o_aHandledArgs.m_sMergeSrc = OString( argv[i] );
-                    o_aHandledArgs.m_bMergeMode = true;
-                }
-                break;
-                case STATE_LANGUAGES:
-                {
-                    o_aHandledArgs.m_sLanguage = OString( argv[i] );
-                }
-                break;
-            }
-        }
-    }
-    if( !o_aHandledArgs.m_sInputFile.isEmpty() &&
-        !o_aHandledArgs.m_sOutputFile.isEmpty() )
-    {
-        return true;
-    }
-    else
-    {
-        o_aHandledArgs = HandledArgs();
-        return false;
-    }
-}
-
-void Export::writeUsage(const OString& rName, const OString& rFileType)
-{
-    std::cout
-        << " Syntax: " << rName.getStr()
-        << " -i FileIn -o FileOut [-m DataBase] [-l Lang]\n"
-        << " FileIn:   Source files (" << rFileType.getStr() << ")\n"
-        << " FileOut:  Destination file (*.*)\n"
-        << " DataBase: Mergedata (*.po)\n"
-        << " Lang: Restrict the handled languag; one element of\n"
-        << " (de, en-US, ...) or all\n";
-}
-
-void Export::writePoEntry(
-    const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile,
-    const OString& rResType, const OString& rGroupId, const OString& rLocalId,
-    const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType )
-{
-    try
-    {
-        PoEntry aPO(rSourceFile, rResType, rGroupId, rLocalId, rHelpText, rText, eType);
-        rPoStream.writeEntry( aPO );
-    }
-    catch( PoEntry::Exception& aException )
-    {
-        if(aException == PoEntry::NOSOURCFILE)
-        {
-            std::cerr << rExecutable << " warning: no sourcefile specified for po entry\n";
-        }
-        else
-        {
-            std::cerr << rExecutable << " warning: inavlid po attributes extracted from " <<  rSourceFile << "\n";
-            if(aException == PoEntry::NOGROUPID)
-            {
-                std::cerr << "No groupID specified!\n";
-                std::cerr << "String: " << rText << "\n";
-            }
-            else if (aException == PoEntry::NOSTRING)
-            {
-                std::cerr << "No string specified!\n";
-                std::cerr << "GroupID: " << rGroupId << "\n";
-                if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n";
-            }
-            else
-            {
-                if (aException == PoEntry::NORESTYPE)
-                {
-                    std::cerr << "No resource type specified!\n";
-                }
-                else if (aException == PoEntry::WRONGHELPTEXT)
-                {
-                    std::cerr << "x-comment length is 5 characters:" << rHelpText << "\n";
-                }
-
-                std::cerr << "GroupID: " << rGroupId << "\n";
-                if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n";
-                std::cerr << "String: " << rText << "\n";
-            }
-        }
-    }
-}
-
-
-/*****************************************************************************/
-void Export::SetLanguages( std::vector<rtl::OString> val ){
-/*****************************************************************************/
-    aLanguages = val;
-    isInitialized = true;
-}
-/*****************************************************************************/
-std::vector<rtl::OString> Export::GetLanguages(){
-/*****************************************************************************/
-    return aLanguages;
-}
-std::vector<rtl::OString> Export::aLanguages       = std::vector<rtl::OString>();
-std::vector<rtl::OString> Export::aForcedLanguages = std::vector<rtl::OString>();
-
-/*****************************************************************************/
-rtl::OString Export::QuoteHTML( rtl::OString const &rString )
-/*****************************************************************************/
-{
-    rtl::OStringBuffer sReturn;
-    for ( sal_Int32 i = 0; i < rString.getLength(); i++ ) {
-        rtl::OString sTemp = rString.copy( i );
-        if ( sTemp.match( "<Arg n=" ) ) {
-            while ( i < rString.getLength() && rString[i] != '>' ) {
-                 sReturn.append(rString[i]);
-                i++;
-            }
-            if ( rString[i] == '>' ) {
-                sReturn.append('>');
-                i++;
-            }
-        }
-        if ( i < rString.getLength()) {
-            switch ( rString[i]) {
-                case '<':
-                    sReturn.append("<");
-                break;
-
-                case '>':
-                    sReturn.append(">");
-                break;
-
-                case '\"':
-                    sReturn.append(""");
-                break;
-
-                case '\'':
-                    sReturn.append("'");
-                break;
-
-                case '&':
-                    if ((( i + 4 ) < rString.getLength()) &&
-                        ( rString.copy( i, 5 ) == "&" ))
-                            sReturn.append(rString[i]);
-                    else
-                        sReturn.append("&");
-                break;
-
-                default:
-                    sReturn.append(rString[i]);
-                break;
-            }
-        }
-    }
-    return sReturn.makeStringAndClear();
-}
-
-void Export::RemoveUTF8ByteOrderMarker( rtl::OString &rString )
-{
-    if( hasUTF8ByteOrderMarker( rString ) )
-        rString = rString.copy(3);
-}
-
-bool Export::hasUTF8ByteOrderMarker( const rtl::OString &rString )
-{
-    return rString.getLength() >= 3 && rString[0] == '\xEF' &&
-           rString[1] == '\xBB' && rString[2] == '\xBF' ;
-}
-
-/*****************************************************************************/
-rtl::OString Export::UnquoteHTML( rtl::OString const &rString )
-/*****************************************************************************/
-{
-    rtl::OStringBuffer sReturn;
-    for (sal_Int32 i = 0; i != rString.getLength();) {
-        if (rString.match("&", i)) {
-            sReturn.append('&');
-            i += RTL_CONSTASCII_LENGTH("&");
-        } else if (rString.match("<", i)) {
-            sReturn.append('<');
-            i += RTL_CONSTASCII_LENGTH("<");
-        } else if (rString.match(">", i)) {
-            sReturn.append('>');
-            i += RTL_CONSTASCII_LENGTH(">");
-        } else if (rString.match(""", i)) {
-            sReturn.append('"');
-            i += RTL_CONSTASCII_LENGTH(""");
-        } else if (rString.match("'", i)) {
-            sReturn.append('\'');
-            i += RTL_CONSTASCII_LENGTH("'");
-        } else {
-            sReturn.append(rString[i]);
-            ++i;
-        }
-    }
-    return sReturn.makeStringAndClear();
-}
-
-bool Export::isSourceLanguage(const rtl::OString &rLanguage)
-{
-    return !isAllowed(rLanguage);
-}
-
-bool Export::isAllowed(const rtl::OString &rLanguage)
-{
-    return !rLanguage.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("en-US"));
-}
-
-bool Export::isInitialized = false;
-
-/*****************************************************************************/
-void Export::InitLanguages( bool bMergeMode ){
-/*****************************************************************************/
-    if( !isInitialized )
-    {
-        rtl::OString sTmp;
-        OStringBoolHashMap aEnvLangs;
-
-        sal_Int32 nIndex = 0;
-        do
-        {
-            rtl::OString aToken = sLanguages.getToken(0, ',', nIndex);
-            sTmp = aToken.getToken(0, '=').trim();
-            if( bMergeMode && !isAllowed( sTmp ) ){}
-            else if( !( (sTmp[0]=='x' || sTmp[0]=='X') && sTmp[1]=='-' ) ){
-                aLanguages.push_back( sTmp );
-            }
-        }
-        while ( nIndex >= 0 );
-
-        isInitialized = true;
-    }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/source/helper.cxx b/l10ntools/source/helper.cxx
new file mode 100644
index 0000000..cbcf6d1
--- /dev/null
+++ b/l10ntools/source/helper.cxx
@@ -0,0 +1,88 @@
+/* -*- 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/.
+ */
+
+#include "helper.hxx"
+
+namespace helper {
+
+rtl::OString QuotHTML(const rtl::OString &rString)
+{
+    rtl::OStringBuffer sReturn;
+    for (sal_Int32 i = 0; i < rString.getLength(); ++i) {
+        switch (rString[i]) {
+        case '\\':
+            if (i < rString.getLength()) {
+                switch (rString[i + 1]) {
+                case '"':
+                case '<':
+                case '>':
+                case '\\':
+                    ++i;
+                    break;
+                }
+            }
+            // fall through
+        default:
+            sReturn.append(rString[i]);
+            break;
+
+        case '<':
+            sReturn.append("<");
+            break;
+
+        case '>':
+            sReturn.append(">");
+            break;
+
+        case '"':
+            sReturn.append(""");
+            break;
+
+        case '&':
+            if (rString.match("&", i))
+                sReturn.append('&');
+            else
+                sReturn.append("&");
+            break;
+        }
+    }
+    return sReturn.makeStringAndClear();
+}
+
+bool isWellFormedXML( OString const & text )
+{
+    xmlDocPtr doc;
+    OString content;
+    bool result = true;
+
+    content = "<root>";
+    content += text;
+    content += "</root>";
+    doc = xmlParseMemory(content.getStr(),(int)content.getLength());
+    if (doc == NULL) {
+        result = false;
+    }
+    xmlFreeDoc(doc);
+    xmlCleanupParser();
+    return result;
+}
+
+//Convert xmlChar* to OString
+OString xmlStrToOString( const xmlChar* pString )
+{
+    xmlChar* pTemp = xmlStrdup( pString );
+    OString sResult =
+        static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp ));
+    xmlFree( pTemp );
+    return sResult;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/source/helper.hxx b/l10ntools/source/helper.hxx
deleted file mode 100644
index 1d268dd..0000000
--- a/l10ntools/source/helper.hxx
+++ /dev/null
@@ -1,181 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * Version: MPL 1.1 / GPLv3+ / LGPLv3+
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License or as specified alternatively below. You may obtain a copy of
- * the License at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * Major Contributor(s):
- * [ Copyright (C) 2012 Red Hat, Inc., Stephan Bergmann <sbergman at redhat.com>
- *   (initial developer) ]
- *
- * All Rights Reserved.
- *
- * For minor contributions see the git repository.
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
- * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
- * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
- * instead of those above.
- */
-
-#ifndef INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX
-#define INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX
-
-#include "sal/config.h"
-
-#include <algorithm>
-#include <cassert>
-
-#include <libxml/parser.h>
-
-#include "rtl/string.hxx"
-#include "rtl/ustring.hxx"
-#include "rtl/strbuf.hxx"
-#include "sal/types.h"
-
-namespace helper {
-
-// cf. comphelper::string::isdigitAsciiString:
-inline bool isAllAsciiDigits(rtl::OString const & text) {
-    for (sal_Int32 i = 0; i != text.getLength(); ++i) {
-        if (text[i] < '0' || text[i] > '9') {
-            return false;
-        }
-    }
-    return true;
-}
-
-// cf. comphelper::string::isupperAsciiString:
-inline bool isAllAsciiUpperCase(rtl::OString const & text) {
-    for (sal_Int32 i = 0; i != text.getLength(); ++i) {
-        if (text[i] < 'A' || text[i] > 'Z') {
-            return false;
-        }
-    }
-    return true;
-}
-
-// cf. comphelper::string::islowerAsciiString:
-inline bool isAllAsciiLowerCase(rtl::OString const & text) {
-    for (sal_Int32 i = 0; i != text.getLength(); ++i) {
-        if (text[i] < 'a' || text[i] > 'z') {
-            return false;
-        }
-    }
-    return true;
-}
-
-inline sal_Int32 countOccurrences(rtl::OString const & text, char c) {
-    sal_Int32 n = 0;
-    for (sal_Int32 i = 0;; ++i) {
-        i = text.indexOf(c, i);
-        if (i == -1) {
-            break;
-        }
-        ++n;
-    }
-    return n;
-}
-
-inline sal_Int32 indexOfAnyAsciiL(
-    rtl::OUString const & text, char const * chars, sal_Int32 charsLen,
-    sal_Int32 index = 0)
-{
-    for (; index != text.getLength(); ++index) {
-        sal_Unicode c = text[index];
-        if (c <= 0x7F
-            && (rtl_str_indexOfChar_WithLength(
-                    chars, charsLen, static_cast< char >(c))
-                != -1))
-        {
-            return index;
-        }
-    }
-    return -1;
-}
-
-rtl::OString QuotHTML(const rtl::OString &rString)
-{
-    rtl::OStringBuffer sReturn;
-    for (sal_Int32 i = 0; i < rString.getLength(); ++i) {
-        switch (rString[i]) {
-        case '\\':
-            if (i < rString.getLength()) {
-                switch (rString[i + 1]) {
-                case '"':
-                case '<':
-                case '>':
-                case '\\':
-                    ++i;
-                    break;
-                }
-            }
-            // fall through
-        default:
-            sReturn.append(rString[i]);
-            break;
-
-        case '<':
-            sReturn.append("<");
-            break;
-
-        case '>':
-            sReturn.append(">");
-            break;
-
-        case '"':
-            sReturn.append(""");
-            break;
-
-        case '&':
-            if (rString.matchL(RTL_CONSTASCII_STRINGPARAM("&"), i))
-                sReturn.append('&');
-            else
-                sReturn.append(RTL_CONSTASCII_STRINGPARAM("&"));
-            break;
-        }
-    }
-    return sReturn.makeStringAndClear();
-}
-
-inline bool isWellFormedXML( OString const & text )
-{
-    xmlDocPtr doc;
-    OString content;
-    bool result = true;
-
-    content = "<root>";
-    content += text;
-    content += "</root>";
-    doc = xmlParseMemory(content.getStr(),(int)content.getLength());
-    if (doc == NULL) {
-        result = false;
-    }
-    xmlFreeDoc(doc);
-    xmlCleanupParser();
-    return result;
-}
-
-
-template< typename T > inline T abbreviate(
-    T const & text, sal_Int32 start, sal_Int32 length)
-{
-    start = std::max(sal_Int32(0), start);
-    assert(start <= text.getLength());
-    return text.copy(start, std::min(text.getLength() - start, length));
-}
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/l10ntools/source/helpex.cxx b/l10ntools/source/helpex.cxx
index 5d46262..35aec5e 100644
--- a/l10ntools/source/helpex.cxx
+++ b/l10ntools/source/helpex.cxx
@@ -30,6 +30,7 @@
 #include "sal/main.h"
 
 #include "helpmerge.hxx"
+#include "common.hxx"
 
 #ifndef TESTDRIVER
 
@@ -60,8 +61,8 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) {
         }
     }
 
-    HandledArgs aArgs;
-    if ( !Export::handleArguments( argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( !common::handleArguments( argc, argv, aArgs) )
     {
         WriteUsage();
         return 1;
diff --git a/l10ntools/source/helpmerge.cxx b/l10ntools/source/helpmerge.cxx
index ddcece2..60ae8ed 100644
--- a/l10ntools/source/helpmerge.cxx
+++ b/l10ntools/source/helpmerge.cxx
@@ -40,6 +40,7 @@
 #include <direct.h>
 #endif
 
+#include "export.hxx"
 #include "common.hxx"
 #include "helper.hxx"
 #include "po.hxx"
@@ -135,7 +136,7 @@ bool HelpParser::CreatePO(
                         replaceAll("\n",OString()).
                         replaceAll("\t",OString()).trim());
 
-                Export::writePoEntry(
+                common::writePoEntry(
                     "Helpex", aPoOutput, sHelpFile, rGsi1,
                     posm->first, pXMLElement->GetOldref(), OString(), data);
 
diff --git a/l10ntools/source/lngex.cxx b/l10ntools/source/lngex.cxx
index 0677e8a..957ebd4 100644
--- a/l10ntools/source/lngex.cxx
+++ b/l10ntools/source/lngex.cxx
@@ -27,10 +27,10 @@
 
 SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) {
 
-    HandledArgs aArgs;
-    if ( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("ulfex","*.ulf");
+        common::writeUsage("ulfex","*.ulf");
         return 1;
     }
 
diff --git a/l10ntools/source/lngmerge.cxx b/l10ntools/source/lngmerge.cxx
index 8586a8a..052f970 100644
--- a/l10ntools/source/lngmerge.cxx
+++ b/l10ntools/source/lngmerge.cxx
@@ -24,7 +24,7 @@
 #include <iterator>
 #include <string>
 
-#include "common.hxx"
+#include "po.hxx"
 #include "lngmerge.hxx"
 
 namespace {
@@ -33,6 +33,15 @@ rtl::OString getBracketedContent(rtl::OString text) {
     return text.getToken(1, '[').getToken(0, ']');
 }
 
+static void lcl_RemoveUTF8ByteOrderMarker( OString &rString )
+{
+    if( rString.getLength() >= 3 && rString[0] == '\xEF' &&
+        rString[1] == '\xBB' && rString[2] == '\xBF' )
+    {
+        rString = rString.copy(3);
+    }
+}
+
 }
 
 //
@@ -59,7 +68,7 @@ LngParser::LngParser(const rtl::OString &rLngFile,
             if( bFirstLine )
             {
                 // Always remove UTF8 BOM from the first line
-                Export::RemoveUTF8ByteOrderMarker( sLine );
+                lcl_RemoveUTF8ByteOrderMarker( sLine );
                 bFirstLine = false;
             }
 
@@ -129,7 +138,7 @@ void LngParser::WritePO(PoOfstream &aPOStream,
            if ( sAct.isEmpty() && !sCur.isEmpty() )
                sAct = rText_inout[ rtl::OString("en-US") ];
 
-           Export::writePoEntry(
+           common::writePoEntry(
                 "Ulfex", aPOStream, rActFileName, "LngText",
                 rID, OString(), OString(), sAct);
        }
diff --git a/l10ntools/source/merge.cxx b/l10ntools/source/merge.cxx
index 34f590c..46c7828 100644
--- a/l10ntools/source/merge.cxx
+++ b/l10ntools/source/merge.cxx
@@ -60,6 +60,108 @@ namespace
 }
 
 //
+//  class ResData
+//
+
+ResData::ResData(const rtl::OString &rPF, const rtl::OString &rGId)
+    :
+    nWidth( 0 ),
+    nChildIndex( 0 ),
+    nIdLevel( ID_LEVEL_NULL ),
+    bChild( sal_False ),
+    bChildWithText( sal_False ),
+    bText( sal_False ),
+    bHelpText( sal_False ),
+    bQuickHelpText( sal_False ),
+    bTitle( sal_False ),
+    bList( sal_False ),
+    bRestMerged( sal_False ),
+    sGId( rGId ),
+    nTextRefId( REFID_NONE ),
+    nHelpTextRefId( REFID_NONE ),
+    nQuickHelpTextRefId( REFID_NONE ),
+    nTitleRefId( REFID_NONE ),
+    sTextTyp( "Text" ),
+    pStringList( NULL ),
+    pUIEntries( NULL ),
+    pItemList( NULL ),
+    pFilterList( NULL ),
+    pPairedList( NULL ),
+    sPForm( rPF )
+{
+    sGId = sGId.replaceAll("\r", rtl::OString());
+    sPForm = sPForm.replaceAll("\r", rtl::OString());
+}
+
+ResData::ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename)
+    :
+    nWidth( 0 ),
+    nChildIndex( 0 ),
+    nIdLevel( ID_LEVEL_NULL ),
+    bChild( sal_False ),
+    bChildWithText( sal_False ),
+    bText( sal_False ),
+    bHelpText( sal_False ),
+    bQuickHelpText( sal_False ),
+    bTitle( sal_False ),
+    bList( sal_False ),
+    bRestMerged( sal_False ),
+    sGId( rGId ),
+    sFilename( rFilename ),
+    nTextRefId( REFID_NONE ),
+    nHelpTextRefId( REFID_NONE ),
+    nQuickHelpTextRefId( REFID_NONE ),
+    nTitleRefId( REFID_NONE ),
+    sTextTyp( "Text" ),
+    pStringList( NULL ),
+    pUIEntries( NULL ),
+    pItemList( NULL ),
+    pFilterList( NULL ),
+    pPairedList( NULL ),
+    sPForm( rPF )
+{
+    sGId = sGId.replaceAll("\r", rtl::OString());
+    sPForm = sPForm.replaceAll("\r", rtl::OString());
+}
+
+
+ResData::~ResData()
+{
+    if ( pStringList ) {
+        // delete existing res. of type StringList
+        for ( size_t i = 0; i < pStringList->size(); i++ ) {
+            ExportListEntry* test = (*pStringList)[ i ];
+            if( test != NULL ) delete test;
+        }
+        delete pStringList;
+    }
+    if ( pFilterList ) {
+        // delete existing res. of type FilterList
+        for ( size_t i = 0; i < pFilterList->size(); i++ ) {
+            ExportListEntry* test = (*pFilterList)[ i ];
+            delete test;
+        }
+        delete pFilterList;
+    }
+    if ( pItemList ) {
+        // delete existing res. of type ItemList
+        for ( size_t i = 0; i < pItemList->size(); i++ ) {
+            ExportListEntry* test = (*pItemList)[ i ];
+            delete test;
+        }
+        delete pItemList;
+    }
+    if ( pUIEntries ) {
+        // delete existing res. of type UIEntries
+        for ( size_t i = 0; i < pUIEntries->size(); i++ ) {
+            ExportListEntry* test = (*pUIEntries)[ i ];
+            delete test;
+        }
+        delete pUIEntries;
+    }
+}
+
+//
 // class PFormEntrys
 //
 
diff --git a/l10ntools/source/propex.cxx b/l10ntools/source/propex.cxx
index 8517bfb..b12f4d3 100644
--- a/l10ntools/source/propex.cxx
+++ b/l10ntools/source/propex.cxx
@@ -9,15 +9,15 @@
 
 #include "sal/main.h"
 
-#include "export.hxx"
+#include "common.hxx"
 #include "propmerge.hxx"
 
 SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
 {
-    HandledArgs aArgs;
-    if( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("propex","*.properties");
+        common::writeUsage("propex","*.properties");
         return 1;
     }
 
diff --git a/l10ntools/source/propmerge.cxx b/l10ntools/source/propmerge.cxx
index 6f87a4e..72affe3 100644
--- a/l10ntools/source/propmerge.cxx
+++ b/l10ntools/source/propmerge.cxx
@@ -144,7 +144,7 @@ void PropParser::Extract( const OString& rPOFile )
             OString sID = sLine.copy( 0, nEqualSign ).trim();
             OString sText = lcl_ConvertToUTF8( sLine.copy( nEqualSign + 1 ).trim() );
 
-            Export::writePoEntry(
+            common::writePoEntry(
                 "Propex", aPOStream, m_sSource, "property",
                 sID, OString(), OString(), sText);
         }
diff --git a/l10ntools/source/stringex.cxx b/l10ntools/source/stringex.cxx
index cf4a227..1b507f8 100644
--- a/l10ntools/source/stringex.cxx
+++ b/l10ntools/source/stringex.cxx
@@ -10,15 +10,15 @@
 #include <iostream>
 #include "sal/main.h"
 
-#include "export.hxx"
+#include "common.hxx"
 #include "stringmerge.hxx"
 
 SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
 {
-    HandledArgs aArgs;
-    if( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("stringex","string.xml");
+        common::writeUsage("stringex","string.xml");
         return 1;
     }
 
diff --git a/l10ntools/source/stringmerge.cxx b/l10ntools/source/stringmerge.cxx
index bc7417d..b81ea71 100644
--- a/l10ntools/source/stringmerge.cxx
+++ b/l10ntools/source/stringmerge.cxx
@@ -18,24 +18,11 @@
 #include <libxml/xmlstring.h>
 
 #include "export.hxx"
+#include "helper.hxx"
 #include "common.hxx"
 #include "po.hxx"
 #include "stringmerge.hxx"
 
-
-namespace
-{
-    //Convert xmlChar* to OString
-    static OString lcl_xmlStrToOString( const xmlChar* pString )
-    {
-        xmlChar* pTemp = xmlStrdup( pString );
-        OString sResult =
-            static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp ));
-        xmlFree( pTemp );
-        return sResult;
-    }
-}
-
 //Parse strings.xml file
 StringParser::StringParser(
     const OString& rInputFile, const OString& rLang )
@@ -84,10 +71,10 @@ void StringParser::Extract( const OString& rPOFile )
             xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("name"));
             xmlChar* pText = xmlNodeGetContent(pCurrent);
 
-            Export::writePoEntry(
+            common::writePoEntry(
                 "Stringex", aPOStream, m_pSource->name, "string",
-                lcl_xmlStrToOString( pID ), OString(), OString(),
-                lcl_xmlStrToOString( pText ));
+                helper::xmlStrToOString( pID ), OString(), OString(),
+                helper::xmlStrToOString( pText ));
 
             xmlFree( pID );
             xmlFree( pText );
@@ -134,7 +121,7 @@ void StringParser::Merge(
         {
             xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("name"));
             ResData  aResData(
-                "", lcl_xmlStrToOString( pID ),
+                "", helper::xmlStrToOString( pID ),
                 static_cast<OString>(m_pSource->name) );
             xmlFree( pID );
             aResData.sResTyp = "string";
diff --git a/l10ntools/source/treemerge.cxx b/l10ntools/source/treemerge.cxx
index d259efc..b340ebe 100644
--- a/l10ntools/source/treemerge.cxx
+++ b/l10ntools/source/treemerge.cxx
@@ -18,22 +18,14 @@
 #include <libxml/xmlstring.h>
 
 #include "export.hxx"
+#include "helper.hxx"
 #include "common.hxx"
+#include "po.hxx"
 #include "treemerge.hxx"
 
 
 namespace
 {
-    //Convert xmlChar* to OString
-    static OString lcl_xmlStrToOString( const xmlChar* pString )
-    {
-        xmlChar* pTemp = xmlStrdup( pString );
-        OString sResult =
-            static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp ));
-        xmlFree( pTemp );
-        return sResult;
-    }
-
     //Extract strings from nodes on all level recursively
     static void lcl_ExtractLevel(
         const xmlDocPtr pSource, const xmlNodePtr pRoot,
@@ -52,9 +44,9 @@ namespace
                 xmlChar* pText =
                     xmlGetProp(pCurrent, (const xmlChar*)("title"));
 
-                Export::writePoEntry(
-                    "Treex", rPOStream, pSource->name, lcl_xmlStrToOString( pNodeName ),
-                    lcl_xmlStrToOString( pID ), OString(), OString(), lcl_xmlStrToOString( pText ));
+                common::writePoEntry(
+                    "Treex", rPOStream, pSource->name, helper::xmlStrToOString( pNodeName ),
+                    helper::xmlStrToOString( pID ), OString(), OString(), helper::xmlStrToOString( pText ));
 
                 xmlFree( pID );
                 xmlFree( pText );
@@ -73,7 +65,7 @@ namespace
         xmlNodePtr pReturn = pCurrent;
         xmlChar* pID = xmlGetProp(pReturn, (const xmlChar*)("id"));
         const OString sID =
-            lcl_xmlStrToOString( pID );
+            helper::xmlStrToOString( pID );
         xmlFree( pID );
 
         const sal_Int32 nFirstSlash = sID.indexOf("/");
@@ -122,7 +114,7 @@ namespace
                     xmlChar* sTitle =
                         xmlNodeListGetString(pXhpFile, pXhpNode->children, 1);
                     OString sNewTitle =
-                        lcl_xmlStrToOString( sTitle ).
+                        helper::xmlStrToOString( sTitle ).
                             replaceAll("$[officename]","%PRODUCTNAME").
                                 replaceAll("$[officeversion]","%PRODUCTVERSION");
                     xmlNodeSetContent(
@@ -165,10 +157,10 @@ namespace
                 {
                     xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("id"));
                     ResData  aResData(
-                        "", lcl_xmlStrToOString( pID ),
+                        "", helper::xmlStrToOString( pID ),
                         static_cast<OString>(io_pSource->name) );
                     xmlFree( pID );
-                    aResData.sResTyp = lcl_xmlStrToOString( pNodeName );
+                    aResData.sResTyp = helper::xmlStrToOString( pNodeName );
                     PFormEntrys* pEntrys =
                         pMergeDataFile->GetPFormEntrys( &aResData );
                     if( pEntrys )
diff --git a/l10ntools/source/treex.cxx b/l10ntools/source/treex.cxx
index 5187480..7c57230 100644
--- a/l10ntools/source/treex.cxx
+++ b/l10ntools/source/treex.cxx
@@ -11,7 +11,7 @@
 #include <cstring>
 #include "sal/main.h"
 
-#include "export.hxx"
+#include "common.hxx"
 #include "treemerge.hxx"
 
 void WriteUsage()
@@ -45,8 +45,8 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
             break;
         }
     }
-    HandledArgs aArgs;
-    if( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if( !common::handleArguments(argc, argv, aArgs) )
     {
         WriteUsage();
         return 1;
diff --git a/l10ntools/source/uimerge.cxx b/l10ntools/source/uimerge.cxx
index 6e0ec03..76fc9ef 100644
--- a/l10ntools/source/uimerge.cxx
+++ b/l10ntools/source/uimerge.cxx
@@ -21,6 +21,7 @@
 #include <stdio.h>
 
 #include "common.hxx"
+#include "helper.hxx"
 #include "export.hxx"
 #include "tokens.h"
 #include "po.hxx"
@@ -31,19 +32,6 @@
 rtl::OString sInputFileName;
 rtl::OString sOutputFile;
 
-namespace
-{
-    //Convert xmlChar* to OString
-    static OString lcl_xmlStrToOString( const xmlChar* pString )
-    {
-        xmlChar* pTemp = xmlStrdup( pString );
-        OString sResult =
-            static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp ));
-        xmlFree( pTemp );
-        return sResult;
-    }
-}
-
 int extractTranslations()
 {
     PoOfstream aPOStream( sOutputFile, PoOfstream::APP);
@@ -73,11 +61,11 @@ int extractTranslations()
                 for(xmlAttrPtr attribute = nodeLevel2->properties; attribute != NULL; attribute = attribute->next)
                 {
                     xmlChar *content = xmlNodeListGetString(res, attribute->children, 1);
-                    vIDs.push_back(lcl_xmlStrToOString(content));
+                    vIDs.push_back(helper::xmlStrToOString(content));
                     xmlFree(content);
                 }
-                OString sText = lcl_xmlStrToOString(xmlNodeGetContent(nodeLevel2));
-                Export::writePoEntry(
+                OString sText = helper::xmlStrToOString(xmlNodeGetContent(nodeLevel2));
+                common::writePoEntry(
                     "Uiex", aPOStream, sInputFileName, vIDs[0],
                     (vIDs.size()>=2) ? vIDs[1] : OString(),
                     (vIDs.size()>=3) ? vIDs[2] : OString(),
@@ -99,50 +87,6 @@ int extractTranslations()
 
 namespace
 {
-    rtl::OString QuotHTML(const rtl::OString &rString)
-    {
-        rtl::OStringBuffer sReturn;
-        for (sal_Int32 i = 0; i < rString.getLength(); ++i) {
-            switch (rString[i]) {
-            case '\\':
-                if (i < rString.getLength()) {
-                    switch (rString[i + 1]) {
-                    case '"':
-                    case '<':
-                    case '>':
-                    case '\\':
-                        ++i;
-                        break;
-                    }
-                }
-                // fall through
-            default:
-                sReturn.append(rString[i]);
-                break;
-
-            case '<':
-                sReturn.append("<");
-                break;
-
-            case '>':
-                sReturn.append(">");
-                break;
-
-            case '"':
-                sReturn.append(""");
-                break;
-
-            case '&':
-                if (rString.matchL(RTL_CONSTASCII_STRINGPARAM("&"), i))
-                    sReturn.append('&');
-                else
-                    sReturn.append(RTL_CONSTASCII_STRINGPARAM("&"));
-                break;
-            }
-        }
-        return sReturn.makeStringAndClear();
-    }
-
     bool lcl_MergeLang(
             const MergeDataHashMap &rMap,
             const rtl::OString &rLanguage,
@@ -172,7 +116,7 @@ namespace
             aDestination << " <e "
                 << "g=\"" << aI->second->sGID.getStr() << "\" "
                 << "i=\"" << aI->second->sLID.getStr() << "\">"
-                << QuotHTML(sOut).getStr() << "</e>\n";
+                << helper::QuotHTML(sOut).getStr() << "</e>\n";
         }
 
         aDestination << "</t>";
@@ -240,10 +184,10 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
 {
     int nRetValue = 0;
 
-    HandledArgs aArgs;
-    if ( !Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( !common::handleArguments(argc, argv, aArgs) )
     {
-        Export::writeUsage("uiex","*.ui");
+        common::writeUsage("uiex","*.ui");
         return 1;
     }
 
diff --git a/l10ntools/source/xmlparse.cxx b/l10ntools/source/xmlparse.cxx
index f91cc1e..8ba715d 100644
--- a/l10ntools/source/xmlparse.cxx
+++ b/l10ntools/source/xmlparse.cxx
@@ -16,7 +16,6 @@
  *   except in compliance with the License. You may obtain a copy of
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
-
 #include "sal/config.h"
 
 #include <iterator> /* std::iterator*/
@@ -24,12 +23,14 @@
 #include <stdio.h>
 #include <sal/alloca.h>
 
+#include "helper.hxx"
 #include "common.hxx"
 #include "xmlparse.hxx"
 #include <fstream>
 #include <iostream>
 #include <osl/mutex.hxx>
 #include <osl/thread.hxx>
+#include <osl/process.h>
 #include <rtl/strbuf.hxx>
 
 using namespace std;
@@ -868,6 +869,32 @@ XMLDefault& XMLDefault::operator=(const XMLDefault& obj){
 #define XML_CHAR_TO_OUSTRING(x) OStringToOUString(OString(x), RTL_TEXTENCODING_UTF8)
 #define XML_CHAR_N_TO_OUSTRING(x,n) OStringToOUString(OString(x,n), RTL_TEXTENCODING_UTF8 )
 
+namespace
+{
+
+static OUString lcl_pathnameToAbsoluteUrl(const OUString& rPathname) {
+    OUString sUrl;
+    if (osl::FileBase::getFileURLFromSystemPath(rPathname, sUrl)
+        != osl::FileBase::E_None)
+    {
+        std::cerr << "Error: Cannot convert input pathname to URL\n";
+        std::exit(EXIT_FAILURE);
+    }
+    OUString sCwd;
+    if (osl_getProcessWorkingDir(&sCwd.pData) != osl_Process_E_None) {
+        std::cerr << "Error: Cannot determine cwd\n";
+        std::exit(EXIT_FAILURE);
+    }
+    if (osl::FileBase::getAbsoluteFileURL(sCwd, sUrl, sUrl)
+        != osl::FileBase::E_None)
+    {
+        std::cerr << "Error: Cannot convert input URL to absolute URL\n";
+        std::exit(EXIT_FAILURE);
+    }
+    return sUrl;
+}
+}
+
 
 /*****************************************************************************/
 SimpleXMLParser::SimpleXMLParser()
@@ -1008,7 +1035,7 @@ XMLFile *SimpleXMLParser::Execute( const rtl::OUString &rFileName, XMLFile* pXML
     aErrorInformation.sMessage = rtl::OUString( "ERROR: Unable to open file ");
     aErrorInformation.sMessage += rFileName;
 
-    rtl::OUString aFileURL(common::pathnameToAbsoluteUrl(rFileName));
+    rtl::OUString aFileURL(lcl_pathnameToAbsoluteUrl(rFileName));
 
     oslFileHandle h;
     if (osl_openFile(aFileURL.pData, &h, osl_File_OpenFlag_Read)
@@ -1145,50 +1172,11 @@ XMLFile *SimpleXMLParser::Execute( const rtl::OUString &rFileName, XMLFile* pXML
     return pXMLFile;
 }
 
-/*****************************************************************************/
-void XMLUtil::QuotHTML( rtl::OUString &rString )
-/*****************************************************************************/
-{
-    OUStringBuffer sReturn;
-    for (sal_Int32 i = 0; i < rString.getLength(); ++i) {
-        switch (rString[i]) {
-        case '\\':
-            if (i < rString.getLength()) {
-                switch (rString[i + 1]) {
-                case '"':
-                case '<':
-                case '>':
-                case '\\':
-                    ++i;
-                    break;
-                }
-            }
-            // fall through
-        default:
-            sReturn.append(rString[i]);
-            break;
-
-        case '<':
-            sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM("<"));
-            break;
 
-        case '>':
-            sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM(">"));
-            break;
-
-        case '"':
-            sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM("""));
-            break;
-
-        case '&':
-            if (rString.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("&"), i))
-                sReturn.append('&');
-            else
-                sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM("&"));
-            break;
-        }
-    }
-    rString = sReturn.makeStringAndClear();
+void XMLUtil::QuotHTML( OUString &rString )
+{
+    const OString sString(OUStringToOString(rString, RTL_TEXTENCODING_UTF8));
+    rString = OStringToOUString(helper::QuotHTML( sString ), RTL_TEXTENCODING_UTF8);
 }
 
 void XMLUtil::UnQuotHTML( rtl::OUString &rString ){
diff --git a/l10ntools/source/xrmmerge.cxx b/l10ntools/source/xrmmerge.cxx
index ed0896e..d531db4 100644
--- a/l10ntools/source/xrmmerge.cxx
+++ b/l10ntools/source/xrmmerge.cxx
@@ -25,6 +25,7 @@
 
 #include "common.hxx"
 #include "export.hxx"
+#include "po.hxx"
 #include "xrmmerge.hxx"
 #include "tokens.h"
 #include "helper.hxx"
@@ -59,8 +60,8 @@ extern char *GetOutputFile( int argc, char* argv[])
     bDisplayName = sal_False;
     bExtensionDescription = sal_False;
 
-    HandledArgs aArgs;
-    if ( Export::handleArguments(argc, argv, aArgs) )
+    common::HandledArgs aArgs;
+    if ( common::handleArguments(argc, argv, aArgs) )
     {
         // command line is valid
         bMergeMode = aArgs.m_bMergeMode;
@@ -75,7 +76,7 @@ extern char *GetOutputFile( int argc, char* argv[])
     else
     {
         // command line is not valid
-        Export::writeUsage("xrmex","*.xrm/*.xml");
+        common::writeUsage("xrmex","*.xrm/*.xml");
         return NULL;
     }
 }
@@ -421,7 +422,7 @@ void XRMResExport::EndOfText(
                 pResData->sText[sCur].replaceAll("\x0A", rtl::OString()));
 
             if( !sAct.isEmpty() )
-                Export::writePoEntry(
+                common::writePoEntry(
                     "Xrmex", pOutputStream, sPath, sResourceType,
                     pResData->sGId, OString(), OString(), sAct );
         }
@@ -565,7 +566,7 @@ void XRMResMerge::WorkOnText(
         PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
             if ( pEntrys ) {
                 rtl::OString sContent;
-                if ( Export::isAllowed( sLang ) &&
+                if ( !sLang.equalsIgnoreAsciiCase("en-US") &&
                     ( pEntrys->GetText(
                         sContent, STRING_TYP_TEXT, sLang )) &&
                     ( sContent != "-" ) && !sContent.isEmpty() &&


More information about the Libreoffice-commits mailing list