LCOV - code coverage report
Current view: top level - libreoffice/l10ntools/source - export.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 1176 0.0 %
Date: 2012-12-17 Functions: 0 36 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "sal/config.h"
      21             : 
      22             : #include <cstddef>
      23             : #include <cstring>
      24             : 
      25             : #include "boost/scoped_ptr.hpp"
      26             : #include <stdio.h>
      27             : #include <stdlib.h>
      28             : #include "common.hxx"
      29             : #include "export.hxx"
      30             : #include "helper.hxx"
      31             : #include "tokens.h"
      32             : #include <iostream>
      33             : #include <rtl/strbuf.hxx>
      34             : 
      35             : void yyerror( const char * );
      36             : void YYWarning( const char * );
      37             : 
      38             : namespace {
      39             : 
      40           0 : rtl::OString sActFileName; //TODO
      41             : MergeDataFile * pMergeDataFile = 0; //TODO
      42             : 
      43             : namespace global {
      44             : 
      45           0 : OString prj;
      46           0 : OString prjRoot;
      47           0 : OString inputPathname;
      48           0 : boost::scoped_ptr< Export > exporter;
      49             : 
      50             : }
      51             : }
      52             : 
      53             : extern "C" {
      54             : 
      55           0 : FILE * init(int argc, char ** argv) {
      56             : 
      57           0 :     HandledArgs aArgs;
      58           0 :     if ( !Export::handleArguments(argc, argv, aArgs) )
      59             :     {
      60           0 :         Export::writeUsage("transex3","src/hrc");
      61           0 :         std::exit(EXIT_FAILURE);
      62             :     }
      63           0 :     Export::InitLanguages();
      64           0 :     global::prj =  aArgs.m_sPrj;
      65           0 :     global::prjRoot =  aArgs.m_sPrjRoot;
      66           0 :     global::inputPathname =  aArgs.m_sInputFile;
      67             : 
      68           0 :     FILE * pFile = std::fopen(global::inputPathname.getStr(), "r");
      69           0 :     if (pFile == 0) {
      70             :         std::fprintf(
      71             :             stderr, "Error: Cannot open file \"%s\"\n",
      72           0 :             global::inputPathname.getStr());
      73           0 :         std::exit(EXIT_FAILURE);
      74             :     }
      75             : 
      76           0 :     if (aArgs.m_bMergeMode) {
      77             :         global::exporter.reset(
      78           0 :             new Export(aArgs.m_sMergeSrc.getStr(), aArgs.m_sOutputFile.getStr()));
      79             :     } else {
      80             :         sActFileName =
      81             :             common::pathnameToken(
      82           0 :                 global::inputPathname.getStr(), global::prjRoot.getStr());
      83           0 :         global::exporter.reset(new Export(aArgs.m_sOutputFile.getStr()));
      84             :     }
      85             : 
      86           0 :     global::exporter->Init();
      87             : 
      88           0 :     return pFile;
      89             : }
      90             : 
      91           0 : int Parse( int nTyp, const char *pTokenText ){
      92           0 :     global::exporter->Execute( nTyp , pTokenText );
      93           0 :     return 1;
      94             : }
      95           0 : void Close(){
      96           0 :     global::exporter->pParseQueue->Close();
      97           0 :     global::exporter.reset();
      98             :         // avoid nontrivial Export dtor being executed during exit
      99           0 : }
     100             : 
     101           0 : int WorkOnTokenSet( int nTyp, char *pTokenText )
     102             : {
     103             : 
     104           0 :     global::exporter->pParseQueue->Push( QueueEntry( nTyp , rtl::OString(pTokenText) ) );
     105           0 :     return 1;
     106             : }
     107             : 
     108             : } // extern
     109             : 
     110             : extern "C" {
     111             : /*****************************************************************************/
     112           0 : int SetError()
     113             : /*****************************************************************************/
     114             : {
     115             :     // set error at global instance of class Export
     116           0 :     global::exporter->SetError();
     117           0 :     return 1;
     118             : }
     119             : }
     120             : 
     121             : extern "C" {
     122             : /*****************************************************************************/
     123           0 : int GetError()
     124             : /*****************************************************************************/
     125             : {
     126             :     // get error at global instance of class Export
     127           0 :     if (global::exporter->GetError())
     128           0 :         return 1;
     129           0 :     return sal_False;
     130             : }
     131             : }
     132             : 
     133             : //
     134             : // class ResData
     135             : //
     136             : 
     137             : /*****************************************************************************/
     138           0 : sal_Bool ResData::SetId( const rtl::OString& rId, sal_uInt16 nLevel )
     139             : /*****************************************************************************/
     140             : {
     141           0 :     if ( nLevel > nIdLevel )
     142             :     {
     143           0 :         nIdLevel = nLevel;
     144           0 :         sId = rId;
     145             : 
     146           0 :         if ( bChild && bChildWithText )
     147             :         {
     148           0 :             rtl::OString sError(RTL_CONSTASCII_STRINGPARAM("ResId after child definition"));
     149           0 :             yyerror(sError.getStr());
     150           0 :             SetError();
     151             :         }
     152             : 
     153           0 :         if ( sId.getLength() > 255 )
     154             :         {
     155           0 :             YYWarning( "LocalId > 255 chars, truncating..." );
     156           0 :             sId = sId.copy(0, 255).trim();
     157             :         }
     158             : 
     159           0 :         return sal_True;
     160             :     }
     161             : 
     162           0 :     return sal_False;
     163             : }
     164             : 
     165             : //
     166             : // class Export
     167             : //
     168             : 
     169           0 : Export::Export(const rtl::OString &rOutput)
     170             :                 :
     171             :                 pWordTransformer( NULL ),
     172             :                 bDefine( sal_False ),
     173             :                 bNextMustBeDefineEOL( sal_False ),
     174             :                 nLevel( 0 ),
     175             :                 nList( LIST_NON ),
     176             :                 nListIndex( 0 ),
     177             :                 nListLevel( 0 ),
     178             :                 bSkipFile( false ),
     179             :                 sProject( global::prj ),
     180             :                 sRoot( global::prjRoot ),
     181             :                 bMergeMode( false ),
     182             :                 bError( sal_False ),
     183             :                 bReadOver( sal_False ),
     184             :                 bDontWriteOutput( sal_False ),
     185           0 :                 sFilename( global::inputPathname )
     186             : {
     187           0 :     pParseQueue = new ParserQueue( *this );
     188             : 
     189           0 :     if( !isInitialized ) InitLanguages();
     190             :     // used when export is enabled
     191             : 
     192             :     // open output stream
     193           0 :     aOutput.open(rOutput.getStr(), std::ios_base::out | std::ios_base::trunc);
     194           0 :     if (!aOutput.is_open()) {
     195           0 :         fprintf(stderr, "ERROR : Can't open file %s\n", rOutput.getStr());
     196           0 :         exit ( -1 );
     197             :     }
     198           0 : }
     199             : 
     200           0 : Export::Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput)
     201             :                 :
     202             :                 pWordTransformer( NULL ),
     203             :                 bDefine( sal_False ),
     204             :                 bNextMustBeDefineEOL( sal_False ),
     205             :                 nLevel( 0 ),
     206             :                 nList( LIST_NON ),
     207             :                 nListIndex( 0 ),
     208             :                 nListLevel( 0 ),
     209             :                 bSkipFile( false ),
     210             :                 sProject( global::prj ),
     211             :                 sRoot( global::prjRoot ),
     212             :                 bMergeMode( sal_True ),
     213             :                 sMergeSrc( rMergeSource ),
     214             :                 bError( sal_False ),
     215             :                 bReadOver( sal_False ),
     216             :                 bDontWriteOutput( sal_False ),
     217           0 :                 sFilename( global::inputPathname )
     218             : {
     219           0 :     pParseQueue = new ParserQueue( *this );
     220           0 :     if( !isInitialized ) InitLanguages( bMergeMode );
     221             :     // used when merge is enabled
     222             : 
     223             :     // open output stream
     224           0 :     aOutput.open(rOutput.getStr(), std::ios_base::out | std::ios_base::trunc);
     225           0 : }
     226             : 
     227             : /*****************************************************************************/
     228           0 : void Export::Init()
     229             : /*****************************************************************************/
     230             : {
     231             :     // resets the internal status, used before parseing another file
     232           0 :     sActPForm = "";
     233           0 :     bDefine = sal_False;
     234           0 :     bNextMustBeDefineEOL = sal_False;
     235           0 :     nLevel = 0;
     236           0 :     nList = LIST_NON;
     237           0 :     m_sListLang = rtl::OString();
     238           0 :     nListIndex = 0;
     239           0 :     for ( size_t i = 0, n = aResStack.size(); i < n;  ++i )
     240           0 :         delete aResStack[ i ];
     241           0 :     aResStack.clear();
     242           0 : }
     243             : 
     244             : /*****************************************************************************/
     245           0 : Export::~Export()
     246             : /*****************************************************************************/
     247             : {
     248           0 :     if( pParseQueue )
     249           0 :         delete pParseQueue;
     250           0 :     aOutput.close();
     251           0 :     for ( size_t i = 0, n = aResStack.size(); i < n;  ++i )
     252           0 :         delete aResStack[ i ];
     253           0 :     aResStack.clear();
     254             : 
     255           0 :     if ( bMergeMode ) {
     256           0 :         if ( !pMergeDataFile )
     257           0 :             pMergeDataFile = new MergeDataFile(sMergeSrc, global::inputPathname, false);
     258             : 
     259           0 :         delete pMergeDataFile;
     260             :     }
     261           0 : }
     262             : 
     263             : /*****************************************************************************/
     264           0 : int Export::Execute( int nToken, const char * pToken )
     265             : /*****************************************************************************/
     266             : {
     267             : 
     268           0 :     rtl::OString sToken( pToken );
     269           0 :     rtl::OString sOrig( sToken );
     270           0 :     sal_Bool bWriteToMerged = bMergeMode;
     271             : 
     272           0 :     if ( nToken == CONDITION )
     273             :     {
     274           0 :         rtl::OString sTestToken(pToken);
     275             :         sTestToken = sTestToken.replaceAll("\t", rtl::OString()).
     276           0 :             replaceAll(" ", rtl::OString());
     277           0 :         if (( !bReadOver ) && ( sTestToken.indexOf("#ifndef__RSC_PARSER") == 0 ))
     278           0 :             bReadOver = sal_True;
     279           0 :         else if (( bReadOver ) && ( sTestToken.indexOf("#endif") == 0 ))
     280           0 :             bReadOver = sal_False;
     281             :     }
     282           0 :     if ((( nToken < FILTER_LEVEL ) || ( bReadOver )) &&
     283           0 :         (!(( bNextMustBeDefineEOL ) && ( sOrig == "\n" )))) {
     284             :         // this tokens are not mandatory for parsing, so ignore them ...
     285           0 :         if ( bMergeMode )
     286           0 :             WriteToMerged( sOrig , false ); // ... ore whrite them directly to dest.
     287           0 :         return 0;
     288             :     }
     289             : 
     290           0 :     ResData *pResData = NULL;
     291           0 :     if ( nLevel ) {
     292             :         // res. exists at cur. level
     293           0 :         pResData = ( (nLevel-1) < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL;
     294             :     }
     295           0 :     else if (( nToken != RESOURCE ) &&
     296             :             ( nToken != RESOURCEEXPR ) &&
     297             :             ( nToken != SMALRESOURCE ) &&
     298             :             ( nToken != LEVELUP ) &&
     299             :             ( nToken != NORMDEFINE ) &&
     300             :             ( nToken != RSCDEFINE ) &&
     301             :             ( nToken != CONDITION ) &&
     302             :             ( nToken != PRAGMA ))
     303             :     {
     304             :         // no res. exists at cur. level so return
     305           0 :         if ( bMergeMode )
     306           0 :             WriteToMerged( sOrig , false );
     307           0 :         return 0;
     308             :     }
     309             :     // #define NO_LOCALIZE_EXPORT
     310           0 :     if( bSkipFile ){
     311           0 :         if ( bMergeMode ) {
     312           0 :             WriteToMerged( sOrig , false );
     313             :         }
     314           0 :         return 1;
     315             :     }
     316             : 
     317             : 
     318           0 :     if ( bDefine ) {
     319           0 :         if (( nToken != EMPTYLINE ) && ( nToken != LEVELDOWN ) && ( nToken != LEVELUP )) {
     320             :             // cur. res. defined in macro
     321           0 :             if ( bNextMustBeDefineEOL ) {
     322           0 :                 if ( nToken != RSCDEFINELEND ) {
     323             :                     // end of macro found, so destroy res.
     324           0 :                     bDefine = sal_False;
     325           0 :                     if ( bMergeMode ) {
     326           0 :                         MergeRest( pResData );
     327             :                     }
     328           0 :                     bNextMustBeDefineEOL = sal_False;
     329           0 :                     Execute( LEVELDOWN, "" );
     330             :                 }
     331             :                 else {
     332             :                     // next line also in macro definition
     333           0 :                     bNextMustBeDefineEOL = sal_False;
     334           0 :                     if ( bMergeMode )
     335           0 :                         WriteToMerged( sOrig , false );
     336           0 :                     return 1;
     337             :                 }
     338             :             }
     339             :         }
     340             :     }
     341             : 
     342           0 :     sal_Bool bExecuteDown = sal_False;
     343           0 :     if ( nToken != LEVELDOWN ) {
     344           0 :         sal_uInt16 nOpen = 0;
     345           0 :         sal_uInt16 nClose = 0;
     346           0 :         sal_Bool bReadOver1 = sal_False;
     347           0 :         sal_uInt16 i = 0;
     348           0 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     349           0 :             if ( sToken[i] == '"' )
     350           0 :                 bReadOver1 = !bReadOver1;
     351           0 :             if ( !bReadOver1 && ( sToken[i] == '{' ))
     352           0 :                 nOpen++;
     353             :         }
     354             : 
     355           0 :         bReadOver1 = sal_False;
     356           0 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     357           0 :             if ( sToken[i] == '"' )
     358           0 :                 bReadOver1 = !bReadOver1;
     359           0 :             if ( !bReadOver1 && ( sToken[i] == '}' ))
     360           0 :                 nClose++;
     361             :         }
     362             : 
     363           0 :         if ( nOpen < nClose )
     364           0 :             bExecuteDown = sal_True;
     365             :     }
     366           0 :     switch ( nToken ) {
     367             : 
     368             :         case NORMDEFINE:
     369           0 :             sToken = sToken.replace('\r', ' ').replace('\t', ' ');
     370           0 :             for (;;) {
     371           0 :                 sal_Int32 n = 0;
     372           0 :                 sToken = sToken.replaceFirst("  ", " ", &n);
     373           0 :                 if (n == -1) {
     374             :                     break;
     375             :                 }
     376             :             }
     377           0 :             if( sToken.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("#define NO_LOCALIZE_EXPORT")) ){
     378           0 :                             bSkipFile = true;
     379           0 :                             return 0;
     380             :                         }
     381           0 :                         if ( bMergeMode )
     382           0 :                           WriteToMerged( sOrig , false );
     383             : 
     384           0 :                         return 0;
     385             : 
     386             : 
     387             :         case RSCDEFINE:
     388           0 :             bDefine = sal_True; // res. defined in macro
     389             : 
     390             :         case RESOURCE:
     391             :         case RESOURCEEXPR: {
     392           0 :             bDontWriteOutput = sal_False;
     393           0 :             if ( nToken != RSCDEFINE )
     394           0 :                 bNextMustBeDefineEOL = sal_False;
     395             :             // this is the beginning of a new res.
     396           0 :             nLevel++;
     397           0 :             if ( nLevel > 1 ) {
     398           0 :                 aResStack[ nLevel - 2 ]->bChild = sal_True;
     399             :             }
     400             : 
     401             :             // create new instance for this res. and fill mandatory fields
     402             : 
     403           0 :             pResData = new ResData( sActPForm, FullId() , sFilename );
     404           0 :             aResStack.push_back( pResData );
     405             :             sToken = sToken.replaceAll("\n", rtl::OString()).
     406             :                 replaceAll("\r", rtl::OString()).
     407           0 :                 replaceAll("{", rtl::OString()).replace('\t', ' ');
     408           0 :             sToken = sToken.trim();
     409           0 :             rtl::OString sTLower = sToken.getToken(0, ' ').toAsciiLowerCase();
     410           0 :             pResData->sResTyp = sTLower;
     411           0 :             rtl::OString sId( sToken.copy( pResData->sResTyp.getLength() + 1 ));
     412           0 :             rtl::OString sCondition;
     413           0 :             if ( sId.indexOf( '#' ) != -1 )
     414             :             {
     415             :                 // between ResTyp, Id and paranthes is a precomp. condition
     416           0 :                 sCondition = "#";
     417           0 :                 sal_Int32 n = 0;
     418           0 :                 sId = sId.getToken(0, '#', n);
     419           0 :                 sCondition += sId.getToken(0, '#', n);
     420             :             }
     421           0 :             sId = sId.getToken(0, '/');
     422           0 :             CleanValue( sId );
     423           0 :             sId = sId.replaceAll("\t", rtl::OString());
     424           0 :             pResData->SetId( sId, ID_LEVEL_IDENTIFIER );
     425           0 :             if (!sCondition.isEmpty())
     426             :             {
     427           0 :                 Execute( CONDITION, "");  // execute the precomp. condition
     428           0 :             }
     429             :         }
     430           0 :         break;
     431             :         case SMALRESOURCE: {
     432           0 :             bDontWriteOutput = sal_False;
     433             :             // this is the beginning of a new res.
     434           0 :             bNextMustBeDefineEOL = sal_False;
     435           0 :             nLevel++;
     436           0 :             if ( nLevel > 1 ) {
     437           0 :                 aResStack[ nLevel - 2 ]->bChild = sal_True;
     438             :             }
     439             : 
     440             :             // create new instance for this res. and fill mandatory fields
     441             : 
     442           0 :             pResData = new ResData( sActPForm, FullId() , sFilename );
     443           0 :             aResStack.push_back( pResData );
     444             :             sToken = sToken.replaceAll("\n", rtl::OString()).
     445             :                 replaceAll("\r", rtl::OString()).
     446             :                 replaceAll("{", rtl::OString()).
     447             :                 replaceAll("\t", rtl::OString()).
     448             :                 replaceAll(" ", rtl::OString()).
     449           0 :                 replaceAll("\\", rtl::OString()).toAsciiLowerCase();
     450           0 :             pResData->sResTyp = sToken;
     451             :         }
     452           0 :         break;
     453             :         case LEVELUP: {
     454             :             // push
     455           0 :             if ( nList )
     456           0 :                 nListLevel++;
     457           0 :             if ( nList )
     458             :                 break;
     459             : 
     460           0 :             bDontWriteOutput = sal_False;
     461           0 :             rtl::OString sLowerTyp;
     462           0 :             if ( pResData )
     463           0 :                 sLowerTyp = "unknown";
     464           0 :             nLevel++;
     465           0 :             if ( nLevel > 1 ) {
     466           0 :                 aResStack[ nLevel - 2 ]->bChild = sal_True;
     467             :             }
     468             : 
     469           0 :             ResData *pNewData = new ResData( sActPForm, FullId() , sFilename );
     470           0 :             pNewData->sResTyp = sLowerTyp;
     471           0 :             aResStack.push_back( pNewData );
     472             :         }
     473           0 :         break;
     474             :         case LEVELDOWN: {
     475             :             // pop
     476           0 :             if ( !nList  ) {
     477           0 :                 bDontWriteOutput = sal_False;
     478           0 :                 if ( nLevel ) {
     479           0 :                     if ( bDefine && (nLevel == 1 )) {
     480           0 :                         bDefine = sal_False;
     481           0 :                         bNextMustBeDefineEOL = sal_False;
     482             :                     }
     483           0 :                     WriteData( pResData );
     484           0 :                     ResStack::iterator it = aResStack.begin();
     485           0 :                     ::std::advance( it, nLevel-1 );
     486           0 :                     delete *it;
     487           0 :                     aResStack.erase( it );
     488           0 :                     nLevel--;
     489             :                 }
     490             :             }
     491             :             else {
     492           0 :                 if ( bDefine )
     493           0 :                     bNextMustBeDefineEOL = sal_True;
     494           0 :                 if ( !nListLevel ) {
     495           0 :                     if ( bMergeMode )
     496           0 :                         MergeRest( pResData, MERGE_MODE_LIST );
     497           0 :                     nList = LIST_NON;
     498             :                 }
     499             :                 else
     500           0 :                     nListLevel--;
     501             :             }
     502             :         }
     503           0 :         break;
     504             :         case ASSIGNMENT:
     505             :         {
     506           0 :             bDontWriteOutput = sal_False;
     507             :             // interpret different types of assignement
     508           0 :             sal_Int32 n = 0;
     509             :             rtl::OString sKey = sToken.getToken(0, '=', n).
     510             :                 replaceAll(" ", rtl::OString()).
     511           0 :                 replaceAll("\t", rtl::OString());
     512           0 :             rtl::OString sValue = sToken.getToken(0, '=', n);
     513           0 :             CleanValue( sValue );
     514           0 :             sKey = sKey.toAsciiUpperCase();
     515           0 :             if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("IDENTIFIER")))
     516             :             {
     517             :                 rtl::OString sId(
     518             :                     sValue.replaceAll("\t", rtl::OString()).
     519           0 :                     replaceAll(" ", rtl::OString()));
     520           0 :                 pResData->SetId(sId, ID_LEVEL_IDENTIFIER);
     521             :             }
     522           0 :             else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("HELPID")))
     523             :             {
     524           0 :                 pResData->sHelpId = sValue;
     525             :             }
     526           0 :             else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("STRINGLIST")))
     527             :             {
     528           0 :                 pResData->bList = sal_True;
     529           0 :                 nList = LIST_STRING;
     530           0 :                 m_sListLang = SOURCE_LANGUAGE;
     531           0 :                 nListIndex = 0;
     532           0 :                 nListLevel = 0;
     533             :             }
     534           0 :             else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("FILTERLIST")))
     535             :             {
     536           0 :                 pResData->bList = sal_True;
     537           0 :                 nList = LIST_FILTER;
     538           0 :                 m_sListLang = SOURCE_LANGUAGE;
     539           0 :                 nListIndex = 0;
     540           0 :                 nListLevel = 0;
     541             :             }
     542           0 :             else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UIENTRIES")))
     543             :             {
     544           0 :                 pResData->bList = sal_True;
     545           0 :                 nList = LIST_UIENTRIES;
     546           0 :                 m_sListLang = SOURCE_LANGUAGE;
     547           0 :                 nListIndex = 0;
     548           0 :                 nListLevel = 0;
     549             :             }
     550           0 :             if (sToken.indexOf( '{' ) != -1
     551           0 :                 && (helper::countOccurrences(sToken, '{')
     552           0 :                     > helper::countOccurrences(sToken, '}')))
     553             :             {
     554           0 :                 Parse( LEVELUP, "" );
     555           0 :             }
     556             :          }
     557           0 :         break;
     558             :         case UIENTRIES:
     559             :         case LISTASSIGNMENT:
     560             :         {
     561           0 :             bDontWriteOutput = sal_False;
     562             :             rtl::OString sTmpToken(
     563           0 :                 sToken.replaceAll(" ", rtl::OString()).toAsciiLowerCase());
     564           0 :             sal_Int32 nPos = sTmpToken.indexOf("[en-us]=");
     565           0 :             if (nPos != -1) {
     566             :                 rtl::OString sKey(
     567             :                     sTmpToken.copy(0 , nPos).replaceAll(" ", rtl::OString()).
     568           0 :                     replaceAll("\t", rtl::OString()));
     569           0 :                 rtl::OString sValue = sToken.getToken(1, '=');
     570           0 :                 CleanValue( sValue );
     571           0 :                 sKey = sKey.toAsciiUpperCase();
     572           0 :                 if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("STRINGLIST")))
     573             :                 {
     574           0 :                     pResData->bList = sal_True;
     575           0 :                     nList = LIST_STRING;
     576           0 :                     m_sListLang = SOURCE_LANGUAGE;
     577           0 :                     nListIndex = 0;
     578           0 :                     nListLevel = 0;
     579             :                 }
     580           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("FILTERLIST")))
     581             :                 {
     582           0 :                     pResData->bList = sal_True;
     583           0 :                     nList = LIST_FILTER;
     584           0 :                     m_sListLang = SOURCE_LANGUAGE;
     585           0 :                     nListIndex = 0;
     586           0 :                     nListLevel = 0;
     587             :                 }
     588             :                 // PairedList
     589           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("PAIREDLIST")))
     590             :                 {
     591           0 :                     pResData->bList = sal_True;
     592           0 :                     nList = LIST_PAIRED;
     593           0 :                     m_sListLang = SOURCE_LANGUAGE;
     594           0 :                     nListIndex = 0;
     595           0 :                     nListLevel = 0;
     596             :                 }
     597           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("ITEMLIST")))
     598             :                 {
     599           0 :                     pResData->bList = sal_True;
     600           0 :                     nList = LIST_ITEM;
     601           0 :                     m_sListLang = SOURCE_LANGUAGE;
     602           0 :                     nListIndex = 0;
     603           0 :                     nListLevel = 0;
     604             :                 }
     605           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UIENTRIES")))
     606             :                 {
     607           0 :                     pResData->bList = sal_True;
     608           0 :                     nList = LIST_UIENTRIES;
     609           0 :                     m_sListLang = SOURCE_LANGUAGE;
     610           0 :                     nListIndex = 0;
     611           0 :                     nListLevel = 0;
     612           0 :                 }
     613             :             }
     614             :             else
     615             :             {
     616             :                 // new res. is a String- or FilterList
     617           0 :                 sal_Int32 n = 0;
     618             :                 rtl::OString sKey(
     619             :                     sToken.getToken(0, '[', n).replaceAll(" ", rtl::OString()).
     620           0 :                     replaceAll("\t", rtl::OString()).toAsciiUpperCase());
     621           0 :                 if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("STRINGLIST")))
     622           0 :                     nList = LIST_STRING;
     623           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("FILTERLIST")))
     624           0 :                     nList = LIST_FILTER;
     625           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("PAIREDLIST")))
     626           0 :                     nList = LIST_PAIRED;                // abcd
     627           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("ITEMLIST")))
     628           0 :                     nList = LIST_ITEM;
     629           0 :                 else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UIENTRIES")))
     630           0 :                     nList = LIST_UIENTRIES;
     631           0 :                 if ( nList ) {
     632           0 :                     rtl::OString sLang = sToken.getToken(0, ']', n);
     633           0 :                     CleanValue( sLang );
     634           0 :                     m_sListLang = sLang;
     635           0 :                     nListIndex = 0;
     636           0 :                     nListLevel = 0;
     637           0 :                 }
     638           0 :             }
     639             :         }
     640           0 :         break;
     641             :         case TEXT:
     642             :         case _LISTTEXT:
     643             :         case LISTTEXT: {
     644             :             // this is an entry for a String- or FilterList
     645           0 :             if ( nList ) {
     646           0 :                 SetChildWithText();
     647           0 :                 sal_Int32 n = 0;
     648           0 :                 rtl::OString sEntry(sToken.getToken(1, '"', n));
     649           0 :                 if ( helper::countOccurrences(sToken, '"') > 2 )
     650           0 :                     sEntry += "\"";
     651           0 :                 if ( sEntry == "\\\"" )
     652           0 :                     sEntry = "\"";
     653           0 :                 InsertListEntry( sEntry, sOrig );
     654           0 :                 if ( bMergeMode && ( sEntry != "\"" ))
     655             :                 {
     656           0 :                     PrepareTextToMerge( sOrig, nList, m_sListLang, pResData );
     657           0 :                 }
     658             :             }
     659             :         }
     660           0 :         break;
     661             :         case LONGTEXTLINE:
     662             :         case TEXTLINE:
     663           0 :             bDontWriteOutput = sal_False;
     664           0 :             if ( nLevel )
     665             :             {
     666           0 :                 CutComment( sToken );
     667             : 
     668             :                 // this is a text line!!!
     669           0 :                 rtl::OString t(sToken.getToken(0, '='));
     670             :                 rtl::OString sKey(
     671             :                     t.getToken(0, '[').replaceAll(" ", rtl::OString()).
     672           0 :                     replaceAll("\t", rtl::OString()));
     673           0 :                 rtl::OString sText( GetText( sToken, nToken ));
     674           0 :                 rtl::OString sLang;
     675           0 :                 if ( sToken.getToken(0, '=').indexOf('[') != -1 )
     676             :                 {
     677             :                     sLang = sToken.getToken(0, '=').getToken(1, '[').
     678           0 :                         getToken(0, ']');
     679           0 :                     CleanValue( sLang );
     680             :                 }
     681           0 :                 rtl::OString sLangIndex = sLang;
     682           0 :                 rtl::OString sOrigKey = sKey;
     683           0 :                 if ( !sText.isEmpty() && !sLang.isEmpty() )
     684             :                 {
     685           0 :                     sKey = sKey.toAsciiUpperCase();
     686           0 :                     if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("TEXT")) ||
     687           0 :                         sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("MESSAGE"))  ||
     688           0 :                         sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("CUSTOMUNITTEXT"))  ||
     689           0 :                         sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("SLOTNAME"))  ||
     690           0 :                         sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UINAME")))
     691             :                     {
     692           0 :                         SetChildWithText();
     693           0 :                         if ( Export::isSourceLanguage( sLangIndex ) )
     694           0 :                             pResData->SetId( sText, ID_LEVEL_TEXT );
     695             : 
     696           0 :                         pResData->bText = sal_True;
     697           0 :                         pResData->sTextTyp = sOrigKey;
     698           0 :                         if ( bMergeMode ) {
     699           0 :                             PrepareTextToMerge( sOrig, STRING_TYP_TEXT, sLangIndex, pResData );
     700             :                         }
     701             :                         else
     702             :                         {
     703           0 :                             if (!pResData->sText[ sLangIndex ].isEmpty())
     704             :                             {
     705           0 :                                 rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language "));
     706           0 :                                 sError.append(sLangIndex);
     707           0 :                                 sError.append(RTL_CONSTASCII_STRINGPARAM("defined twice"));
     708           0 :                                 yyerror(sError.getStr());
     709             :                             }
     710           0 :                             pResData->sText[ sLangIndex ] = sText;
     711             :                         }
     712             :                     }
     713           0 :                     else if ( sKey == "HELPTEXT" ) {
     714           0 :                         SetChildWithText();
     715           0 :                         pResData->bHelpText = sal_True;
     716           0 :                         if ( bMergeMode )
     717           0 :                             PrepareTextToMerge( sOrig, STRING_TYP_HELPTEXT, sLangIndex, pResData );
     718             :                         else
     719             :                         {
     720           0 :                             if (!pResData->sHelpText[ sLangIndex ].isEmpty())
     721             :                             {
     722           0 :                                 rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language "));
     723           0 :                                 sError.append(sLangIndex);
     724           0 :                                 sError.append(" defined twice");
     725           0 :                                 YYWarning(sError.getStr());
     726             :                             }
     727           0 :                             pResData->sHelpText[ sLangIndex ] = sText;
     728             :                         }
     729             :                     }
     730           0 :                     else if ( sKey == "QUICKHELPTEXT" ) {
     731           0 :                         SetChildWithText();
     732           0 :                         pResData->bQuickHelpText = sal_True;
     733           0 :                         if ( bMergeMode )
     734           0 :                             PrepareTextToMerge( sOrig, STRING_TYP_QUICKHELPTEXT, sLangIndex, pResData );
     735             :                         else
     736             :                         {
     737           0 :                             if (!pResData->sQuickHelpText[ sLangIndex ].isEmpty())
     738             :                             {
     739           0 :                                 rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language "));
     740           0 :                                 sError.append(sLangIndex);
     741           0 :                                 sError.append(RTL_CONSTASCII_STRINGPARAM(" defined twice"));
     742           0 :                                 YYWarning(sError.getStr());
     743             :                             }
     744           0 :                             pResData->sQuickHelpText[ sLangIndex ] = sText;
     745             :                         }
     746             :                     }
     747           0 :                     else if ( sKey == "TITLE" ) {
     748           0 :                         SetChildWithText();
     749           0 :                         pResData->bTitle = sal_True;
     750           0 :                         if ( bMergeMode )
     751           0 :                             PrepareTextToMerge( sOrig, STRING_TYP_TITLE, sLangIndex, pResData );
     752             :                         else
     753             :                         {
     754           0 :                             if ( !pResData->sTitle[ sLangIndex ].isEmpty())
     755             :                             {
     756           0 :                                 rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language "));
     757           0 :                                 sError.append(sLangIndex);
     758           0 :                                 sError.append(RTL_CONSTASCII_STRINGPARAM(" defined twice"));
     759           0 :                                 YYWarning(sError.getStr());
     760             :                             }
     761           0 :                             pResData->sTitle[ sLangIndex ] = sText;
     762             :                         }
     763             :                     }
     764           0 :                     else if ( sKey == "ACCESSPATH" ) {
     765           0 :                         pResData->SetId( sText, ID_LEVEL_ACCESSPATH );
     766             :                     }
     767           0 :                     else if ( sKey == "FIELDNAME" ) {
     768           0 :                         pResData->SetId( sText, ID_LEVEL_FIELDNAME );
     769             :                     }
     770           0 :                 }
     771             :             }
     772           0 :         break;
     773             :         case NEWTEXTINRES: {
     774           0 :             bDontWriteOutput = sal_True;
     775             :         }
     776           0 :         break;
     777             :         case APPFONTMAPPING:
     778             :         {
     779           0 :             bDontWriteOutput = sal_False;
     780             :             // this is a AppfontMapping, so look if its a definition
     781             :             // of field size
     782           0 :             sal_Int32 n = 0;
     783             :             rtl::OString sKey(
     784             :                 sToken.getToken(0, '=', n).replaceAll(" ", rtl::OString()).
     785           0 :                 replaceAll("\t", rtl::OString()));
     786           0 :             rtl::OString sMapping = sToken.getToken(0, '=', n);
     787           0 :             sMapping = sMapping.getToken(1, '(');
     788             :             sMapping = sMapping.getToken(0, ')').
     789             :                 replaceAll(rtl::OString(' '), rtl::OString()).
     790             :                 replaceAll(rtl::OString('\t'), rtl::OString()).
     791           0 :                 toAsciiUpperCase();
     792           0 :             if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("SIZE"))) {
     793           0 :                 pResData->nWidth = sMapping.getToken(0, ',').toInt32();
     794           0 :             } else if (sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("POSSIZE"))) {
     795           0 :                 pResData->nWidth = sMapping.getToken(2, ',').toInt32();
     796           0 :             }
     797             :         }
     798           0 :         break;
     799             :         case RSCDEFINELEND:
     800           0 :             bDontWriteOutput = sal_False;
     801           0 :         break;
     802             :         case CONDITION: {
     803           0 :             bDontWriteOutput = sal_False;
     804           0 :             sToken = sToken.replace('\r', ' ').replace('\t', ' ');
     805           0 :             for (;;) {
     806           0 :                 sal_Int32 n = 0;
     807           0 :                 sToken = sToken.replaceFirst("  ", " ", &n);
     808           0 :                 if (n == -1) {
     809             :                     break;
     810             :                 }
     811             :             }
     812           0 :             sal_Int32 n = 0;
     813           0 :             rtl::OString sCondition(sToken.getToken(0, ' ', n));
     814           0 :             if ( sCondition == "#ifndef" ) {
     815           0 :                 sActPForm = "!defined ";
     816           0 :                 sActPForm += sToken.getToken(0, ' ', n);
     817             :             }
     818           0 :             else if ( sCondition == "#ifdef" ) {
     819           0 :                 sActPForm = "defined ";
     820           0 :                 sActPForm += sToken.getToken(0, ' ', n);
     821             :             }
     822           0 :             else if ( sCondition == "#if" ) {
     823           0 :                 sActPForm = sToken.copy( 4 ).replaceAll("||", "\\or");
     824             :             }
     825           0 :             else if ( sCondition == "#elif" ) {
     826           0 :                 sActPForm = sToken.copy( 6 ).replaceAll("||", "\\or");
     827             :             }
     828           0 :             else if ( sCondition == "#else" ) {
     829           0 :                 sActPForm = sCondition;
     830             :             }
     831           0 :             else if ( sCondition == "#endif" ) {
     832           0 :                 sActPForm = "";
     833             :             }
     834             :             else break;
     835           0 :             if ( nLevel ) {
     836           0 :                 WriteData( pResData, sal_True );
     837           0 :                 pResData->sPForm = sActPForm;
     838           0 :             }
     839             :         }
     840           0 :         break;
     841             :         case EMPTYLINE : {
     842           0 :             bDontWriteOutput = sal_False;
     843           0 :             if ( bDefine ) {
     844           0 :                 bNextMustBeDefineEOL = sal_False;
     845           0 :                 bDefine = sal_False;
     846           0 :                 while ( nLevel )
     847           0 :                     Parse( LEVELDOWN, "" );
     848             :             }
     849             :         }
     850           0 :         break;
     851             :         case PRAGMA : {
     852           0 :             bDontWriteOutput = sal_False;
     853           0 :             fprintf(stderr, "ERROR: archaic PRAGMA %s\n", sToken.getStr());
     854           0 :             exit(-1);
     855             :         }
     856             :         break;
     857             :         case TEXTREFID : {
     858           0 :             bDontWriteOutput = sal_True;
     859             :         }
     860             :         }
     861           0 :     if ( bWriteToMerged ) {
     862             :         // the current token must be written to dest. without merging
     863             : 
     864           0 :         if( bDefine && sOrig.getLength() > 2 ){
     865           0 :             for( sal_uInt16 n = 0 ; n < sOrig.getLength() ; n++ ){
     866           0 :                 if( sOrig[n] == '\n' && sOrig[n-1] != '\\'){
     867           0 :                     sOrig = sOrig.replaceAt(n++, 0, "\\");
     868             :                 }
     869             :             }
     870             :         }
     871           0 :         WriteToMerged( sOrig , false);
     872             :     }
     873             : 
     874           0 :     if ( bExecuteDown ) {
     875           0 :         Parse( LEVELDOWN, "" );
     876             :     }
     877             : 
     878           0 :     return 1;
     879             : }
     880             : 
     881             : /*****************************************************************************/
     882           0 : void Export::CutComment( rtl::OString &rText )
     883             : /*****************************************************************************/
     884             : {
     885           0 :     if (rText.indexOf("//") != -1) {
     886           0 :         rtl::OString sWork(rText.replaceAll("\\\"", "XX"));
     887           0 :         bool bInner = false;
     888           0 :         for (sal_Int32 i = 0; i < sWork.getLength() - 1; ++i) {
     889           0 :             if (sWork[i] == '"') {
     890           0 :                 bInner = !bInner;
     891           0 :             } else if (sWork[i] == '/' && !bInner && sWork[i + 1] == '/' ) {
     892           0 :                 rText = rText.copy(0, i);
     893           0 :                 break;
     894             :             }
     895           0 :         }
     896             :     }
     897           0 : }
     898             : 
     899             : /*****************************************************************************/
     900           0 : sal_Bool Export::WriteData( ResData *pResData, sal_Bool bCreateNew )
     901             : /*****************************************************************************/
     902             : {
     903           0 :     if ( bMergeMode ) {
     904           0 :         MergeRest( pResData );
     905           0 :         return sal_True;
     906             :     }
     907             : 
     908             :        // mandatory to export: en-US
     909             : 
     910           0 :      if (( !pResData->sText[ SOURCE_LANGUAGE ].isEmpty())
     911             :         ||
     912           0 :         (  !pResData->sHelpText[ SOURCE_LANGUAGE ].isEmpty())
     913             :         ||
     914           0 :         (  !pResData->sQuickHelpText[ SOURCE_LANGUAGE ].isEmpty())
     915             :          ||
     916           0 :         (  !pResData->sTitle[ SOURCE_LANGUAGE ].isEmpty()))
     917             : 
     918             :        {
     919           0 :         rtl::OString sGID = pResData->sGId;
     920           0 :         rtl::OString sLID;
     921           0 :         if (sGID.isEmpty())
     922           0 :             sGID = pResData->sId;
     923             :         else
     924           0 :             sLID = pResData->sId;
     925             : 
     926           0 :         rtl::OString sXText;
     927           0 :         rtl::OString sXHText;
     928           0 :         rtl::OString sXQHText;
     929           0 :         rtl::OString sXTitle;
     930             : 
     931           0 :         sXText = pResData->sText[ SOURCE_LANGUAGE ];
     932           0 :         if (!pResData->sText[ X_COMMENT ].isEmpty())
     933           0 :             sXHText = pResData->sText[ X_COMMENT ];
     934             :         else
     935           0 :             sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ];
     936           0 :         sXQHText = pResData->sQuickHelpText[ SOURCE_LANGUAGE ];
     937           0 :         sXTitle = pResData->sTitle[ SOURCE_LANGUAGE ];
     938             : 
     939           0 :         if (sXText.isEmpty())
     940           0 :             sXText = "-";
     941             : 
     942           0 :         rtl::OString sOutput( sProject ); sOutput += "\t";
     943           0 :         if ( !sRoot.isEmpty())
     944           0 :             sOutput += sActFileName;
     945           0 :         sOutput += "\t0\t";
     946           0 :         sOutput += pResData->sResTyp; sOutput += "\t";
     947           0 :         sOutput += sGID; sOutput += "\t";
     948           0 :         sOutput += sLID; sOutput += "\t";
     949           0 :         sOutput += pResData->sHelpId; sOutput   += "\t";
     950           0 :         sOutput += pResData->sPForm; sOutput    += "\t";
     951           0 :         sOutput += rtl::OString::valueOf(pResData->nWidth); sOutput += "\t";
     952           0 :         sOutput += "en-US"; sOutput += "\t";
     953             : 
     954             : 
     955           0 :         sOutput += sXText; sOutput  += "\t";
     956           0 :         sOutput += sXHText; sOutput += "\t";
     957           0 :         sOutput += sXQHText; sOutput+= "\t";
     958           0 :         sOutput += sXTitle; sOutput += "\t";
     959             : 
     960           0 :         aOutput << sOutput.getStr() << '\n';
     961             : 
     962           0 :         if ( bCreateNew ) {
     963           0 :             pResData->sText[ SOURCE_LANGUAGE ]         = "";
     964           0 :             pResData->sHelpText[ SOURCE_LANGUAGE ]     = "";
     965           0 :             pResData->sQuickHelpText[ SOURCE_LANGUAGE ]= "";
     966           0 :             pResData->sTitle[ SOURCE_LANGUAGE ]        = "";
     967           0 :         }
     968             :     }
     969           0 :     if ( pResData->pStringList ) {
     970           0 :         rtl::OString sList( "stringlist" );
     971           0 :         WriteExportList( pResData, pResData->pStringList, sList, bCreateNew );
     972           0 :         if ( bCreateNew )
     973           0 :             pResData->pStringList = 0;
     974             :     }
     975           0 :     if ( pResData->pFilterList ) {
     976           0 :         rtl::OString sList( "filterlist" );
     977           0 :         WriteExportList( pResData, pResData->pFilterList, sList, bCreateNew );
     978           0 :         if ( bCreateNew )
     979           0 :             pResData->pFilterList = 0;
     980             :     }
     981           0 :     if ( pResData->pItemList ) {
     982           0 :         rtl::OString sList( "itemlist" );
     983           0 :         WriteExportList( pResData, pResData->pItemList, sList, bCreateNew );
     984           0 :         if ( bCreateNew )
     985           0 :             pResData->pItemList = 0;
     986             :     }
     987           0 :     if ( pResData->pPairedList ) {
     988           0 :         rtl::OString sList( "pairedlist" );
     989           0 :         WriteExportList( pResData, pResData->pPairedList, sList, bCreateNew );
     990           0 :         if ( bCreateNew )
     991           0 :             pResData->pItemList = 0;
     992             :     }
     993           0 :     if ( pResData->pUIEntries ) {
     994           0 :         rtl::OString sList( "uientries" );
     995           0 :         WriteExportList( pResData, pResData->pUIEntries, sList, bCreateNew );
     996           0 :         if ( bCreateNew )
     997           0 :             pResData->pUIEntries = 0;
     998             :     }
     999           0 :     return sal_True;
    1000             : }
    1001             : 
    1002           0 : rtl::OString Export::GetPairedListID(const rtl::OString& rText)
    1003             : {
    1004             : // < "STRING" ; IDENTIFIER ; > ;
    1005           0 :     return rText.getToken(1, ';').toAsciiUpperCase().replace('\t', ' ').trim();
    1006             : }
    1007             : 
    1008           0 : rtl::OString Export::GetPairedListString(const rtl::OString& rText)
    1009             : {
    1010             : // < "STRING" ; IDENTIFIER ; > ;
    1011           0 :     rtl::OString sString(rText.getToken(0, ';').replace('\t', ' '));
    1012           0 :     sString = sString.trim();
    1013           0 :     rtl::OString s1(sString.copy(sString.indexOf('"') + 1));
    1014           0 :     sString = s1.copy(0, s1.lastIndexOf('"'));
    1015           0 :     return sString.trim();
    1016             : }
    1017             : 
    1018           0 : rtl::OString Export::StripList(const rtl::OString & rText)
    1019             : {
    1020           0 :     rtl::OString s1 = rText.copy( rText.indexOf('\"') + 1);
    1021           0 :     return s1.copy( 0 , s1.lastIndexOf('\"'));
    1022             : }
    1023             : 
    1024           0 : sal_Bool Export::WriteExportList(ResData *pResData, ExportList *pExportList,
    1025             :     const rtl::OString &rTyp, sal_Bool bCreateNew)
    1026             : {
    1027           0 :     rtl::OString sGID(pResData->sGId);
    1028           0 :     if (sGID.isEmpty())
    1029           0 :         sGID = pResData->sId;
    1030             :     else {
    1031           0 :         sGID += ".";
    1032           0 :         sGID += pResData->sId;
    1033           0 :         while (sGID.getLength() != 0 && sGID[sGID.getLength() - 1] == '.') {
    1034           0 :             sGID = sGID.copy(0, sGID.getLength() - 1);
    1035             :         }
    1036             :     }
    1037             : 
    1038           0 :     rtl::OString sCur;
    1039           0 :     for ( size_t i = 0; pExportList != NULL && i < pExportList->size(); i++ )
    1040             :     {
    1041           0 :         ExportListEntry *pEntry = (*pExportList)[  i ];
    1042             : 
    1043           0 :         rtl::OString sLID(rtl::OString::valueOf(static_cast<sal_Int64>(i + 1)));
    1044           0 :         for (unsigned int n = 0; n < aLanguages.size(); ++n)
    1045             :         {
    1046           0 :             sCur = aLanguages[ n ];
    1047           0 :             if (!(*pEntry)[ SOURCE_LANGUAGE ].isEmpty())
    1048             :             {
    1049           0 :                 rtl::OString sText((*pEntry)[ SOURCE_LANGUAGE ] );
    1050             : 
    1051             :                 // Strip PairList Line String
    1052           0 :                 if (rTyp.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("pairedlist")))
    1053             :                 {
    1054           0 :                     sLID = GetPairedListID( sText );
    1055           0 :                     if (!(*pEntry)[ sCur ].isEmpty())
    1056           0 :                         sText = (*pEntry)[ sCur ];
    1057           0 :                     sText = GetPairedListString( sText );
    1058             :                 }
    1059             :                 else
    1060             :                 {
    1061           0 :                     sText = StripList( (*pEntry)[ sCur ] );
    1062           0 :                     if( sText == "\\\"" )
    1063           0 :                         sText = "\"";
    1064             :                 }
    1065             : 
    1066           0 :                 rtl::OStringBuffer sOutput(sProject);
    1067           0 :                 sOutput.append('\t');
    1068           0 :                 if ( !sRoot.isEmpty())
    1069           0 :                     sOutput.append(sActFileName);
    1070           0 :                 sOutput.append("\t0\t");
    1071           0 :                 sOutput.append(rTyp).append('\t');
    1072           0 :                 sOutput.append(sGID).append('\t');
    1073           0 :                 sOutput.append(sLID).append("\t\t");
    1074           0 :                 sOutput.append(pResData->sPForm).append("\t0\t");
    1075           0 :                 sOutput.append(sCur).append('\t');
    1076             : 
    1077           0 :                 sOutput.append(sText).append("\t\t\t\t");
    1078             : 
    1079           0 :                 aOutput << sOutput.makeStringAndClear().getStr() << '\n';
    1080             :             }
    1081             :         }
    1082           0 :         if ( bCreateNew )
    1083           0 :             delete [] pEntry;
    1084           0 :     }
    1085           0 :     if ( bCreateNew )
    1086           0 :         delete pExportList;
    1087             : 
    1088           0 :     return sal_True;
    1089             : }
    1090             : 
    1091           0 : rtl::OString Export::FullId()
    1092             : {
    1093           0 :     rtl::OStringBuffer sFull;
    1094           0 :     if ( nLevel > 1 )
    1095             :     {
    1096           0 :         sFull.append(aResStack[ 0 ]->sId);
    1097           0 :         for ( size_t i = 1; i < nLevel - 1; ++i )
    1098             :         {
    1099           0 :             rtl::OString sToAdd = aResStack[ i ]->sId;
    1100           0 :             if (!sToAdd.isEmpty())
    1101           0 :                 sFull.append('.').append(sToAdd);
    1102           0 :         }
    1103             :     }
    1104           0 :     if (sFull.getLength() > 255)
    1105             :     {
    1106           0 :         rtl::OString sError(RTL_CONSTASCII_STRINGPARAM("GroupId > 255 chars"));
    1107           0 :         printf("GroupID = %s\n", sFull.getStr());
    1108           0 :         yyerror(sError.getStr());
    1109             :     }
    1110             : 
    1111           0 :     return sFull.makeStringAndClear();
    1112             : }
    1113             : 
    1114           0 : void Export::InsertListEntry(const rtl::OString &rText, const rtl::OString &rLine)
    1115             : {
    1116           0 :     ResData *pResData = ( nLevel-1 < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL;
    1117             : 
    1118           0 :     ExportList *pList = NULL;
    1119           0 :     if ( nList == LIST_STRING ) {
    1120           0 :         pList = pResData->pStringList;
    1121           0 :         if ( !pList ) {
    1122           0 :             pResData->pStringList = new ExportList();
    1123           0 :             pList = pResData->pStringList;
    1124           0 :             nListIndex = 0;
    1125             :         }
    1126             :     }
    1127           0 :     else if ( nList == LIST_FILTER ) {
    1128           0 :         pList = pResData->pFilterList;
    1129           0 :         if ( !pList ) {
    1130           0 :             pResData->pFilterList = new ExportList();
    1131           0 :             pList = pResData->pFilterList;
    1132           0 :             nListIndex = 0;
    1133             :         }
    1134             :     }
    1135           0 :     else if ( nList == LIST_ITEM ) {
    1136           0 :         pList = pResData->pItemList;
    1137           0 :         if ( !pList ) {
    1138           0 :             pResData->pItemList = new ExportList();
    1139           0 :             pList = pResData->pItemList;
    1140           0 :             nListIndex = 0;
    1141             :         }
    1142             :     }
    1143           0 :     else if ( nList == LIST_PAIRED ) {
    1144           0 :         pList = pResData->pPairedList;
    1145           0 :         if ( !pList ) {
    1146           0 :             pResData->pPairedList = new ExportList();
    1147           0 :             pList = pResData->pPairedList;
    1148           0 :             nListIndex = 0;
    1149             :         }
    1150             :     }
    1151           0 :     else if ( nList == LIST_UIENTRIES ) {
    1152           0 :         pList = pResData->pUIEntries;
    1153           0 :         if ( !pList ) {
    1154           0 :             pResData->pUIEntries = new ExportList();
    1155           0 :             pList = pResData->pUIEntries;
    1156           0 :             nListIndex = 0;
    1157             :         }
    1158             :     }
    1159             :     else
    1160           0 :         return;
    1161             : 
    1162           0 :     if ( nListIndex + 1 > pList->size())
    1163             :     {
    1164           0 :         ExportListEntry *pNew = new ExportListEntry();
    1165           0 :         (*pNew)[LIST_REFID] = rtl::OString::valueOf(static_cast<sal_Int32>(REFID_NONE));
    1166           0 :         pList->push_back(pNew);
    1167             :     }
    1168           0 :     ExportListEntry *pCurEntry = (*pList)[ nListIndex ];
    1169             : 
    1170             :     // For paired list use the line to set proper lid
    1171           0 :     if( nList == LIST_PAIRED ){
    1172           0 :         (*pCurEntry)[ m_sListLang ] = rLine;
    1173             :     }else
    1174           0 :         (*pCurEntry)[ m_sListLang ] = rText;
    1175             : 
    1176           0 :     if ( Export::isSourceLanguage( m_sListLang ) ) {
    1177           0 :         (*pCurEntry)[ SOURCE_LANGUAGE ] = rLine;
    1178             : 
    1179           0 :         pList->NewSourceLanguageListEntry();
    1180             :     }
    1181             : 
    1182           0 :     nListIndex++;
    1183             : }
    1184             : 
    1185             : /*****************************************************************************/
    1186           0 : void Export::CleanValue( rtl::OString &rValue )
    1187             : /*****************************************************************************/
    1188             : {
    1189           0 :     while ( !rValue.isEmpty()) {
    1190           0 :         if (( rValue[0] == ' ' ) || ( rValue[0] == '\t' ))
    1191           0 :             rValue = rValue.copy( 1 );
    1192             :         else
    1193           0 :             break;
    1194             :     }
    1195             : 
    1196           0 :     if ( !rValue.isEmpty()) {
    1197           0 :         for ( sal_Int32 i = rValue.getLength() - 1; i > 0; i-- ) {
    1198           0 :             if (( rValue[i] == ' ' ) || ( rValue[i] == '\t' ) ||
    1199           0 :                 ( rValue[i] == '\n' ) || ( rValue[i] == ';' ) ||
    1200           0 :                 ( rValue[i] == '{' ) || ( rValue[i] == '\\' ) ||
    1201           0 :                 ( rValue[i] == '\r' ))
    1202           0 :                 rValue = rValue.copy(0, i);
    1203             :             else
    1204           0 :                 break;
    1205             :         }
    1206             :     }
    1207           0 : }
    1208             : 
    1209             : #define TXT_STATE_NON   0x000
    1210             : #define TXT_STATE_TEXT  0x001
    1211             : #define TXT_STATE_MACRO 0x002
    1212             : 
    1213           0 : rtl::OString Export::GetText(const rtl::OString &rSource, int nToken)
    1214             : {
    1215           0 :     rtl::OString sReturn;
    1216           0 :     switch ( nToken )
    1217             :     {
    1218             :         case TEXTLINE:
    1219             :         case LONGTEXTLINE:
    1220             :         {
    1221           0 :             rtl::OString sTmp(rSource.copy(rSource.indexOf('=')));
    1222           0 :             CleanValue( sTmp );
    1223             :             sTmp = sTmp.replaceAll("\n", rtl::OString()).
    1224             :                 replaceAll("\r", rtl::OString()).
    1225             :                 replaceAll("\\\\\"", "-=<[BSlashBSlashHKom]>=-\"").
    1226             :                 replaceAll("\\\"", "-=<[Hochkomma]>=-").
    1227             :                 replaceAll("\\", "-=<[0x7F]>=-").
    1228           0 :                 replaceAll("\\0x7F", "-=<[0x7F]>=-");
    1229             : 
    1230           0 :             sal_uInt16 nState = TXT_STATE_TEXT;
    1231           0 :             for (sal_Int32 i = 1; i <= helper::countOccurrences(sTmp, '"'); ++i)
    1232             :             {
    1233           0 :                 rtl::OString sToken(sTmp.getToken(i, '"'));
    1234           0 :                 if (!sToken.isEmpty()) {
    1235           0 :                     if ( nState == TXT_STATE_TEXT ) {
    1236           0 :                         sReturn += sToken;
    1237           0 :                         nState = TXT_STATE_MACRO;
    1238             :                     }
    1239             :                     else {
    1240           0 :                         sToken = sToken.replace('\t', ' ');
    1241           0 :                         for (;;) {
    1242           0 :                             sal_Int32 n = 0;
    1243           0 :                             sToken = sToken.replaceFirst("  ", " ", &n);
    1244           0 :                             if (n == -1) {
    1245             :                                 break;
    1246             :                             }
    1247             :                         }
    1248           0 :                         sToken = sToken.trim();
    1249           0 :                         if (!sToken.isEmpty()) {
    1250           0 :                             sReturn += "\\\" ";
    1251           0 :                             sReturn += sToken;
    1252           0 :                             sReturn += " \\\"";
    1253             :                         }
    1254           0 :                         nState = TXT_STATE_TEXT;
    1255             :                     }
    1256             :                 }
    1257           0 :             }
    1258             : 
    1259             :             sReturn = sReturn.replaceAll("-=<[0x7F]>=-", "").
    1260             :                 replaceAll("-=<[Hochkomma]>=-", "\"").
    1261             :                 replaceAll("-=<[BSlashBSlashHKom]>=-", "\\\\").
    1262             :                 replaceAll("\\\\", "-=<[BSlashBSlash]>=-").
    1263           0 :                 replaceAll("-=<[BSlashBSlash]>=-", "\\");
    1264             :         }
    1265           0 :         break;
    1266             :     }
    1267           0 :     return sReturn;
    1268             : }
    1269             : 
    1270           0 : void Export::WriteToMerged(const rtl::OString &rText , bool bSDFContent)
    1271             : {
    1272           0 :     rtl::OString sText(rText);
    1273           0 :     for (;;) {
    1274           0 :         sal_Int32 n = 0;
    1275           0 :         sText = sText.replaceFirst(" \n", "\n", &n);
    1276           0 :         if (n == -1) {
    1277             :             break;
    1278             :         }
    1279             :     }
    1280           0 :     if (pParseQueue->bNextIsM && bSDFContent && sText.getLength() > 2) {
    1281           0 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
    1282           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
    1283           0 :                 sText = sText.replaceAt(n++, 0, "\\");
    1284             :             }
    1285             :         }
    1286           0 :     } else if (pParseQueue->bLastWasM && sText.getLength() > 2) {
    1287           0 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
    1288           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
    1289           0 :                 sText = sText.replaceAt(n++, 0, "\\");
    1290             :             }
    1291           0 :             if (sText[n] == '\n') {
    1292           0 :                 pParseQueue->bMflag = true;
    1293             :             }
    1294             :         }
    1295           0 :     } else if (pParseQueue->bCurrentIsM && bSDFContent && sText.getLength() > 2)
    1296             :     {
    1297           0 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
    1298           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
    1299           0 :                 sText = sText.replaceAt(n++, 0, "\\");
    1300           0 :                 pParseQueue->bMflag = true;
    1301             :             }
    1302             :         }
    1303           0 :     } else if (pParseQueue->bMflag) {
    1304           0 :         for (sal_Int32 n = 1; n < sText.getLength(); ++n) {
    1305           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
    1306           0 :                 sText = sText.replaceAt(n++, 0, "\\");
    1307             :             }
    1308             :         }
    1309           0 :     } for (sal_Int32 i = 0; i < sText.getLength(); ++i) {
    1310           0 :         if (sText[i] == '\n') {
    1311           0 :             aOutput << '\n';
    1312             :         } else {
    1313           0 :             char cChar = sText[i];
    1314           0 :             aOutput << cChar;
    1315             :         }
    1316           0 :     }
    1317           0 : }
    1318             : 
    1319             : /*****************************************************************************/
    1320           0 : void Export::ConvertMergeContent( rtl::OString &rText )
    1321             : /*****************************************************************************/
    1322             : {
    1323           0 :     sal_Bool bNoOpen = ( rText.indexOf( "\\\"" ) != 0 );
    1324           0 :     sal_Bool bNoClose = !rText.endsWithL(RTL_CONSTASCII_STRINGPARAM("\\\""));
    1325           0 :     rtl::OStringBuffer sNew;
    1326           0 :     for ( sal_Int32 i = 0; i < rText.getLength(); i++ )
    1327             :     {
    1328           0 :         rtl::OString sChar( rText[i]);
    1329           0 :         if (sChar.equalsL(RTL_CONSTASCII_STRINGPARAM("\\")))
    1330             :         {
    1331           0 :             if (( i + 1 ) < rText.getLength())
    1332             :             {
    1333           0 :                 sal_Char cNext = rText[i + 1];
    1334           0 :                 if ( cNext == '\"' )
    1335             :                 {
    1336           0 :                     sChar = rtl::OString('\"');
    1337           0 :                     i++;
    1338             :                 }
    1339           0 :                 else if ( cNext == 'n' )
    1340             :                 {
    1341           0 :                     sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\n"));
    1342           0 :                     i++;
    1343             :                 }
    1344           0 :                 else if ( cNext == 't' )
    1345             :                 {
    1346           0 :                     sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\t"));
    1347           0 :                     i++;
    1348             :                 }
    1349           0 :                 else if ( cNext == '\'' )
    1350             :                 {
    1351           0 :                     sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\\'"));
    1352           0 :                     i++;
    1353             :                 }
    1354             :                 else
    1355             :                 {
    1356           0 :                     sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\\\"));
    1357             :                 }
    1358             :             }
    1359             :             else
    1360             :             {
    1361           0 :                 sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\\\"));
    1362             :             }
    1363             :         }
    1364           0 :         else if (sChar.equalsL(RTL_CONSTASCII_STRINGPARAM("\"")))
    1365             :         {
    1366           0 :             sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\\""));
    1367             :         }
    1368           0 :         else if (sChar.equalsL(RTL_CONSTASCII_STRINGPARAM("")))
    1369             :         {
    1370           0 :             sChar = rtl::OString(RTL_CONSTASCII_STRINGPARAM("\\0x7F"));
    1371             :         }
    1372           0 :         sNew.append(sChar);
    1373           0 :     }
    1374             : 
    1375           0 :     rText = sNew.makeStringAndClear();
    1376             : 
    1377           0 :     if ( bNoOpen ) {
    1378           0 :         rtl::OString sTmp( rText );
    1379           0 :         rText = "\"";
    1380           0 :         rText += sTmp;
    1381             :     }
    1382           0 :     if ( bNoClose )
    1383           0 :         rText += "\"";
    1384           0 : }
    1385             : 
    1386           0 : sal_Bool Export::PrepareTextToMerge(rtl::OString &rText, sal_uInt16 nTyp,
    1387             :     rtl::OString &rLangIndex, ResData *pResData)
    1388             : {
    1389             :     // position to merge in:
    1390           0 :     sal_Int32 nStart = 0;
    1391           0 :     sal_Int32 nEnd = 0;
    1392           0 :     rtl::OString sOldId = pResData->sId;
    1393           0 :     rtl::OString sOldGId = pResData->sGId;
    1394           0 :     rtl::OString sOldTyp = pResData->sResTyp;
    1395             : 
    1396           0 :     rtl::OString sOrigText( rText );
    1397             : 
    1398           0 :     switch ( nTyp ) {
    1399             :         case LIST_STRING :
    1400             :         case LIST_UIENTRIES :
    1401             :         case LIST_FILTER :
    1402             :         case LIST_PAIRED:
    1403             :         case LIST_ITEM :
    1404             :         {
    1405           0 :             ExportList *pList = NULL;
    1406           0 :             switch ( nTyp ) {
    1407             :                 case LIST_STRING : {
    1408           0 :                     pResData->sResTyp = "stringlist";
    1409           0 :                     pList = pResData->pStringList;
    1410             :                 }
    1411           0 :                 break;
    1412             :                 case LIST_UIENTRIES : {
    1413           0 :                     pResData->sResTyp = "uientries";
    1414           0 :                     pList = pResData->pUIEntries;
    1415             :                 }
    1416           0 :                 break;
    1417             :                 case LIST_FILTER : {
    1418           0 :                     pResData->sResTyp = "filterlist";
    1419           0 :                     pList = pResData->pFilterList;
    1420             :                 }
    1421           0 :                 break;
    1422             :                 case LIST_ITEM : {
    1423           0 :                     pResData->sResTyp = "itemlist";
    1424           0 :                     pList = pResData->pItemList;
    1425             :                 }
    1426           0 :                 break;
    1427             :                 case LIST_PAIRED : {
    1428           0 :                     pResData->sResTyp = "pairedlist";
    1429           0 :                     pList = pResData->pPairedList;
    1430             :                 }
    1431           0 :                 break;
    1432             : 
    1433             :             }
    1434           0 :             if (pList)
    1435             :             {
    1436           0 :                 ExportListEntry *pCurEntry = (*pList)[ nListIndex - 1 ];
    1437           0 :                 if ( pCurEntry )
    1438           0 :                     rText = (*pCurEntry)[ SOURCE_LANGUAGE ];
    1439             :             }
    1440             : 
    1441           0 :             nStart = rText.indexOf( '"' );
    1442           0 :             if ( nStart == -1 ) {
    1443           0 :                 rText = sOrigText;
    1444           0 :                 return sal_False;
    1445             :             }
    1446             : 
    1447           0 :             sal_Bool bFound = sal_False;
    1448           0 :             for ( nEnd = nStart + 1; nEnd < rText.getLength() && !bFound; nEnd++ ) {
    1449           0 :                 if ( rText[nEnd] == '\"' )
    1450           0 :                     bFound = sal_True;
    1451             :             }
    1452           0 :             if ( !bFound ) {
    1453           0 :                 rText = sOrigText;
    1454           0 :                 return sal_False;
    1455             :             }
    1456             : 
    1457           0 :             nEnd --;
    1458           0 :             sLastListLine = rText;
    1459           0 :             if (( sLastListLine.indexOf( '>' ) != -1 ) &&
    1460           0 :                 ( sLastListLine.indexOf( '<' ) == -1 ))
    1461             :             {
    1462           0 :                 rtl::OString sTmp = sLastListLine;
    1463           0 :                 sLastListLine = "<";
    1464           0 :                 sLastListLine += sTmp;
    1465             :             }
    1466           0 :             if ( pResData->sResTyp.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("pairedlist")) )
    1467             :             {
    1468           0 :                pResData->sId = GetPairedListID( sLastListLine );
    1469             :             }
    1470           0 :             else pResData->sId = rtl::OString::valueOf(static_cast<sal_Int32>(nListIndex));
    1471             : 
    1472           0 :             if (!pResData->sGId.isEmpty())
    1473           0 :                 pResData->sGId = pResData->sGId + rtl::OString('.');
    1474           0 :             pResData->sGId = pResData->sGId + sOldId;
    1475           0 :             nTyp = STRING_TYP_TEXT;
    1476             :         }
    1477           0 :         break;
    1478             :         case STRING_TYP_TEXT :
    1479             :         case STRING_TYP_HELPTEXT :
    1480             :         case STRING_TYP_QUICKHELPTEXT :
    1481             :         case STRING_TYP_TITLE :
    1482             :         {
    1483           0 :             nStart = rText.indexOf( '=' );
    1484           0 :             if ( nStart == -1 ) {
    1485           0 :                 rText = sOrigText;
    1486           0 :                 return sal_False;
    1487             :             }
    1488             : 
    1489           0 :             nStart++;
    1490           0 :             sal_Bool bFound = sal_False;
    1491           0 :             while(( nStart < rText.getLength()) && !bFound ) {
    1492           0 :                 if (( rText[nStart] != ' ' ) && ( rText[nStart] != '\t' ))
    1493           0 :                     bFound = sal_True;
    1494             :                 else
    1495           0 :                     nStart ++;
    1496             :             }
    1497             : 
    1498             :             // no start position found
    1499           0 :             if ( !bFound ) {
    1500           0 :                 rText = sOrigText;
    1501           0 :                 return sal_False;
    1502             :             }
    1503             : 
    1504             :             // position to end mergeing in
    1505           0 :             nEnd = rText.getLength() - 1;
    1506           0 :             bFound = sal_False;
    1507             : 
    1508           0 :             while (( nEnd > nStart ) && !bFound ) {
    1509           0 :                 if (( rText[nEnd] != ' ' ) && ( rText[nEnd] != '\t' ) &&
    1510           0 :                     ( rText[nEnd] != '\n' ) && ( rText[nEnd] != ';' ) &&
    1511           0 :                     ( rText[nEnd] != '{' ) && ( rText[nEnd] != '\\' ))
    1512             :                 {
    1513           0 :                     bFound = sal_True;
    1514             :                 }
    1515             :                 else
    1516           0 :                     nEnd --;
    1517             :             }
    1518             :         }
    1519           0 :         break;
    1520             :     }
    1521             : 
    1522             :     // search for merge data
    1523           0 :     if ( !pMergeDataFile ){
    1524           0 :         pMergeDataFile = new MergeDataFile( sMergeSrc, global::inputPathname, false );
    1525             : 
    1526             :         // Init Languages
    1527           0 :         if( Export::sLanguages.equalsIgnoreAsciiCase("ALL") )
    1528           0 :             SetLanguages( pMergeDataFile->GetLanguages() );
    1529           0 :         else if( !isInitialized )InitLanguages();
    1530             : 
    1531             :     }
    1532             : 
    1533           0 :     PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
    1534           0 :     pResData->sId = sOldId;
    1535           0 :     pResData->sGId = sOldGId;
    1536           0 :     pResData->sResTyp = sOldTyp;
    1537             : 
    1538           0 :     if ( !pEntrys ) {
    1539           0 :         rText = sOrigText;
    1540           0 :         return sal_False; // no data found
    1541             :     }
    1542             : 
    1543           0 :     rtl::OString sContent;
    1544           0 :     pEntrys->GetTransex3Text(sContent, nTyp, rLangIndex);
    1545           0 :     if (sContent.isEmpty() && (!Export::isSourceLanguage(rLangIndex)))
    1546             :     {
    1547           0 :         rText = sOrigText;
    1548           0 :         return sal_False; // no data found
    1549             :     }
    1550             : 
    1551           0 :     if (Export::isSourceLanguage(rLangIndex))
    1552           0 :         return sal_False;
    1553             : 
    1554           0 :     rtl::OString sPostFix( rText.copy( ++nEnd ));
    1555           0 :     rText = rText.copy(0, nStart);
    1556             : 
    1557           0 :     ConvertMergeContent( sContent );
    1558             : 
    1559             : 
    1560             : 
    1561             :     // merge new res. in text line
    1562           0 :     rText += sContent;
    1563           0 :     rText += sPostFix;
    1564             : 
    1565           0 :     return sal_True;
    1566             : }
    1567             : 
    1568           0 : void Export::ResData2Output( PFormEntrys *pEntry, sal_uInt16 nType, const rtl::OString& rTextType )
    1569             : {
    1570           0 :     sal_Bool bAddSemicolon = sal_False;
    1571           0 :     sal_Bool bFirst = sal_True;
    1572           0 :     rtl::OString sCur;
    1573             : 
    1574           0 :     for( unsigned int n = 0; n < aLanguages.size(); n++ ){
    1575           0 :         sCur = aLanguages[ n ];
    1576             : 
    1577           0 :         rtl::OString sText;
    1578           0 :         sal_Bool bText = pEntry->GetTransex3Text( sText, nType, sCur , sal_True );
    1579           0 :         if ( bText && !sText.isEmpty() && sText != "-" ) {
    1580           0 :             rtl::OString sOutput;
    1581           0 :             if ( bNextMustBeDefineEOL)  {
    1582           0 :                 if ( bFirst )
    1583           0 :                     sOutput += "\t\\\n";
    1584             :                 else
    1585           0 :                     sOutput += ";\t\\\n";
    1586             :             }
    1587           0 :             bFirst=sal_False;
    1588           0 :             sOutput += "\t";
    1589             : 
    1590           0 :             sOutput += rTextType;
    1591             : 
    1592           0 :             if ( ! Export::isSourceLanguage( sCur ) ) {
    1593           0 :                 sOutput += "[ ";
    1594           0 :                 sOutput += sCur;
    1595           0 :                 sOutput += " ] ";
    1596             :             }
    1597           0 :             sOutput += "= ";
    1598           0 :             ConvertMergeContent( sText );
    1599           0 :             sOutput += sText;
    1600             : 
    1601           0 :             if ( bDefine )
    1602           0 :                 sOutput += ";\\\n";
    1603           0 :             else if ( !bNextMustBeDefineEOL )
    1604           0 :                 sOutput += ";\n";
    1605             :             else
    1606           0 :                 bAddSemicolon = sal_True;
    1607           0 :             for ( sal_uInt16 j = 1; j < nLevel; j++ )
    1608           0 :                 sOutput += "\t";
    1609           0 :             WriteToMerged( sOutput , true );
    1610             :         }
    1611           0 :     }
    1612             : 
    1613             : 
    1614           0 :     if ( bAddSemicolon ) {
    1615           0 :         rtl::OString sOutput( ";" );
    1616           0 :         WriteToMerged( sOutput , false );
    1617           0 :     }
    1618           0 : }
    1619             : 
    1620             : /*****************************************************************************/
    1621           0 : void Export::MergeRest( ResData *pResData, sal_uInt16 nMode )
    1622             : /*****************************************************************************/
    1623             : {
    1624           0 :     if ( !pMergeDataFile ){
    1625           0 :         pMergeDataFile = new MergeDataFile( sMergeSrc, global::inputPathname, false );
    1626             : 
    1627             :         // Init Languages
    1628           0 :         if (Export::sLanguages.equalsIgnoreAsciiCase("ALL"))
    1629           0 :             SetLanguages( pMergeDataFile->GetLanguages() );
    1630           0 :         else if( !isInitialized )InitLanguages();
    1631             : 
    1632             :     }
    1633           0 :     switch ( nMode ) {
    1634             :         case MERGE_MODE_NORMAL : {
    1635           0 :             PFormEntrys *pEntry = pMergeDataFile->GetPFormEntrys( pResData );
    1636             : 
    1637           0 :             if ( pEntry ) {
    1638           0 :                 if ( pResData->bText )
    1639           0 :                     ResData2Output( pEntry, STRING_TYP_TEXT, pResData->sTextTyp );
    1640             : 
    1641           0 :                 if ( pResData->bQuickHelpText )
    1642           0 :                     ResData2Output( pEntry, STRING_TYP_QUICKHELPTEXT, rtl::OString("QuickHelpText") );
    1643             : 
    1644           0 :                 if ( pResData->bTitle )
    1645           0 :                     ResData2Output( pEntry, STRING_TYP_TITLE, rtl::OString("Title") );
    1646             :             }
    1647             : 
    1648             :             // Merge Lists
    1649             : 
    1650           0 :             if ( pResData->bList ) {
    1651           0 :                 bool bPairedList = false;
    1652           0 :                 rtl::OString sOldId = pResData->sId;
    1653           0 :                 rtl::OString sOldGId = pResData->sGId;
    1654           0 :                 rtl::OString sOldTyp = pResData->sResTyp;
    1655           0 :                 if (!pResData->sGId.isEmpty())
    1656           0 :                     pResData->sGId = pResData->sGId + rtl::OString('.');
    1657           0 :                 pResData->sGId = pResData->sGId + sOldId;
    1658           0 :                 rtl::OString sSpace;
    1659           0 :                 for ( sal_uInt16 i = 1; i < nLevel-1; i++ )
    1660           0 :                     sSpace += "\t";
    1661           0 :                 for ( sal_uInt16 nT = LIST_STRING; nT <= LIST_UIENTRIES; nT++ ) {
    1662           0 :                     ExportList *pList = NULL;
    1663           0 :                     switch ( nT ) {
    1664           0 :                         case LIST_STRING : pResData->sResTyp = "stringlist"; pList = pResData->pStringList; bPairedList = false; break;
    1665           0 :                         case LIST_FILTER : pResData->sResTyp = "filterlist"; pList = pResData->pFilterList; bPairedList = false; break;
    1666           0 :                         case LIST_UIENTRIES : pResData->sResTyp = "uientries"; pList = pResData->pUIEntries;bPairedList = false; break;
    1667           0 :                         case LIST_ITEM : pResData->sResTyp = "itemlist"; pList = pResData->pItemList;       bPairedList = false; break;
    1668           0 :                         case LIST_PAIRED : pResData->sResTyp = "pairedlist"; pList = pResData->pPairedList; bPairedList = true;  break;
    1669             :                     }
    1670           0 :                     rtl::OString sCur;
    1671           0 :                     for( unsigned int n = 0; n < aLanguages.size(); n++ )
    1672             :                     {
    1673           0 :                         sCur = aLanguages[ n ];
    1674           0 :                         sal_uInt16 nIdx = 1;
    1675             : 
    1676             :                         // Set matching pairedlist identifier
    1677           0 :                         if( bPairedList && pResData->pPairedList && ( nIdx == 1 ) ){
    1678           0 :                             ExportListEntry* pListE = ( ExportListEntry* ) (*pResData->pPairedList)[ nIdx-1 ];
    1679           0 :                             pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] );
    1680             :                         }
    1681             :                         else
    1682           0 :                             pResData->sId = "1";
    1683             : 
    1684             :                         PFormEntrys *pEntrys;
    1685           0 :                         std::size_t nLIndex = 0;
    1686           0 :                         std::size_t nMaxIndex = 0;
    1687           0 :                         if ( pList )
    1688           0 :                             nMaxIndex = pList->GetSourceLanguageListEntryCount();
    1689           0 :                         pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
    1690           0 :                         while( pEntrys  && ( nLIndex < nMaxIndex )) {
    1691           0 :                             rtl::OString sText;
    1692             :                             sal_Bool bText;
    1693           0 :                             bText = pEntrys->GetTransex3Text( sText, STRING_TYP_TEXT, sCur, sal_True );
    1694           0 :                             if( !bText )
    1695           0 :                                 bText = pEntrys->GetTransex3Text( sText , STRING_TYP_TEXT, SOURCE_LANGUAGE , sal_False );
    1696             : 
    1697           0 :                             if ( bText && !sText.isEmpty())
    1698             :                             {
    1699           0 :                                 if ( nIdx == 1 )
    1700             :                                 {
    1701           0 :                                     rtl::OStringBuffer sHead;
    1702           0 :                                     if ( bNextMustBeDefineEOL )
    1703           0 :                                         sHead.append(RTL_CONSTASCII_STRINGPARAM("\\\n\t"));
    1704           0 :                                     sHead.append(sSpace);
    1705           0 :                                     switch ( nT )
    1706             :                                     {
    1707             :                                         case LIST_STRING:
    1708           0 :                                             sHead.append(RTL_CONSTASCII_STRINGPARAM("StringList "));
    1709           0 :                                             break;
    1710             :                                         case LIST_FILTER:
    1711           0 :                                             sHead.append(RTL_CONSTASCII_STRINGPARAM("FilterList "));
    1712           0 :                                             break;
    1713             :                                         case LIST_ITEM:
    1714           0 :                                             sHead.append(RTL_CONSTASCII_STRINGPARAM("ItemList "));
    1715           0 :                                             break;
    1716             :                                         case LIST_PAIRED:
    1717           0 :                                             sHead.append(RTL_CONSTASCII_STRINGPARAM("PairedList "));
    1718           0 :                                             break;
    1719             :                                         case LIST_UIENTRIES:
    1720           0 :                                             sHead.append(RTL_CONSTASCII_STRINGPARAM("UIEntries "));
    1721           0 :                                             break;
    1722             :                                     }
    1723           0 :                                     sHead.append(RTL_CONSTASCII_STRINGPARAM("[ "));
    1724           0 :                                     sHead.append(sCur);
    1725           0 :                                     sHead.append(RTL_CONSTASCII_STRINGPARAM(" ] "));
    1726             :                                     //}
    1727           0 :                                     if ( bDefine || bNextMustBeDefineEOL )
    1728             :                                     {
    1729           0 :                                         sHead.append(RTL_CONSTASCII_STRINGPARAM("= \\\n"));
    1730           0 :                                         sHead.append(sSpace);
    1731           0 :                                         sHead.append(RTL_CONSTASCII_STRINGPARAM("\t{\\\n\t"));
    1732             :                                     }
    1733             :                                     else
    1734             :                                     {
    1735           0 :                                         sHead.append(RTL_CONSTASCII_STRINGPARAM("= \n"));
    1736           0 :                                         sHead.append(sSpace);
    1737           0 :                                         sHead.append(RTL_CONSTASCII_STRINGPARAM("\t{\n\t"));
    1738             :                                     }
    1739           0 :                                     WriteToMerged(sHead.makeStringAndClear() , true);
    1740             :                                 }
    1741           0 :                                 rtl::OString sLine;
    1742           0 :                                 if ( pList && (*pList)[ nLIndex ] )
    1743           0 :                                     sLine = ( *(*pList)[ nLIndex ])[ SOURCE_LANGUAGE ];
    1744           0 :                                 if ( sLine.isEmpty())
    1745           0 :                                     sLine = sLastListLine;
    1746             : 
    1747           0 :                                 if ( sLastListLine.indexOf( '<' ) != -1 ) {
    1748           0 :                                     if (( nT != LIST_UIENTRIES ) &&
    1749           0 :                                         (( sLine.indexOf( '{' ) == -1 ) ||
    1750           0 :                                         ( sLine.indexOf( '{' ) >= sLine.indexOf( '"' ))) &&
    1751           0 :                                         (( sLine.indexOf( '<' ) == -1 ) ||
    1752           0 :                                         ( sLine.indexOf( '<' ) >= sLine.indexOf( '"' ))))
    1753             :                                     {
    1754           0 :                                         sLine = sLine.replaceFirst("\"", "< \"" );
    1755             :                                     }
    1756             :                                 }
    1757             : 
    1758             :                                 sal_Int32 nStart, nEnd;
    1759           0 :                                 nStart = sLine.indexOf( '"' );
    1760             : 
    1761           0 :                                 rtl::OString sPostFix;
    1762           0 :                                 if( !bPairedList ){
    1763           0 :                                     nEnd = sLine.lastIndexOf( '"' );
    1764           0 :                                     sPostFix = sLine.copy( ++nEnd );
    1765           0 :                                     sLine = sLine.copy(0, nStart);
    1766             :                                 }
    1767             : 
    1768             : 
    1769           0 :                                 ConvertMergeContent( sText );
    1770             : 
    1771             :                                 // merge new res. in text line
    1772           0 :                                 if( bPairedList ){
    1773           0 :                                     sLine = MergePairedList( sLine , sText );
    1774             :                                 }
    1775             :                                 else{
    1776           0 :                                     sLine += sText;
    1777           0 :                                     sLine += sPostFix;
    1778             :                                 }
    1779             : 
    1780           0 :                                 rtl::OString sText1( "\t" );
    1781           0 :                                 sText1 += sLine;
    1782           0 :                                 if ( bDefine || bNextMustBeDefineEOL )
    1783           0 :                                     sText1 += " ;\\\n";
    1784             :                                 else
    1785           0 :                                     sText1 += " ;\n";
    1786           0 :                                 sText1 += sSpace;
    1787           0 :                                 sText1 += "\t";
    1788           0 :                                 WriteToMerged( sText1 ,true );
    1789             : 
    1790             :                                 // Set matching pairedlist identifier
    1791           0 :                                 if ( bPairedList ){
    1792           0 :                                     nIdx++;
    1793           0 :                                     ExportListEntry* pListE = ( ExportListEntry* )(*pResData->pPairedList)[ ( nIdx ) -1 ];
    1794           0 :                                     if( pListE ){
    1795           0 :                                         pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] );
    1796             :                                     }
    1797             :                                 }
    1798             :                                 else
    1799           0 :                                     pResData->sId = rtl::OString::valueOf(static_cast<sal_Int32>(++nIdx));
    1800             :                             }
    1801             :                             else
    1802             :                                 break;
    1803           0 :                             nLIndex ++;
    1804           0 :                             PFormEntrys *oldEntry = pEntrys;
    1805           0 :                             pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
    1806           0 :                             if( !pEntrys )
    1807           0 :                                 pEntrys = oldEntry;
    1808           0 :                         }
    1809           0 :                         if ( nIdx > 1 ) {
    1810           0 :                             rtl::OString sFooter;
    1811           0 :                             if (!sSpace.isEmpty()) {
    1812           0 :                                 sFooter = sSpace.copy(1);
    1813             :                             }
    1814           0 :                             if ( bNextMustBeDefineEOL )
    1815           0 :                                 sFooter += "};";
    1816           0 :                             else if ( !bDefine )
    1817           0 :                                 sFooter += "};\n\t";
    1818             :                             else
    1819           0 :                                 sFooter += "\n\n";
    1820           0 :                             WriteToMerged( sFooter ,true );
    1821             :                         }
    1822             :                     }
    1823           0 :                 }
    1824             : 
    1825           0 :                 pResData->sId = sOldId;
    1826           0 :                 pResData->sGId = sOldGId;
    1827           0 :                 pResData->sResTyp = sOldTyp;
    1828             :             }
    1829             :         }
    1830           0 :         break;
    1831             :         case MERGE_MODE_LIST : {
    1832           0 :             ExportList *pList = NULL;
    1833           0 :             switch ( nList ) {
    1834             :                 // PairedList
    1835           0 :                 case LIST_STRING : pList = pResData->pStringList; break;
    1836           0 :                 case LIST_FILTER : pList = pResData->pFilterList; break;
    1837           0 :                 case LIST_UIENTRIES : pList = pResData->pUIEntries; break;
    1838           0 :                 case LIST_ITEM : pList = pResData->pItemList; break;
    1839           0 :                 case LIST_PAIRED : pList = pResData->pPairedList; break;
    1840             : 
    1841             :             }
    1842             : 
    1843           0 :             nListIndex++;
    1844           0 :             std::size_t nMaxIndex = 0;
    1845           0 :             if ( pList )
    1846           0 :                 nMaxIndex = pList->GetSourceLanguageListEntryCount();
    1847           0 :             rtl::OString sLine;
    1848           0 :             if ( pList && (*pList)[ nListIndex ] )
    1849           0 :                 sLine = ( *(*pList)[ nListIndex ])[ SOURCE_LANGUAGE ];
    1850           0 :             if ( sLine.isEmpty())
    1851           0 :                 sLine = sLastListLine;
    1852             : 
    1853           0 :             if ( sLastListLine.indexOf( '<' ) != -1 ) {
    1854           0 :                 if (( nList != LIST_UIENTRIES ) &&
    1855           0 :                     (( sLine.indexOf( '{' ) == -1 ) ||
    1856           0 :                     ( sLine.indexOf( '{' ) >= sLine.indexOf( '"' ))) &&
    1857           0 :                     (( sLine.indexOf( '<' ) == -1 ) ||
    1858           0 :                     ( sLine.indexOf( '<' ) >= sLine.indexOf( '"' ))))
    1859             :                 {
    1860           0 :                     sLine = sLine.replaceFirst("\"", "< \"");
    1861             :                 }
    1862             :             }
    1863             : 
    1864           0 :             while( PrepareTextToMerge( sLine, nList, m_sListLang, pResData ) && ( nListIndex <= nMaxIndex )) {
    1865           0 :                 rtl::OString sText( "\t" );
    1866           0 :                 sText += sLine;
    1867           0 :                 sText += " ;";
    1868           0 :                 sText += "\n";
    1869           0 :                 for ( sal_uInt16 i = 0; i < nLevel; i++ )
    1870           0 :                     sText += "\t";
    1871           0 :                 WriteToMerged( sText ,false );
    1872           0 :                 nListIndex++;
    1873           0 :                 if ( pList && (*pList)[ nListIndex ])
    1874           0 :                     sLine = ( *(*pList)[ nListIndex ])[ SOURCE_LANGUAGE ];
    1875           0 :                 if ( sLine.isEmpty())
    1876           0 :                     sLine = sLastListLine;
    1877           0 :                 sLine += " ;";
    1878           0 :             }
    1879             :         }
    1880           0 :         break;
    1881             :     }
    1882           0 :     pParseQueue->bMflag = false;
    1883           0 : }
    1884             : 
    1885           0 : rtl::OString Export::MergePairedList( rtl::OString const & sLine , rtl::OString const & sText ){
    1886             : // < "xy" ; IDENTIFIER ; >
    1887           0 :     rtl::OString sPre  = sLine.copy( 0 , sLine.indexOf('"') );
    1888           0 :     rtl::OString sPost = sLine.copy( sLine.lastIndexOf('"') + 1 );
    1889           0 :     sPre += sText;
    1890           0 :     sPre += sPost;
    1891           0 :     return sPre;
    1892             : }
    1893             : 
    1894             : /*****************************************************************************/
    1895           0 : void Export::SetChildWithText()
    1896             : /*****************************************************************************/
    1897             : {
    1898           0 :     if ( aResStack.size() > 1 ) {
    1899           0 :         for ( size_t i = 0; i < aResStack.size() - 1; i++ ) {
    1900           0 :             aResStack[ i ]->bChildWithText = sal_True;
    1901             :         }
    1902             :     }
    1903           0 : }
    1904             : 
    1905           0 : void ParserQueue::Push( const QueueEntry& aEntry )
    1906             : {
    1907           0 :     sal_Int32 nLen = aEntry.sLine.getLength();
    1908             : 
    1909           0 :     if( !bStart ){
    1910           0 :         aQueueCur->push( aEntry );
    1911           0 :         if( nLen > 1 && aEntry.sLine[nLen-1] == '\n' )
    1912           0 :             bStart = true;
    1913           0 :         else if ( aEntry.nTyp != IGNOREDTOKENS ){
    1914           0 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1915             :                 // Next is Macro
    1916           0 :                 bCurrentIsM = true;
    1917             :              }else{
    1918             :                 // Next is no Macro
    1919           0 :                 bCurrentIsM = false;
    1920             :              }
    1921             :         }
    1922             :     }
    1923             :     else{
    1924           0 :         aQueueNext->push( aEntry );
    1925           0 :         if( nLen > 1 && aEntry.sLine[nLen-1] != '\n' ){
    1926           0 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1927             :                 // Next is Macro
    1928           0 :                 bNextIsM = true;
    1929             :             }
    1930             :             else{
    1931             :                 // Next is no Macro
    1932           0 :                 bNextIsM = false;
    1933             :             }
    1934           0 :         }else if( nLen > 2 && aEntry.sLine[nLen-1] == '\n' ){
    1935           0 :             if( aEntry.nTyp != IGNOREDTOKENS ){
    1936           0 :                 if( nLen > 2 && ( aEntry.sLine[nLen-2] == '\\') ){
    1937             :                     // Next is Macro
    1938           0 :                     bNextIsM = true;
    1939             :                 }
    1940             :                 else{
    1941             :                     // Next is no Macro
    1942           0 :                     bNextIsM = false;
    1943             :                 }
    1944             :             }
    1945             :             // Pop current
    1946           0 :             Pop( *aQueueCur );
    1947           0 :             bLastWasM = bCurrentIsM;
    1948             :             // next -> current
    1949           0 :             bCurrentIsM = bNextIsM;
    1950           0 :             aQref = aQueueCur;
    1951           0 :             aQueueCur = aQueueNext;
    1952           0 :             aQueueNext = aQref;
    1953             : 
    1954             :         }
    1955             : 
    1956             :         else{
    1957             :             // Pop current
    1958           0 :             Pop( *aQueueCur );
    1959           0 :             bLastWasM = bCurrentIsM;
    1960             :             // next -> current
    1961           0 :             bCurrentIsM = bNextIsM;
    1962           0 :             aQref = aQueueCur;
    1963           0 :             aQueueCur = aQueueNext;
    1964           0 :             aQueueNext = aQref;
    1965             :         }
    1966             :     }
    1967           0 : }
    1968             : 
    1969           0 : void ParserQueue::Close(){
    1970             :     // Pop current
    1971           0 :     Pop( *aQueueCur );
    1972             :     // next -> current
    1973           0 :     bLastWasM = bCurrentIsM;
    1974           0 :     bCurrentIsM = bNextIsM;
    1975           0 :     aQref = aQueueCur;
    1976           0 :     aQueueCur = aQueueNext;
    1977           0 :     aQueueNext = aQref;
    1978           0 :     bNextIsM = false;
    1979           0 :     Pop( *aQueueNext );
    1980           0 : };
    1981             : 
    1982           0 : void ParserQueue::Pop( std::queue<QueueEntry>& aQueue )
    1983             : {
    1984           0 :     while (!aQueue.empty())
    1985             :     {
    1986           0 :         QueueEntry aEntry = aQueue.front();
    1987           0 :         aQueue.pop();
    1988           0 :         aExport.Execute(aEntry.nTyp, aEntry.sLine.getStr());
    1989           0 :     }
    1990           0 : }
    1991             : 
    1992           0 : ParserQueue::ParserQueue( Export& aExportObj )
    1993             :         :
    1994             :           bCurrentIsM( false ),
    1995             :           bNextIsM( false ) ,
    1996             :           bLastWasM( false ),
    1997             :           bMflag( false ) ,
    1998             :           aExport( aExportObj ) ,
    1999           0 :           bStart( false )
    2000             : {
    2001           0 :           aQueueNext = new std::queue<QueueEntry>;
    2002           0 :           aQueueCur  = new std::queue<QueueEntry>;
    2003           0 : }
    2004             : 
    2005             : 
    2006           0 : ParserQueue::~ParserQueue(){
    2007           0 :     if( aQueueNext )    delete aQueueNext;
    2008           0 :     if( aQueueCur )     delete aQueueCur;
    2009           0 : }
    2010             : 
    2011             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10