LCOV - code coverage report
Current view: top level - l10ntools/source - export.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 388 726 53.4 %
Date: 2014-11-03 Functions: 26 37 70.3 %
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 "helper.hxx"
      26             : #include "srclex.hxx"
      27             : 
      28             : #include "boost/scoped_ptr.hpp"
      29             : #include <cstdio>
      30             : #include <cstdlib>
      31             : #include "common.hxx"
      32             : #include "export.hxx"
      33             : #include "tokens.h"
      34             : #include <iostream>
      35             : #include <rtl/strbuf.hxx>
      36             : 
      37             : void yyerror( const char * );
      38             : void YYWarning( const char * );
      39             : 
      40             : namespace {
      41             : 
      42             : MergeDataFile * pMergeDataFile = 0; //TODO
      43             : 
      44             : namespace global {
      45             : 
      46           8 : OString inputPathname;
      47           8 : boost::scoped_ptr< Export > exporter;
      48             : 
      49             : }
      50             : 
      51           0 : static OString lcl_GetListTyp( const sal_uInt16 nTyp, const bool bUpperCamelCase )
      52             : {
      53           0 :     OString sType;
      54           0 :     switch (nTyp)
      55             :     {
      56             :         case LIST_STRING:
      57           0 :             sType = bUpperCamelCase ? "StringList" : "stringlist";
      58           0 :             break;
      59             :         case LIST_FILTER:
      60           0 :             sType = bUpperCamelCase ? "FilterList" : "filterlist";
      61           0 :             break;
      62             :         case LIST_ITEM:
      63           0 :             sType = bUpperCamelCase ? "ItemList" : "itemlist";
      64           0 :             break;
      65             :         case LIST_PAIRED:
      66           0 :             sType = bUpperCamelCase ? "PairedList" : "pairedlist";
      67           0 :             break;
      68           0 :         default: break;
      69             :     }
      70           0 :     return sType;
      71             : }
      72             : 
      73             : }
      74             : 
      75             : extern "C" {
      76             : 
      77           8 : FILE * init(int argc, char ** argv)
      78             : {
      79           8 :     common::HandledArgs aArgs;
      80           8 :     if ( !common::handleArguments(argc, argv, aArgs) )
      81             :     {
      82           0 :         common::writeUsage("transex3","*.src/*.hrc");
      83           0 :         std::exit(EXIT_FAILURE);
      84             :     }
      85           8 :     global::inputPathname =  aArgs.m_sInputFile;
      86             : 
      87           8 :     FILE * pFile = std::fopen(global::inputPathname.getStr(), "r");
      88           8 :     if (pFile == 0) {
      89             :         std::fprintf(
      90             :             stderr, "Error: Cannot open file \"%s\"\n",
      91           0 :             global::inputPathname.getStr());
      92           0 :         std::exit(EXIT_FAILURE);
      93             :     }
      94             : 
      95           8 :     if (aArgs.m_bMergeMode) {
      96             :         global::exporter.reset(new Export(aArgs.m_sMergeSrc, aArgs.m_sOutputFile,
      97           8 :                                           aArgs.m_sLanguage, aArgs.m_bUTF8BOM));
      98             :     } else {
      99           0 :         global::exporter.reset(new Export(aArgs.m_sOutputFile));
     100             :     }
     101             : 
     102           8 :     global::exporter->Init();
     103             : 
     104           8 :     return pFile;
     105             : }
     106             : 
     107         230 : int Parse( int nTyp, const char *pTokenText ){
     108         230 :     global::exporter->Execute( nTyp , pTokenText );
     109         230 :     return 1;
     110             : }
     111             : 
     112           8 : void Close()
     113             : {
     114           8 :     global::exporter->GetParseQueue()->Close();
     115           8 :     global::exporter.reset();
     116             :         // avoid nontrivial Export dtor being executed during exit
     117           8 : }
     118             : 
     119       23593 : int WorkOnTokenSet( int nTyp, char *pTokenText )
     120             : {
     121       23593 :     global::exporter->GetParseQueue()->Push( QueueEntry( nTyp , OString(pTokenText) ) );
     122       23593 :     return 1;
     123             : }
     124             : 
     125           0 : int SetError()
     126             : {
     127             :     // set error at global instance of class Export
     128           0 :     global::exporter->SetError();
     129           0 :     return 1;
     130             : }
     131             : 
     132           8 : int GetError()
     133             : {
     134             :     // get error at global instance of class Export
     135           8 :     if (global::exporter->GetError())
     136           0 :         return 1;
     137           8 :     return sal_False;
     138             : }
     139             : 
     140             : } // extern "C"
     141             : 
     142             : 
     143             : // class ResData
     144             : 
     145             : 
     146         836 : bool ResData::SetId( const OString& rId, sal_uInt16 nLevel )
     147             : {
     148         836 :     if ( nLevel > nIdLevel )
     149             :     {
     150         520 :         nIdLevel = nLevel;
     151         520 :         sId = rId;
     152             : 
     153         520 :         if ( bChild && bChildWithText )
     154             :         {
     155           0 :             OString sError("ResId after child definition");
     156           0 :             yyerror(sError.getStr());
     157           0 :             SetError();
     158             :         }
     159             : 
     160         520 :         if ( sId.getLength() > 255 )
     161             :         {
     162           0 :             YYWarning( "LocalId > 255 chars, truncating..." );
     163           0 :             sId = sId.copy(0, 255).trim();
     164             :         }
     165             : 
     166         520 :         return true;
     167             :     }
     168             : 
     169         316 :     return false;
     170             : }
     171             : 
     172             : 
     173             : // class Export
     174             : 
     175             : 
     176             : namespace
     177             : {
     178             : 
     179         999 : static sal_Int32 lcl_countOccurrences(const OString& text, char c)
     180             : {
     181         999 :     sal_Int32 n = 0;
     182        2997 :     for (sal_Int32 i = 0;; ++i) {
     183        2997 :         i = text.indexOf(c, i);
     184        2997 :         if (i == -1) {
     185         999 :             break;
     186             :         }
     187        1998 :         ++n;
     188        1998 :     }
     189         999 :     return n;
     190             : }
     191             : 
     192             : }
     193             : 
     194           0 : Export::Export(const OString &rOutput)
     195             :                 :
     196             :                 bDefine( false ),
     197             :                 bNextMustBeDefineEOL( false ),
     198             :                 nLevel( 0 ),
     199             :                 nList( LIST_NON ),
     200             :                 nListIndex( 0 ),
     201             :                 nListLevel( 0 ),
     202             :                 bMergeMode( false ),
     203             :                 bError( false ),
     204             :                 bReadOver( false ),
     205             :                 sFilename( global::inputPathname ),
     206             :                 sLanguages( OString() ),
     207           0 :                 pParseQueue( new ParserQueue( *this ) )
     208             : {
     209           0 :     aOutput.mPo = new PoOfstream( rOutput, PoOfstream::APP );
     210           0 :     if (!aOutput.mPo->isOpen())
     211             :     {
     212           0 :         std::fprintf(stderr, "ERROR : Can't open file %s\n", rOutput.getStr());
     213           0 :         std::exit(EXIT_FAILURE);
     214             :     }
     215           0 : }
     216             : 
     217           8 : Export::Export(
     218             :     const OString &rMergeSource, const OString &rOutput,
     219             :     const OString &rLanguage, bool bUTF8BOM)
     220             :                 :
     221             :                 bDefine( false ),
     222             :                 bNextMustBeDefineEOL( false ),
     223             :                 nLevel( 0 ),
     224             :                 nList( LIST_NON ),
     225             :                 nListIndex( 0 ),
     226             :                 nListLevel( 0 ),
     227             :                 bMergeMode( true ),
     228             :                 sMergeSrc( rMergeSource ),
     229             :                 bError( false ),
     230             :                 bReadOver( false ),
     231             :                 sFilename( global::inputPathname ),
     232             :                 sLanguages( rLanguage ),
     233           8 :                 pParseQueue( new ParserQueue( *this ) )
     234             : {
     235           8 :     aOutput.mSimple = new std::ofstream();
     236           8 :     aOutput.mSimple->open(rOutput.getStr(), std::ios_base::out | std::ios_base::trunc);
     237           8 :     if (!aOutput.mSimple->is_open())
     238             :     {
     239           0 :         std::fprintf(stderr, "ERROR : Can't open file %s\n", rOutput.getStr());
     240           0 :         std::exit(EXIT_FAILURE);
     241             :     }
     242             : 
     243           8 :     if ( bUTF8BOM ) WriteUTF8ByteOrderMarkToOutput();
     244           8 : }
     245             : 
     246           8 : void Export::Init()
     247             : {
     248             :     // resets the internal status, used before parseing another file
     249           8 :     bDefine = false;
     250           8 :     bNextMustBeDefineEOL = false;
     251           8 :     nLevel = 0;
     252           8 :     nList = LIST_NON;
     253           8 :     nListIndex = 0;
     254           8 :     for ( size_t i = 0, n = aResStack.size(); i < n;  ++i )
     255           0 :         delete aResStack[ i ];
     256           8 :     aResStack.clear();
     257           8 : }
     258             : 
     259          16 : Export::~Export()
     260             : {
     261           8 :     if( pParseQueue )
     262           8 :         delete pParseQueue;
     263           8 :     if ( bMergeMode )
     264             :     {
     265           8 :         aOutput.mSimple->close();
     266           8 :         delete aOutput.mSimple;
     267             :     }
     268             :     else
     269             :     {
     270           0 :         aOutput.mPo->close();
     271           0 :         delete aOutput.mPo;
     272             :     }
     273           8 :     for ( size_t i = 0, n = aResStack.size(); i < n;  ++i )
     274           0 :         delete aResStack[ i ];
     275           8 :     aResStack.clear();
     276             : 
     277           8 :     if ( bMergeMode ) {
     278           8 :         if ( !pMergeDataFile )
     279           0 :             pMergeDataFile = new MergeDataFile(sMergeSrc, global::inputPathname, true);
     280             : 
     281           8 :         delete pMergeDataFile;
     282             :     }
     283           8 : }
     284             : 
     285       23842 : int Export::Execute( int nToken, const char * pToken )
     286             : {
     287             : 
     288       23842 :     OString sToken( pToken );
     289       47684 :     OString sOrig( sToken );
     290             : 
     291       23842 :     if ( nToken == CONDITION )
     292             :     {
     293         105 :         OString sTestToken(pToken);
     294         210 :         sTestToken = sTestToken.replaceAll("\t", OString()).
     295         105 :             replaceAll(" ", OString());
     296         105 :         if (( !bReadOver ) && ( sTestToken.startsWith("#ifndef__RSC_PARSER")))
     297           0 :             bReadOver = true;
     298         105 :         else if (( bReadOver ) && ( sTestToken.startsWith("#endif") ))
     299           0 :             bReadOver = false;
     300             :     }
     301       65280 :     if ((( nToken < FILTER_LEVEL ) || ( bReadOver )) &&
     302       20719 :         (!(( bNextMustBeDefineEOL ) && ( sOrig == "\n" )))) {
     303             :         // this tokens are not mandatory for parsing, so ignore them ...
     304       20719 :         if ( bMergeMode )
     305       20719 :             WriteToMerged( sOrig , false ); // ... or write them directly to dest.
     306       20719 :         return 0;
     307             :     }
     308             : 
     309        3123 :     ResData *pResData = NULL;
     310        3123 :     if ( nLevel ) {
     311             :         // res. exists at cur. level
     312        2736 :         pResData = ( (nLevel-1) < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL;
     313             :     }
     314         387 :     else if (( nToken != RESOURCE ) &&
     315         364 :             ( nToken != RESOURCEEXPR ) &&
     316         364 :             ( nToken != SMALRESOURCE ) &&
     317         364 :             ( nToken != LEVELUP ) &&
     318         357 :             ( nToken != NORMDEFINE ) &&
     319         133 :             ( nToken != RSCDEFINE ) &&
     320          87 :             ( nToken != CONDITION ) &&
     321             :             ( nToken != PRAGMA ))
     322             :     {
     323             :         // no res. exists at cur. level so return
     324          87 :         if ( bMergeMode )
     325          87 :             WriteToMerged( sOrig , false );
     326          87 :         return 0;
     327             :     }
     328             : 
     329        3036 :     if ( bDefine ) {
     330        1686 :         if (( nToken != EMPTYLINE ) && ( nToken != LEVELDOWN ) && ( nToken != LEVELUP )) {
     331             :             // cur. res. defined in macro
     332        1193 :             if ( bNextMustBeDefineEOL ) {
     333           0 :                 if ( nToken != RSCDEFINELEND ) {
     334             :                     // end of macro found, so destroy res.
     335           0 :                     bDefine = false;
     336           0 :                     Execute( LEVELDOWN, "" );
     337           0 :                     bNextMustBeDefineEOL = false;
     338             :                 }
     339             :                 else {
     340             :                     // next line also in macro definition
     341           0 :                     bNextMustBeDefineEOL = false;
     342           0 :                     if ( bMergeMode )
     343           0 :                         WriteToMerged( sOrig , false );
     344           0 :                     return 1;
     345             :                 }
     346             :             }
     347             :         }
     348             :     }
     349             : 
     350        3036 :     bool bExecuteDown = false;
     351        3036 :     if ( nToken != LEVELDOWN ) {
     352        2360 :         sal_uInt16 nOpen = 0;
     353        2360 :         sal_uInt16 nClose = 0;
     354        2360 :         bool bReadOver1 = false;
     355        2360 :         sal_uInt16 i = 0;
     356       64796 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     357       62436 :             if ( sToken[i] == '"' )
     358         666 :                 bReadOver1 = !bReadOver1;
     359       62436 :             if ( !bReadOver1 && ( sToken[i] == '{' ))
     360         448 :                 nOpen++;
     361             :         }
     362             : 
     363        2360 :         bReadOver1 = false;
     364       64796 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     365       62436 :             if ( sToken[i] == '"' )
     366         666 :                 bReadOver1 = !bReadOver1;
     367       62436 :             if ( !bReadOver1 && ( sToken[i] == '}' ))
     368           2 :                 nClose++;
     369             :         }
     370             : 
     371        2360 :         if ( nOpen < nClose )
     372           0 :             bExecuteDown = true;
     373             :     }
     374             : 
     375        3036 :     bool bWriteToMerged = bMergeMode;
     376        3036 :     switch ( nToken ) {
     377             : 
     378             :         case NORMDEFINE:
     379           7 :             if ( bMergeMode )
     380           7 :                 WriteToMerged( sOrig , false );
     381           7 :             return 0;
     382             :         case RSCDEFINE:
     383         230 :             bDefine = true; // res. defined in macro
     384             : 
     385             :         case RESOURCE:
     386             :         case RESOURCEEXPR: {
     387         253 :             if ( nToken != RSCDEFINE )
     388          23 :                 bNextMustBeDefineEOL = false;
     389             :             // this is the beginning of a new res.
     390         253 :             nLevel++;
     391         253 :             if ( nLevel > 1 ) {
     392           6 :                 aResStack[ nLevel - 2 ]->bChild = true;
     393             :             }
     394             : 
     395             :             // create new instance for this res. and fill mandatory fields
     396             : 
     397         253 :             pResData = new ResData( FullId() , sFilename );
     398         253 :             aResStack.push_back( pResData );
     399         506 :             sToken = sToken.replaceAll("\n", OString()).
     400             :                 replaceAll("\r", OString()).
     401         253 :                 replaceAll("{", OString()).replace('\t', ' ');
     402         253 :             sToken = sToken.trim();
     403         253 :             OString sTLower = sToken.getToken(0, ' ').toAsciiLowerCase();
     404         253 :             pResData->sResTyp = sTLower;
     405         506 :             OString sId( sToken.copy( pResData->sResTyp.getLength() + 1 ));
     406         506 :             OString sCondition;
     407         253 :             if ( sId.indexOf( '#' ) != -1 )
     408             :             {
     409             :                 // between ResTyp, Id and paranthes is a precomp. condition
     410          19 :                 sCondition = "#";
     411          19 :                 sal_Int32 n = 0;
     412          19 :                 sId = sId.getToken(0, '#', n);
     413          19 :                 sCondition += sId.getToken(0, '#', n);
     414             :             }
     415         253 :             sId = sId.getToken(0, '/');
     416         253 :             CleanValue( sId );
     417         253 :             sId = sId.replaceAll("\t", OString());
     418         253 :             pResData->SetId( sId, ID_LEVEL_IDENTIFIER );
     419         253 :             if (!sCondition.isEmpty())
     420             :             {
     421          19 :                 Execute( CONDITION, "");  // execute the precomp. condition
     422         253 :             }
     423             :         }
     424         253 :         break;
     425             :         case SMALRESOURCE: {
     426             :             // this is the beginning of a new res.
     427         364 :             bNextMustBeDefineEOL = false;
     428         364 :             nLevel++;
     429         364 :             if ( nLevel > 1 ) {
     430         364 :                 aResStack[ nLevel - 2 ]->bChild = true;
     431             :             }
     432             : 
     433             :             // create new instance for this res. and fill mandatory fields
     434             : 
     435         364 :             pResData = new ResData( FullId() , sFilename );
     436         364 :             aResStack.push_back( pResData );
     437         728 :             sToken = sToken.replaceAll("\n", OString()).
     438             :                 replaceAll("\r", OString()).
     439             :                 replaceAll("{", OString()).
     440             :                 replaceAll("\t", OString()).
     441             :                 replaceAll(" ", OString()).
     442         364 :                 replaceAll("\\", OString()).toAsciiLowerCase();
     443         364 :             pResData->sResTyp = sToken;
     444             :         }
     445         364 :         break;
     446             :         case LEVELUP: {
     447             :             // push
     448          59 :             if ( nList )
     449             :             {
     450           0 :                 nListLevel++;
     451           0 :                 break;
     452             :             }
     453             : 
     454          59 :             OString sLowerTyp;
     455          59 :             if ( pResData )
     456          59 :                 sLowerTyp = "unknown";
     457          59 :             nLevel++;
     458          59 :             if ( nLevel > 1 ) {
     459          59 :                 aResStack[ nLevel - 2 ]->bChild = true;
     460             :             }
     461             : 
     462          59 :             ResData *pNewData = new ResData( FullId() , sFilename );
     463          59 :             pNewData->sResTyp = sLowerTyp;
     464          59 :             aResStack.push_back( pNewData );
     465             :         }
     466          59 :         break;
     467             :         case LEVELDOWN: {
     468             :             // pop
     469         676 :             if ( !nList || !nListLevel ) {
     470         676 :                 if ( nLevel ) {
     471         676 :                     if ( bDefine && (nLevel == 1 )) {
     472           0 :                         bDefine = false;
     473           0 :                         bNextMustBeDefineEOL = false;
     474             :                     }
     475         676 :                     WriteData( pResData );
     476         676 :                     ResStack::iterator it = aResStack.begin();
     477         676 :                     ::std::advance( it, nLevel-1 );
     478         676 :                     delete *it;
     479         676 :                     aResStack.erase( it );
     480         676 :                     nLevel--;
     481             :                 }
     482         676 :                 if( nList )
     483             :                 {
     484           0 :                     nList = LIST_NON;
     485           0 :                     nListLevel = 1;
     486         676 :                 }
     487             :             }
     488             :             else
     489             :             {
     490           0 :                 if ( bDefine )
     491           0 :                     bNextMustBeDefineEOL = true;
     492           0 :                 nListLevel--;
     493             :             }
     494             :         }
     495         676 :         break;
     496             :         case ASSIGNMENT:
     497             :         {
     498             :             // interpret different types of assignement
     499         888 :             sal_Int32 n = 0;
     500             :             OString sKey = sToken.getToken(0, '=', n).
     501             :                 replaceAll(" ", OString()).
     502         888 :                 replaceAll("\t", OString());
     503        1776 :             OString sValue = sToken.getToken(0, '=', n);
     504         888 :             CleanValue( sValue );
     505         888 :             sKey = sKey.toAsciiUpperCase();
     506         888 :             if (sKey == "IDENTIFIER")
     507             :             {
     508             :                 OString sId(
     509             :                     sValue.replaceAll("\t", OString()).
     510         344 :                     replaceAll(" ", OString()));
     511         344 :                 pResData->SetId(sId, ID_LEVEL_IDENTIFIER);
     512             :             }
     513         544 :             else if (sKey =="STRINGLIST")
     514             :             {
     515           0 :                 nList = LIST_STRING;
     516           0 :                 nListIndex = 0;
     517           0 :                 nListLevel = 1;
     518             :             }
     519         544 :             else if (sKey == "FILTERLIST")
     520             :             {
     521           0 :                 nList = LIST_FILTER;
     522           0 :                 nListIndex = 0;
     523           0 :                 nListLevel = 1;
     524             :             }
     525        1776 :             if (sToken.indexOf( '{' ) != -1
     526         888 :                 && (lcl_countOccurrences(sToken, '{')
     527           0 :                     > lcl_countOccurrences(sToken, '}')))
     528             :             {
     529           0 :                 Parse( LEVELUP, "" );
     530         888 :             }
     531             :          }
     532         888 :         break;
     533             :         case LISTASSIGNMENT:
     534             :         {
     535             :             OString sTmpToken(
     536           0 :                 sToken.replaceAll(" ", OString()).toAsciiLowerCase());
     537           0 :             sal_Int32 nPos = sTmpToken.indexOf("[en-us]=");
     538           0 :             if (nPos != -1) {
     539             :                 OString sKey(
     540             :                     sTmpToken.copy(0 , nPos).replaceAll(" ", OString()).
     541           0 :                     replaceAll("\t", OString()));
     542           0 :                 OString sValue = sToken.getToken(1, '=');
     543           0 :                 CleanValue( sValue );
     544           0 :                 sKey = sKey.toAsciiUpperCase();
     545           0 :                 if (sKey == "STRINGLIST")
     546             :                 {
     547           0 :                     nList = LIST_STRING;
     548             :                 }
     549           0 :                 else if (sKey == "FILTERLIST")
     550             :                 {
     551           0 :                     nList = LIST_FILTER;
     552             :                 }
     553           0 :                 else if (sKey == "PAIREDLIST")
     554             :                 {
     555           0 :                     nList = LIST_PAIRED;
     556             :                 }
     557           0 :                 else if (sKey == "ITEMLIST")
     558             :                 {
     559           0 :                     nList = LIST_ITEM;
     560             :                 }
     561           0 :                 if( nList )
     562             :                 {
     563           0 :                     nListIndex = 0;
     564           0 :                     nListLevel = 1;
     565           0 :                 }
     566           0 :             }
     567             :         }
     568           0 :         break;
     569             :         case TEXT:
     570             :         case _LISTTEXT:
     571             :         case LISTTEXT: {
     572             :             // this is an entry for a List
     573           0 :             if ( nList )
     574             :             {
     575           0 :                 SetChildWithText();
     576           0 :                 InsertListEntry( sOrig );
     577             :             }
     578             :         }
     579           0 :         break;
     580             :         case LONGTEXTLINE:
     581             :         case TEXTLINE:
     582         333 :             if ( nLevel )
     583             :             {
     584         333 :                 CutComment( sToken );
     585             : 
     586             :                 // this is a text line!!!
     587         333 :                 OString t(sToken.getToken(0, '='));
     588             :                 OString sKey(
     589             :                     t.getToken(0, '[').replaceAll(" ", OString()).
     590         666 :                     replaceAll("\t", OString()));
     591         666 :                 OString sText( GetText( sToken, nToken ));
     592         666 :                 OString sLang;
     593         333 :                 if ( sToken.getToken(0, '=').indexOf('[') != -1 )
     594             :                 {
     595         478 :                     sLang = sToken.getToken(0, '=').getToken(1, '[').
     596         239 :                         getToken(0, ']');
     597         239 :                     CleanValue( sLang );
     598             :                 }
     599         666 :                 OString sLangIndex = sLang;
     600         666 :                 OString sOrigKey = sKey;
     601         333 :                 if ( !sText.isEmpty() && !sLang.isEmpty() )
     602             :                 {
     603         239 :                     sKey = sKey.toAsciiUpperCase();
     604         239 :                     if (sKey == "TEXT" || sKey == "MESSAGE"  || sKey == "CUSTOMUNITTEXT")
     605             :                     {
     606         239 :                         SetChildWithText();
     607         239 :                         if ( sLangIndex.equalsIgnoreAsciiCase("en-US") )
     608         239 :                             pResData->SetId( sText, ID_LEVEL_TEXT );
     609             : 
     610         239 :                         pResData->bText = true;
     611         239 :                         pResData->sTextTyp = sOrigKey;
     612         239 :                         if ( !bMergeMode )
     613             :                         {
     614           0 :                             pResData->sText[ sLangIndex ] = sText;
     615             :                         }
     616             :                     }
     617           0 :                     else if ( sKey == "QUICKHELPTEXT" ) {
     618           0 :                         SetChildWithText();
     619           0 :                         pResData->bQuickHelpText = true;
     620           0 :                         if ( !bMergeMode )
     621             :                         {
     622           0 :                             pResData->sQuickHelpText[ sLangIndex ] = sText;
     623             :                         }
     624             :                     }
     625           0 :                     else if ( sKey == "TITLE" ) {
     626           0 :                         SetChildWithText();
     627           0 :                         pResData->bTitle = true;
     628           0 :                         if ( !bMergeMode )
     629             :                         {
     630           0 :                             pResData->sTitle[ sLangIndex ] = sText;
     631             :                         }
     632             :                     }
     633         333 :                 }
     634             :             }
     635         333 :         break;
     636             :         case APPFONTMAPPING:
     637           4 :         break;
     638             :         case RSCDEFINELEND:
     639          48 :         break;
     640             :         case CONDITION: {
     641         105 :             if ( nLevel && pResData ) {
     642          59 :                 WriteData( pResData, true );
     643             :             }
     644             :         }
     645         105 :         break;
     646             :         case EMPTYLINE : {
     647         299 :             if ( bDefine ) {
     648         224 :                 bNextMustBeDefineEOL = false;
     649         224 :                 bDefine = false;
     650         678 :                 while ( nLevel )
     651         230 :                     Parse( LEVELDOWN, "" );
     652             :             }
     653             :         }
     654         299 :         break;
     655             :         case PRAGMA : {
     656           0 :             std::fprintf(stderr, "ERROR: archaic PRAGMA %s\n", sToken.getStr());
     657           0 :             std::exit(EXIT_FAILURE);
     658             :         }
     659             :         break;
     660             :         }
     661        3029 :     if ( bWriteToMerged ) {
     662             :         // the current token must be written to dest. without merging
     663             : 
     664        3029 :         if( bDefine && sOrig.getLength() > 2 ){
     665       47504 :             for( sal_uInt16 n = 0 ; n < sOrig.getLength() ; n++ ){
     666       46047 :                 if( sOrig[n] == '\n' && sOrig[n-1] != '\\'){
     667           0 :                     sOrig = sOrig.replaceAt(n++, 0, "\\");
     668             :                 }
     669             :             }
     670             :         }
     671        3029 :         WriteToMerged( sOrig , false);
     672             :     }
     673             : 
     674        3029 :     if ( bExecuteDown ) {
     675           0 :         Parse( LEVELDOWN, "" );
     676             :     }
     677             : 
     678       26871 :     return 1;
     679             : }
     680             : 
     681         333 : void Export::CutComment( OString &rText )
     682             : {
     683         333 :     if (rText.indexOf("//") != -1) {
     684           0 :         OString sWork(rText.replaceAll("\\\"", "XX"));
     685           0 :         bool bInner = false;
     686           0 :         for (sal_Int32 i = 0; i < sWork.getLength() - 1; ++i) {
     687           0 :             if (sWork[i] == '"') {
     688           0 :                 bInner = !bInner;
     689           0 :             } else if (sWork[i] == '/' && !bInner && sWork[i + 1] == '/' ) {
     690           0 :                 rText = rText.copy(0, i);
     691           0 :                 break;
     692             :             }
     693           0 :         }
     694             :     }
     695         333 : }
     696             : 
     697         735 : bool Export::WriteData( ResData *pResData, bool bCreateNew )
     698             : {
     699         735 :     if ( bMergeMode ) {
     700         735 :         MergeRest( pResData );
     701         735 :         return true;
     702             :     }
     703             : 
     704             :        // mandatory to export: en-US
     705             : 
     706           0 :      if (( !pResData->sText[ SOURCE_LANGUAGE ].isEmpty())
     707           0 :         ||
     708           0 :         (  !pResData->sQuickHelpText[ SOURCE_LANGUAGE ].isEmpty())
     709           0 :          ||
     710           0 :         (  !pResData->sTitle[ SOURCE_LANGUAGE ].isEmpty()))
     711             : 
     712             :        {
     713           0 :         OString sGID = pResData->sGId;
     714           0 :         OString sLID;
     715           0 :         if (sGID.isEmpty())
     716           0 :             sGID = pResData->sId;
     717             :         else
     718           0 :             sLID = pResData->sId;
     719             : 
     720           0 :         OString sXText = pResData->sText[ SOURCE_LANGUAGE ];
     721           0 :         OString sXHText = pResData->sText[ X_COMMENT ];
     722           0 :         OString sXQHText = pResData->sQuickHelpText[ SOURCE_LANGUAGE ];
     723           0 :         OString sXTitle = pResData->sTitle[ SOURCE_LANGUAGE ];
     724             : 
     725           0 :         if( !sXText.isEmpty() )
     726             :         {
     727           0 :             ConvertExportContent(sXText);
     728           0 :             ConvertExportContent(sXHText);
     729             :             common::writePoEntry(
     730             :                 "Transex3", *aOutput.mPo, global::inputPathname,
     731           0 :                 pResData->sResTyp, sGID, sLID, sXHText, sXText);
     732             :         }
     733           0 :         if( !sXQHText.isEmpty() )
     734             :         {
     735           0 :             ConvertExportContent(sXQHText);
     736             :             common::writePoEntry(
     737             :                 "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp,
     738           0 :                 sGID, sLID, OString(), sXQHText, PoEntry::TQUICKHELPTEXT );
     739             :         }
     740           0 :         if( !sXTitle.isEmpty() )
     741             :         {
     742           0 :             ConvertExportContent(sXTitle);
     743             :             common::writePoEntry(
     744             :                 "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp,
     745           0 :                 sGID, sLID, OString(), sXTitle, PoEntry::TTITLE );
     746             :         }
     747             : 
     748           0 :         if ( bCreateNew ) {
     749           0 :             pResData->sText[ SOURCE_LANGUAGE ]         = "";
     750           0 :             pResData->sQuickHelpText[ SOURCE_LANGUAGE ]= "";
     751           0 :             pResData->sTitle[ SOURCE_LANGUAGE ]        = "";
     752           0 :         }
     753             :     }
     754             : 
     755           0 :     if( nList )
     756             :     {
     757           0 :         WriteExportList( pResData, pResData->m_aList, nList );
     758           0 :         if ( bCreateNew )
     759           0 :             pResData->m_aList.clear();
     760             :     }
     761           0 :     return true;
     762             : }
     763             : 
     764           0 : OString Export::GetPairedListID(const OString& rText)
     765             : {
     766             : // < "STRING" ; IDENTIFIER ; > ;
     767           0 :     return rText.getToken(1, ';').toAsciiUpperCase().replace('\t', ' ').trim();
     768             : }
     769             : 
     770           0 : OString Export::GetPairedListString(const OString& rText)
     771             : {
     772             : // < "STRING" ; IDENTIFIER ; > ;
     773           0 :     OString sString(rText.getToken(0, ';').replace('\t', ' '));
     774           0 :     sString = sString.trim();
     775           0 :     OString s1(sString.copy(sString.indexOf('"') + 1));
     776           0 :     sString = s1.copy(0, s1.lastIndexOf('"'));
     777           0 :     return sString.trim();
     778             : }
     779             : 
     780           0 : OString Export::StripList(const OString & rText)
     781             : {
     782           0 :     OString s1 = rText.copy( rText.indexOf('\"') + 1);
     783           0 :     return s1.copy( 0 , s1.lastIndexOf('\"'));
     784             : }
     785             : 
     786           0 : bool Export::WriteExportList(ResData *pResData, ExportList& rExportList,
     787             :     const sal_uInt16 nTyp)
     788             : {
     789           0 :     OString sGID(pResData->sGId);
     790           0 :     if (sGID.isEmpty())
     791           0 :         sGID = pResData->sId;
     792             :     else {
     793           0 :         sGID += ".";
     794           0 :         sGID += pResData->sId;
     795           0 :         while (sGID.endsWith(".")) {
     796           0 :             sGID = sGID.copy(0, sGID.getLength() - 1);
     797             :         }
     798             :     }
     799             : 
     800           0 :     for ( size_t i = 0; i < rExportList.size(); i++ )
     801             :     {
     802           0 :         OString sLID;
     803           0 :         OString sText(rExportList[ i ]);
     804             : 
     805             :         // Strip PairList Line String
     806           0 :         if (nTyp == LIST_PAIRED)
     807             :         {
     808           0 :             sLID = GetPairedListID( sText );
     809           0 :             sText = GetPairedListString( sText );
     810             :         }
     811             :         else
     812             :         {
     813           0 :             sText = StripList( sText );
     814           0 :             if( sText == "\\\"" )
     815           0 :                 sText = "\"";
     816             :         }
     817           0 :         ConvertExportContent(sText);
     818             : 
     819           0 :         if (nTyp != LIST_PAIRED)
     820           0 :             sLID = sText;
     821             : 
     822           0 :         OString sType = lcl_GetListTyp( nList, false );
     823             : 
     824             :         common::writePoEntry(
     825             :             "Transex3", *aOutput.mPo, global::inputPathname,
     826           0 :             sType, sGID, sLID, OString(), sText);
     827           0 :     }
     828             : 
     829           0 :     return true;
     830             : }
     831             : 
     832         676 : OString Export::FullId()
     833             : {
     834         676 :     OStringBuffer sFull;
     835         676 :     if ( nLevel > 1 )
     836             :     {
     837         429 :         sFull.append(aResStack[ 0 ]->sId);
     838         825 :         for ( size_t i = 1; i < nLevel - 1; ++i )
     839             :         {
     840         396 :             OString sToAdd = aResStack[ i ]->sId;
     841         396 :             if (!sToAdd.isEmpty())
     842         106 :                 sFull.append('.').append(sToAdd);
     843         396 :         }
     844             :     }
     845         676 :     if (sFull.getLength() > 255)
     846             :     {
     847           0 :         OString sError("GroupId > 255 chars");
     848           0 :         printf("GroupID = %s\n", sFull.getStr());
     849           0 :         yyerror(sError.getStr());
     850             :     }
     851             : 
     852         676 :     return sFull.makeStringAndClear();
     853             : }
     854             : 
     855           0 : void Export::InsertListEntry(const OString &rLine)
     856             : {
     857           0 :     ResData *pResData = ( nLevel-1 < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL;
     858             : 
     859           0 :     if (!pResData)
     860           0 :         std::exit(EXIT_FAILURE);
     861             : 
     862           0 :     if( pResData->m_aList.empty() )
     863           0 :         nListIndex = 0;
     864             : 
     865           0 :     pResData->m_aList.push_back(rLine);
     866           0 : }
     867             : 
     868        1713 : void Export::CleanValue( OString &rValue )
     869             : {
     870        4527 :     while ( !rValue.isEmpty()) {
     871        2788 :         if (( rValue[0] == ' ' ) || ( rValue[0] == '\t' ))
     872        1101 :             rValue = rValue.copy( 1 );
     873             :         else
     874        1687 :             break;
     875             :     }
     876             : 
     877        1713 :     if ( !rValue.isEmpty()) {
     878        7005 :         for ( sal_Int32 i = rValue.getLength() - 1; i > 0; i-- ) {
     879       22598 :             if (( rValue[i] == ' ' ) || ( rValue[i] == '\t' ) ||
     880       11094 :                 ( rValue[i] == '\n' ) || ( rValue[i] == ';' ) ||
     881       14286 :                 ( rValue[i] == '{' ) || ( rValue[i] == '\\' ) ||
     882        1673 :                 ( rValue[i] == '\r' ))
     883        5318 :                 rValue = rValue.copy(0, i);
     884             :             else
     885        1673 :                 break;
     886             :         }
     887             :     }
     888        1713 : }
     889             : 
     890             : #define TXT_STATE_TEXT  0x001
     891             : #define TXT_STATE_MACRO 0x002
     892             : 
     893         333 : OString Export::GetText(const OString &rSource, int nToken)
     894             : {
     895         333 :     OString sReturn;
     896         333 :     switch ( nToken )
     897             :     {
     898             :         case TEXTLINE:
     899             :         case LONGTEXTLINE:
     900             :         {
     901         333 :             OString sTmp(rSource.copy(rSource.indexOf('=')));
     902         333 :             CleanValue( sTmp );
     903         666 :             sTmp = sTmp.replaceAll("\n", OString()).
     904             :                 replaceAll("\r", OString()).
     905             :                 replaceAll("\\\\\"", "-=<[BSlashBSlashHKom]>=-\"").
     906             :                 replaceAll("\\\"", "-=<[Hochkomma]>=-").
     907             :                 replaceAll("\\", "-=<[0x7F]>=-").
     908         333 :                 replaceAll("\\0x7F", "-=<[0x7F]>=-");
     909             : 
     910         333 :             sal_uInt16 nState = TXT_STATE_TEXT;
     911         999 :             for (sal_Int32 i = 1; i <= lcl_countOccurrences(sTmp, '"'); ++i)
     912             :             {
     913         666 :                 OString sToken(sTmp.getToken(i, '"'));
     914         666 :                 if (!sToken.isEmpty()) {
     915         333 :                     if ( nState == TXT_STATE_TEXT ) {
     916         333 :                         sReturn += sToken;
     917         333 :                         nState = TXT_STATE_MACRO;
     918             :                     }
     919             :                     else {
     920           0 :                         sToken = sToken.replace('\t', ' ');
     921             :                         for (;;) {
     922           0 :                             sal_Int32 n = 0;
     923           0 :                             sToken = sToken.replaceFirst("  ", " ", &n);
     924           0 :                             if (n == -1) {
     925           0 :                                 break;
     926             :                             }
     927           0 :                         }
     928           0 :                         sToken = sToken.trim();
     929           0 :                         if (!sToken.isEmpty()) {
     930           0 :                             sReturn += "\\\" ";
     931           0 :                             sReturn += sToken;
     932           0 :                             sReturn += " \\\"";
     933             :                         }
     934           0 :                         nState = TXT_STATE_TEXT;
     935             :                     }
     936             :                 }
     937         666 :             }
     938             : 
     939         666 :             sReturn = sReturn.replaceAll("-=<[0x7F]>=-", "").
     940             :                 replaceAll("-=<[Hochkomma]>=-", "\"").
     941             :                 replaceAll("-=<[BSlashBSlashHKom]>=-", "\\\\").
     942             :                 replaceAll("\\\\", "-=<[BSlashBSlash]>=-").
     943         666 :                 replaceAll("-=<[BSlashBSlash]>=-", "\\");
     944             :         }
     945         333 :         break;
     946             :     }
     947         333 :     return sReturn;
     948             : }
     949             : 
     950       23842 : void Export::WriteToMerged(const OString &rText , bool bSDFContent)
     951             : {
     952       23842 :     OString sText(rText);
     953             :     for (;;) {
     954       23842 :         sal_Int32 n = 0;
     955       23842 :         sText = sText.replaceFirst(" \n", "\n", &n);
     956       23842 :         if (n == -1) {
     957       23842 :             break;
     958             :         }
     959           0 :     }
     960       27020 :     if (pParseQueue->bNextIsM && bSDFContent && sText.getLength() > 2) {
     961           0 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
     962           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     963           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     964             :             }
     965             :         }
     966       23842 :     } else if (pParseQueue->bLastWasM && sText.getLength() > 2) {
     967       42833 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
     968       41137 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     969           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     970             :             }
     971       41137 :             if (sText[n] == '\n') {
     972         464 :                 pParseQueue->bMflag = true;
     973             :             }
     974             :         }
     975       22146 :     } else if (pParseQueue->bCurrentIsM && bSDFContent && sText.getLength() > 2)
     976             :     {
     977           0 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
     978           0 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     979           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     980           0 :                 pParseQueue->bMflag = true;
     981             :             }
     982             :         }
     983       22146 :     } else if (pParseQueue->bMflag) {
     984        1940 :         for (sal_Int32 n = 1; n < sText.getLength(); ++n) {
     985         600 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     986           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     987             :             }
     988             :         }
     989      125354 :     } for (sal_Int32 i = 0; i < sText.getLength(); ++i) {
     990      101512 :         if (sText[i] == '\n') {
     991        3948 :             *aOutput.mSimple << '\n';
     992             :         } else {
     993       97564 :             char cChar = sText[i];
     994       97564 :             *aOutput.mSimple << cChar;
     995             :         }
     996       23842 :     }
     997       23842 : }
     998             : 
     999           0 : void Export::ConvertMergeContent( OString &rText )
    1000             : {
    1001           0 :     rText = rText.replaceAll("\\\'","\'"); // Temporary: until PO files contain escaped single quotes
    1002             :                                             // (Maybe next PO update solve this)
    1003           0 :     rText =
    1004             :         helper::escapeAll(
    1005             :             rText.replaceAll("","\\0x7F"),
    1006           0 :             "\n""\t""\\""\"","\\n""\\t""\\\\""\\\"");
    1007             : 
    1008           0 :     rText = "\"" + rText + "\"";
    1009           0 : }
    1010             : 
    1011           0 : void Export::ConvertExportContent( OString& rText )
    1012             : {
    1013           0 :     rText = helper::unEscapeAll(rText,"\\n""\\t""\\\\""\\\"","\n""\t""\\""\"");
    1014           0 : }
    1015             : 
    1016           0 : void Export::ResData2Output( MergeEntrys *pEntry, sal_uInt16 nType, const OString& rTextType )
    1017             : {
    1018           0 :     bool bAddSemicolon = false;
    1019           0 :     bool bFirst = true;
    1020           0 :     OString sCur;
    1021             : 
    1022           0 :     for( unsigned int n = 0; n < aLanguages.size(); n++ ){
    1023           0 :         sCur = aLanguages[ n ];
    1024             : 
    1025           0 :         OString sText;
    1026           0 :         bool bText = pEntry->GetText( sText, nType, sCur , true );
    1027           0 :         if ( bText && !sText.isEmpty() ) {
    1028           0 :             OStringBuffer sOutput;
    1029           0 :             if ( bNextMustBeDefineEOL)  {
    1030           0 :                 if ( bFirst )
    1031           0 :                     sOutput.append("\t\\\n");
    1032             :                 else
    1033           0 :                     sOutput.append(";\t\\\n");
    1034             :             }
    1035           0 :             bFirst=false;
    1036           0 :             sOutput.append("\t" + rTextType);
    1037             : 
    1038           0 :             if ( !sCur.equalsIgnoreAsciiCase("en-US") ) {
    1039           0 :                 sOutput.append("[ " + sCur + " ] ");
    1040             :             }
    1041             : 
    1042           0 :             ConvertMergeContent( sText );
    1043           0 :             sOutput.append("= " + sText);
    1044             : 
    1045           0 :             if ( bDefine )
    1046           0 :                 sOutput.append(";\\\n");
    1047           0 :             else if ( !bNextMustBeDefineEOL )
    1048           0 :                 sOutput.append(";\n");
    1049             :             else
    1050           0 :                 bAddSemicolon = true;
    1051           0 :             for ( sal_uInt16 j = 1; j < nLevel; j++ )
    1052           0 :                 sOutput.append("\t");
    1053           0 :             WriteToMerged( sOutput.makeStringAndClear() , true );
    1054             :         }
    1055           0 :     }
    1056             : 
    1057             : 
    1058           0 :     if ( bAddSemicolon ) {
    1059           0 :         WriteToMerged( ";" , false );
    1060           0 :     }
    1061           0 : }
    1062             : 
    1063         735 : void Export::MergeRest( ResData *pResData )
    1064             : {
    1065         735 :     if ( !pMergeDataFile ){
    1066           8 :         pMergeDataFile = new MergeDataFile( sMergeSrc, global::inputPathname, true );
    1067           8 :         aLanguages = pMergeDataFile->GetLanguages();
    1068             : 
    1069             :     }
    1070             : 
    1071         735 :     MergeEntrys *pEntry = 0;
    1072         735 :     if( pResData->bText || pResData->bQuickHelpText || pResData->bTitle )
    1073         239 :         pEntry = pMergeDataFile->GetMergeEntrysCaseSensitive( pResData );
    1074             : 
    1075         735 :     if ( pEntry )
    1076             :     {
    1077           0 :         if ( pResData->bText )
    1078           0 :             ResData2Output( pEntry, STRING_TYP_TEXT, pResData->sTextTyp );
    1079             : 
    1080           0 :         if ( pResData->bQuickHelpText )
    1081           0 :             ResData2Output( pEntry, STRING_TYP_QUICKHELPTEXT, OString("QuickHelpText") );
    1082             : 
    1083           0 :         if ( pResData->bTitle )
    1084           0 :             ResData2Output( pEntry, STRING_TYP_TITLE, OString("Title") );
    1085             :     }
    1086             : 
    1087             :     // Merge Lists
    1088         735 :     if ( nList )
    1089             :     {
    1090           0 :         OString sOldId = pResData->sId;
    1091           0 :         OString sOldGId = pResData->sGId;
    1092           0 :         OString sOldTyp = pResData->sResTyp;
    1093             : 
    1094             :         // Set pResData so we can find the corresponding string
    1095           0 :         if (!pResData->sGId.isEmpty())
    1096           0 :             pResData->sGId = pResData->sGId + OString('.');
    1097           0 :         pResData->sGId = pResData->sGId + pResData->sId;
    1098             : 
    1099           0 :         pResData->sResTyp = lcl_GetListTyp( nList, false );
    1100             : 
    1101           0 :         OString sSpace;
    1102           0 :         for ( sal_uInt16 i = 1; i < nLevel-1; i++ )
    1103           0 :             sSpace += "\t";
    1104             : 
    1105           0 :         OString sCur;
    1106           0 :         for( unsigned int n = 0; n < aLanguages.size(); n++ )
    1107             :         {
    1108           0 :             sCur = aLanguages[ n ];
    1109             : 
    1110           0 :             sal_uInt16 nLIndex = 0;
    1111           0 :             sal_uInt16 nMaxIndex = pResData->m_aList.size();
    1112           0 :             while( nLIndex < nMaxIndex )
    1113             :             {
    1114           0 :                 if ( nLIndex == 0 )
    1115             :                 {
    1116           0 :                     OStringBuffer sHead;
    1117           0 :                     if ( bNextMustBeDefineEOL )
    1118           0 :                         sHead.append("\\\n\t");
    1119           0 :                     sHead.append(sSpace + lcl_GetListTyp( nList, true ) + " [ " + sCur + " ] ");
    1120             : 
    1121           0 :                     if ( bDefine || bNextMustBeDefineEOL )
    1122             :                     {
    1123           0 :                         sHead.append("= \\\n" + sSpace + "\t{\\\n\t");
    1124             :                     }
    1125             :                     else
    1126             :                     {
    1127           0 :                         sHead.append("= \n" + sSpace + "\t{\n\t");
    1128             :                     }
    1129           0 :                     WriteToMerged(sHead.makeStringAndClear() , true);
    1130             :                 }
    1131             : 
    1132           0 :                 OString sLine = pResData->m_aList[ nLIndex ];
    1133           0 :                 if ( sLine.indexOf( '>' ) != -1 )
    1134             :                 {
    1135           0 :                     if ((( sLine.indexOf( '{' ) == -1 ) ||
    1136           0 :                         ( sLine.indexOf( '{' ) >= sLine.indexOf( '"' ))) &&
    1137           0 :                         (( sLine.indexOf( '<' ) == -1 ) ||
    1138           0 :                         ( sLine.indexOf( '<' ) >= sLine.indexOf( '"' ))))
    1139             :                     {
    1140           0 :                         sLine = sLine.replaceFirst("\"", "< \"" );
    1141             :                     }
    1142             :                 }
    1143             : 
    1144             :                 // Set matching identifier
    1145           0 :                 if ( nList == LIST_PAIRED )
    1146             :                 {
    1147           0 :                     pResData->sId = GetPairedListID ( sLine );
    1148             :                 }
    1149             :                 else
    1150             :                 {
    1151           0 :                     pResData->sId =
    1152             :                         sLine.copy(
    1153           0 :                         sLine.indexOf('"')+1,
    1154           0 :                         sLine.lastIndexOf('"')-sLine.indexOf('"')-1);
    1155           0 :                     ConvertExportContent( pResData->sId );
    1156             :                 }
    1157             : 
    1158           0 :                 MergeEntrys* pEntrys = pMergeDataFile->GetMergeEntrysCaseSensitive( pResData );
    1159           0 :                 OString sText;
    1160           0 :                 bool bText = pEntrys && pEntrys->GetText( sText, STRING_TYP_TEXT, sCur, true );
    1161             : 
    1162           0 :                 if( bText && !sText.isEmpty())
    1163             :                 {
    1164           0 :                     ConvertMergeContent( sText );
    1165           0 :                     sLine =
    1166           0 :                         sLine.copy( 0 , sLine.indexOf('"') ) +
    1167           0 :                         sText +
    1168           0 :                         sLine.copy( sLine.lastIndexOf('"') + 1 );
    1169             :                 }
    1170             : 
    1171           0 :                 OString sText1( "\t" );
    1172           0 :                 sText1 += sLine;
    1173           0 :                 if ( bDefine || bNextMustBeDefineEOL )
    1174           0 :                     sText1 += " ;\\\n";
    1175             :                 else
    1176           0 :                     sText1 += " ;\n";
    1177           0 :                 sText1 += sSpace;
    1178           0 :                 sText1 += "\t";
    1179           0 :                 WriteToMerged( sText1 ,true );
    1180           0 :                 ++nLIndex;
    1181           0 :             }
    1182             : 
    1183           0 :             if ( nLIndex > 0 )
    1184             :             {
    1185           0 :                 OString sFooter;
    1186           0 :                 if (!sSpace.isEmpty())
    1187           0 :                     sFooter = sSpace.copy(1);
    1188             : 
    1189           0 :                 if ( bNextMustBeDefineEOL )
    1190           0 :                     sFooter += "};";
    1191           0 :                 else if ( !bDefine )
    1192           0 :                     sFooter += "};\n\t";
    1193             :                 else
    1194           0 :                     sFooter += "\n\n";
    1195           0 :                 WriteToMerged( sFooter ,true );
    1196             :             }
    1197             :         }
    1198           0 :         pResData->sId = sOldId;
    1199           0 :         pResData->sGId = sOldGId;
    1200           0 :         pResData->sResTyp = sOldTyp;
    1201             :     }
    1202         735 :     pParseQueue->bMflag = false;
    1203         735 : }
    1204             : 
    1205         239 : void Export::SetChildWithText()
    1206             : {
    1207         239 :     if ( aResStack.size() > 1 ) {
    1208         530 :         for ( size_t i = 0; i < aResStack.size() - 1; i++ ) {
    1209         355 :             aResStack[ i ]->bChildWithText = true;
    1210             :         }
    1211             :     }
    1212         239 : }
    1213             : 
    1214       23593 : void ParserQueue::Push( const QueueEntry& aEntry )
    1215             : {
    1216       23593 :     sal_Int32 nLen = aEntry.sLine.getLength();
    1217             : 
    1218       23593 :     if( !bStart ){
    1219       18415 :         aQueueCur->push( aEntry );
    1220       18415 :         if( nLen > 1 && aEntry.sLine[nLen-1] == '\n' )
    1221           6 :             bStart = true;
    1222       18409 :         else if ( aEntry.nTyp != IGNOREDTOKENS ){
    1223       15534 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1224             :                 // Next is Macro
    1225         289 :                 bCurrentIsM = true;
    1226             :              }else{
    1227             :                 // Next is no Macro
    1228       15245 :                 bCurrentIsM = false;
    1229             :              }
    1230             :         }
    1231             :     }
    1232             :     else{
    1233        5178 :         aQueueNext->push( aEntry );
    1234        5178 :         if( nLen > 1 && aEntry.sLine[nLen-1] != '\n' ){
    1235        1864 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1236             :                 // Next is Macro
    1237         879 :                 bNextIsM = true;
    1238             :             }
    1239             :             else{
    1240             :                 // Next is no Macro
    1241         985 :                 bNextIsM = false;
    1242             :             }
    1243        3314 :         }else if( nLen > 2 && aEntry.sLine[nLen-1] == '\n' ){
    1244         327 :             if( aEntry.nTyp != IGNOREDTOKENS ){
    1245         327 :                 if( nLen > 2 && ( aEntry.sLine[nLen-2] == '\\') ){
    1246             :                     // Next is Macro
    1247         308 :                     bNextIsM = true;
    1248             :                 }
    1249             :                 else{
    1250             :                     // Next is no Macro
    1251          19 :                     bNextIsM = false;
    1252             :                 }
    1253             :             }
    1254             :             // Pop current
    1255         327 :             Pop( *aQueueCur );
    1256         327 :             bLastWasM = bCurrentIsM;
    1257             :             // next -> current
    1258         327 :             bCurrentIsM = bNextIsM;
    1259         327 :             std::queue<QueueEntry>* aQref = aQueueCur;
    1260         327 :             aQueueCur = aQueueNext;
    1261         327 :             aQueueNext = aQref;
    1262             : 
    1263             :         }
    1264             : 
    1265             :         else{
    1266             :             // Pop current
    1267        2987 :             Pop( *aQueueCur );
    1268        2987 :             bLastWasM = bCurrentIsM;
    1269             :             // next -> current
    1270        2987 :             bCurrentIsM = bNextIsM;
    1271        2987 :             std::queue<QueueEntry>* aQref = aQueueCur;
    1272        2987 :             aQueueCur = aQueueNext;
    1273        2987 :             aQueueNext = aQref;
    1274             :         }
    1275             :     }
    1276       23593 : }
    1277             : 
    1278           8 : void ParserQueue::Close(){
    1279             :     // Pop current
    1280           8 :     Pop( *aQueueCur );
    1281             :     // next -> current
    1282           8 :     bLastWasM = bCurrentIsM;
    1283           8 :     bCurrentIsM = bNextIsM;
    1284           8 :     std::queue<QueueEntry>* aQref = aQueueCur;
    1285           8 :     aQueueCur = aQueueNext;
    1286           8 :     aQueueNext = aQref;
    1287           8 :     bNextIsM = false;
    1288           8 :     Pop( *aQueueNext );
    1289           8 : };
    1290             : 
    1291        3330 : void ParserQueue::Pop( std::queue<QueueEntry>& aQueue )
    1292             : {
    1293       30253 :     while (!aQueue.empty())
    1294             :     {
    1295       23593 :         QueueEntry aEntry = aQueue.front();
    1296       23593 :         aQueue.pop();
    1297       23593 :         aExport.Execute(aEntry.nTyp, aEntry.sLine.getStr());
    1298       23593 :     }
    1299        3330 : }
    1300             : 
    1301           8 : ParserQueue::ParserQueue( Export& aExportObj )
    1302             :         :
    1303             :           bCurrentIsM( false ),
    1304             :           bNextIsM( false ) ,
    1305             :           bLastWasM( false ),
    1306             :           bMflag( false ) ,
    1307             :           aExport( aExportObj ) ,
    1308           8 :           bStart( false )
    1309             : {
    1310           8 :           aQueueNext = new std::queue<QueueEntry>;
    1311           8 :           aQueueCur  = new std::queue<QueueEntry>;
    1312           8 : }
    1313             : 
    1314             : 
    1315           8 : ParserQueue::~ParserQueue(){
    1316           8 :     if( aQueueNext )    delete aQueueNext;
    1317           8 :     if( aQueueCur )     delete aQueueCur;
    1318          32 : }
    1319             : 
    1320             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10