LCOV - code coverage report
Current view: top level - l10ntools/source - export.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 388 728 53.3 %
Date: 2015-06-13 12:38:46 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         231 : int Parse( int nTyp, const char *pTokenText ){
     108         231 :     global::exporter->Execute( nTyp , pTokenText );
     109         231 :     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       22179 : int WorkOnTokenSet( int nTyp, char *pTokenText )
     120             : {
     121       22179 :     global::exporter->GetParseQueue()->Push( QueueEntry( nTyp , OString(pTokenText) ) );
     122       22179 :     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         803 : bool ResData::SetId( const OString& rId, sal_uInt16 nLevel )
     147             : {
     148         803 :     if ( nLevel > nIdLevel )
     149             :     {
     150         503 :         nIdLevel = nLevel;
     151         503 :         sId = rId;
     152             : 
     153         503 :         if ( bChild && bChildWithText )
     154             :         {
     155           0 :             OString sError("ResId after child definition");
     156           0 :             yyerror(sError.getStr());
     157           0 :             SetError();
     158             :         }
     159             : 
     160         503 :         if ( sId.getLength() > 255 )
     161             :         {
     162           0 :             YYWarning( "LocalId > 255 chars, truncating..." );
     163           0 :             sId = sId.copy(0, 255).trim();
     164             :         }
     165             : 
     166         503 :         return true;
     167             :     }
     168             : 
     169         300 :     return false;
     170             : }
     171             : 
     172             : 
     173             : // class Export
     174             : 
     175             : 
     176             : namespace
     177             : {
     178             : 
     179         942 : static sal_Int32 lcl_countOccurrences(const OString& text, char c)
     180             : {
     181         942 :     sal_Int32 n = 0;
     182        2826 :     for (sal_Int32 i = 0;; ++i) {
     183        2826 :         i = text.indexOf(c, i);
     184        2826 :         if (i == -1) {
     185         942 :             break;
     186             :         }
     187        1884 :         ++n;
     188        1884 :     }
     189         942 :     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       22429 : int Export::Execute( int nToken, const char * pToken )
     286             : {
     287             : 
     288       22429 :     OString sToken( pToken );
     289       44858 :     OString sOrig( sToken );
     290             : 
     291       22429 :     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       61285 :     if ((( nToken < FILTER_LEVEL ) || ( bReadOver )) &&
     302       19428 :         (!(( bNextMustBeDefineEOL ) && ( sOrig == "\n" )))) {
     303             :         // this tokens are not mandatory for parsing, so ignore them ...
     304       19428 :         if ( bMergeMode )
     305       19428 :             WriteToMerged( sOrig , false ); // ... or write them directly to dest.
     306       19428 :         return 0;
     307             :     }
     308             : 
     309        3001 :     ResData *pResData = NULL;
     310        3001 :     if ( nLevel ) {
     311             :         // res. exists at cur. level
     312        2613 :         pResData = ( (nLevel-1) < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL;
     313             :     }
     314         388 :     else if (( nToken != RESOURCE ) &&
     315         365 :             ( nToken != RESOURCEEXPR ) &&
     316         365 :             ( nToken != SMALRESOURCE ) &&
     317         365 :             ( nToken != LEVELUP ) &&
     318         358 :             ( 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        2914 :     if ( bDefine ) {
     330        1574 :         if (( nToken != EMPTYLINE ) && ( nToken != LEVELDOWN ) && ( nToken != LEVELUP )) {
     331             :             // cur. res. defined in macro
     332        1111 :             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        2914 :     bool bExecuteDown = false;
     351        2914 :     if ( nToken != LEVELDOWN ) {
     352        2262 :         sal_uInt16 nOpen = 0;
     353        2262 :         sal_uInt16 nClose = 0;
     354        2262 :         bool bReadOver1 = false;
     355        2262 :         sal_uInt16 i = 0;
     356       61393 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     357       59131 :             if ( sToken[i] == '"' )
     358         628 :                 bReadOver1 = !bReadOver1;
     359       59131 :             if ( !bReadOver1 && ( sToken[i] == '{' ))
     360         423 :                 nOpen++;
     361             :         }
     362             : 
     363        2262 :         bReadOver1 = false;
     364       61393 :         for ( i = 0; i < sToken.getLength(); i++ ) {
     365       59131 :             if ( sToken[i] == '"' )
     366         628 :                 bReadOver1 = !bReadOver1;
     367       59131 :             if ( !bReadOver1 && ( sToken[i] == '}' ))
     368           2 :                 nClose++;
     369             :         }
     370             : 
     371        2262 :         if ( nOpen < nClose )
     372           0 :             bExecuteDown = true;
     373             :     }
     374             : 
     375        2914 :     bool bWriteToMerged = bMergeMode;
     376        2914 :     switch ( nToken ) {
     377             : 
     378             :         case NORMDEFINE:
     379           7 :             if ( bMergeMode )
     380           7 :                 WriteToMerged( sOrig , false );
     381           7 :             return 0;
     382             :         case RSCDEFINE:
     383         231 :             bDefine = true; // res. defined in macro
     384             : 
     385             :         case RESOURCE:
     386             :         case RESOURCEEXPR: {
     387         254 :             if ( nToken != RSCDEFINE )
     388          23 :                 bNextMustBeDefineEOL = false;
     389             :             // this is the beginning of a new res.
     390         254 :             nLevel++;
     391         254 :             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         254 :             pResData = new ResData( FullId() , sFilename );
     398         254 :             aResStack.push_back( pResData );
     399         508 :             sToken = sToken.replaceAll("\n", OString()).
     400             :                 replaceAll("\r", OString()).
     401         254 :                 replaceAll("{", OString()).replace('\t', ' ');
     402         254 :             sToken = sToken.trim();
     403         254 :             OString sTLower = sToken.getToken(0, ' ').toAsciiLowerCase();
     404         254 :             pResData->sResTyp = sTLower;
     405         508 :             OString sId( sToken.copy( pResData->sResTyp.getLength() + 1 ));
     406         508 :             OString sCondition;
     407         254 :             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         254 :             sId = sId.getToken(0, '/');
     416         254 :             CleanValue( sId );
     417         254 :             sId = sId.replaceAll("\t", OString());
     418         254 :             pResData->SetId( sId, ID_LEVEL_IDENTIFIER );
     419         254 :             if (!sCondition.isEmpty())
     420             :             {
     421          19 :                 Execute( CONDITION, "");  // execute the precomp. condition
     422         254 :             }
     423             :         }
     424         254 :         break;
     425             :         case SMALRESOURCE: {
     426             :             // this is the beginning of a new res.
     427         345 :             bNextMustBeDefineEOL = false;
     428         345 :             nLevel++;
     429         345 :             if ( nLevel > 1 ) {
     430         345 :                 aResStack[ nLevel - 2 ]->bChild = true;
     431             :             }
     432             : 
     433             :             // create new instance for this res. and fill mandatory fields
     434             : 
     435         345 :             pResData = new ResData( FullId() , sFilename );
     436         345 :             aResStack.push_back( pResData );
     437         690 :             sToken = sToken.replaceAll("\n", OString()).
     438             :                 replaceAll("\r", OString()).
     439             :                 replaceAll("{", OString()).
     440             :                 replaceAll("\t", OString()).
     441             :                 replaceAll(" ", OString()).
     442         345 :                 replaceAll("\\", OString()).toAsciiLowerCase();
     443         345 :             pResData->sResTyp = sToken;
     444             :         }
     445         345 :         break;
     446             :         case LEVELUP: {
     447             :             // push
     448          53 :             if ( nList )
     449             :             {
     450           0 :                 nListLevel++;
     451           0 :                 break;
     452             :             }
     453             : 
     454          53 :             OString sLowerTyp;
     455          53 :             if ( pResData )
     456          53 :                 sLowerTyp = "unknown";
     457          53 :             nLevel++;
     458          53 :             if ( nLevel > 1 ) {
     459          53 :                 aResStack[ nLevel - 2 ]->bChild = true;
     460             :             }
     461             : 
     462          53 :             ResData *pNewData = new ResData( FullId() , sFilename );
     463          53 :             pNewData->sResTyp = sLowerTyp;
     464          53 :             aResStack.push_back( pNewData );
     465             :         }
     466          53 :         break;
     467             :         case LEVELDOWN: {
     468             :             // pop
     469         652 :             if ( !nList || !nListLevel ) {
     470         652 :                 if ( nLevel ) {
     471         652 :                     if ( bDefine && (nLevel == 1 )) {
     472           0 :                         bDefine = false;
     473           0 :                         bNextMustBeDefineEOL = false;
     474             :                     }
     475         652 :                     WriteData( pResData );
     476         652 :                     ResStack::iterator it = aResStack.begin();
     477         652 :                     ::std::advance( it, nLevel-1 );
     478         652 :                     delete *it;
     479         652 :                     aResStack.erase( it );
     480         652 :                     nLevel--;
     481             :                 }
     482         652 :                 if( nList )
     483             :                 {
     484           0 :                     nList = LIST_NON;
     485           0 :                     nListLevel = 1;
     486         652 :                 }
     487             :             }
     488             :             else
     489             :             {
     490           0 :                 if ( bDefine )
     491           0 :                     bNextMustBeDefineEOL = true;
     492           0 :                 nListLevel--;
     493             :             }
     494             :         }
     495         652 :         break;
     496             :         case ASSIGNMENT:
     497             :         {
     498             :             // interpret different types of assignement
     499         841 :             sal_Int32 n = 0;
     500             :             OString sKey = sToken.getToken(0, '=', n).
     501             :                 replaceAll(" ", OString()).
     502         841 :                 replaceAll("\t", OString());
     503        1682 :             OString sValue = sToken.getToken(0, '=', n);
     504         841 :             CleanValue( sValue );
     505         841 :             sKey = sKey.toAsciiUpperCase();
     506         841 :             if (sKey == "IDENTIFIER")
     507             :             {
     508             :                 OString sId(
     509             :                     sValue.replaceAll("\t", OString()).
     510         327 :                     replaceAll(" ", OString()));
     511         327 :                 pResData->SetId(sId, ID_LEVEL_IDENTIFIER);
     512             :             }
     513         514 :             else if (sKey =="STRINGLIST")
     514             :             {
     515           0 :                 nList = LIST_STRING;
     516           0 :                 nListIndex = 0;
     517           0 :                 nListLevel = 1;
     518             :             }
     519         514 :             else if (sKey == "FILTERLIST")
     520             :             {
     521           0 :                 nList = LIST_FILTER;
     522           0 :                 nListIndex = 0;
     523           0 :                 nListLevel = 1;
     524             :             }
     525        1682 :             if (sToken.indexOf( '{' ) != -1
     526         841 :                 && (lcl_countOccurrences(sToken, '{')
     527           0 :                     > lcl_countOccurrences(sToken, '}')))
     528             :             {
     529           0 :                 Parse( LEVELUP, "" );
     530         841 :             }
     531             :          }
     532         841 :         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         314 :             if ( nLevel )
     583             :             {
     584         314 :                 CutComment( sToken );
     585             : 
     586             :                 // this is a text line!!!
     587         314 :                 OString t(sToken.getToken(0, '='));
     588             :                 OString sKey(
     589             :                     t.getToken(0, '[').replaceAll(" ", OString()).
     590         628 :                     replaceAll("\t", OString()));
     591         628 :                 OString sText( GetText( sToken, nToken ));
     592         628 :                 OString sLang;
     593         314 :                 if ( sToken.getToken(0, '=').indexOf('[') != -1 )
     594             :                 {
     595         444 :                     sLang = sToken.getToken(0, '=').getToken(1, '[').
     596         222 :                         getToken(0, ']');
     597         222 :                     CleanValue( sLang );
     598             :                 }
     599         628 :                 OString sLangIndex = sLang;
     600         628 :                 OString sOrigKey = sKey;
     601         314 :                 if ( !sText.isEmpty() && !sLang.isEmpty() )
     602             :                 {
     603         222 :                     sKey = sKey.toAsciiUpperCase();
     604         222 :                     if (sKey == "TEXT" || sKey == "MESSAGE"  || sKey == "CUSTOMUNITTEXT")
     605             :                     {
     606         222 :                         SetChildWithText();
     607         222 :                         if ( sLangIndex.equalsIgnoreAsciiCase("en-US") )
     608         222 :                             pResData->SetId( sText, ID_LEVEL_TEXT );
     609             : 
     610         222 :                         pResData->bText = true;
     611         222 :                         pResData->sTextTyp = sOrigKey;
     612         222 :                         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         314 :                 }
     634             :             }
     635         314 :         break;
     636             :         case APPFONTMAPPING:
     637           4 :         break;
     638             :         case RSCDEFINELEND:
     639          51 :         break;
     640             :         case CONDITION: {
     641         105 :             if ( nLevel && pResData ) {
     642          59 :                 WriteData( pResData, true );
     643             :             }
     644             :         }
     645         105 :         break;
     646             :         case EMPTYLINE : {
     647         288 :             if ( bDefine ) {
     648         225 :                 bNextMustBeDefineEOL = false;
     649         225 :                 bDefine = false;
     650         681 :                 while ( nLevel )
     651         231 :                     Parse( LEVELDOWN, "" );
     652             :             }
     653             :         }
     654         288 :         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        2907 :     if ( bWriteToMerged ) {
     662             :         // the current token must be written to dest. without merging
     663             : 
     664        2907 :         if( bDefine && sOrig.getLength() > 2 ){
     665       44035 :             for( sal_Int32 n = 0; n < sOrig.getLength(); n++ ){
     666       42687 :                 if( sOrig[n] == '\n' && sOrig[n-1] != '\\'){
     667           0 :                     sOrig = sOrig.replaceAt(n++, 0, "\\");
     668             :                 }
     669             :             }
     670             :         }
     671        2907 :         WriteToMerged( sOrig , false);
     672             :     }
     673             : 
     674        2907 :     if ( bExecuteDown ) {
     675           0 :         Parse( LEVELDOWN, "" );
     676             :     }
     677             : 
     678       25336 :     return 1;
     679             : }
     680             : 
     681         314 : void Export::CutComment( OString &rText )
     682             : {
     683         314 :     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         314 : }
     696             : 
     697         711 : bool Export::WriteData( ResData *pResData, bool bCreateNew )
     698             : {
     699         711 :     if ( bMergeMode ) {
     700         711 :         MergeRest( pResData );
     701         711 :         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         652 : OString Export::FullId()
     833             : {
     834         652 :     OStringBuffer sFull;
     835         652 :     if ( nLevel > 1 )
     836             :     {
     837         404 :         sFull.append(aResStack[ 0 ]->sId);
     838         740 :         for ( size_t i = 1; i < nLevel - 1; ++i )
     839             :         {
     840         336 :             OString sToAdd = aResStack[ i ]->sId;
     841         336 :             if (!sToAdd.isEmpty())
     842          83 :                 sFull.append('.').append(sToAdd);
     843         336 :         }
     844             :     }
     845         652 :     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         652 :     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        1631 : void Export::CleanValue( OString &rValue )
     869             : {
     870        4299 :     while ( !rValue.isEmpty()) {
     871        2642 :         if (( rValue[0] == ' ' ) || ( rValue[0] == '\t' ))
     872        1037 :             rValue = rValue.copy( 1 );
     873             :         else
     874        1605 :             break;
     875             :     }
     876             : 
     877        1631 :     if ( !rValue.isEmpty()) {
     878        6651 :         for ( sal_Int32 i = rValue.getLength() - 1; i > 0; i-- ) {
     879       21456 :             if (( rValue[i] == ' ' ) || ( rValue[i] == '\t' ) ||
     880       10532 :                 ( rValue[i] == '\n' ) || ( rValue[i] == ';' ) ||
     881       13574 :                 ( rValue[i] == '{' ) || ( rValue[i] == '\\' ) ||
     882        1594 :                 ( rValue[i] == '\r' ))
     883        5046 :                 rValue = rValue.copy(0, i);
     884             :             else
     885        1594 :                 break;
     886             :         }
     887             :     }
     888        1631 : }
     889             : 
     890             : #define TXT_STATE_TEXT  0x001
     891             : #define TXT_STATE_MACRO 0x002
     892             : 
     893         314 : OString Export::GetText(const OString &rSource, int nToken)
     894             : {
     895         314 :     OString sReturn;
     896         314 :     switch ( nToken )
     897             :     {
     898             :         case TEXTLINE:
     899             :         case LONGTEXTLINE:
     900             :         {
     901         314 :             OString sTmp(rSource.copy(rSource.indexOf('=')));
     902         314 :             CleanValue( sTmp );
     903         628 :             sTmp = sTmp.replaceAll("\n", OString()).
     904             :                 replaceAll("\r", OString()).
     905             :                 replaceAll("\\\\\"", "-=<[BSlashBSlashHKom]>=-\"").
     906             :                 replaceAll("\\\"", "-=<[Hochkomma]>=-").
     907             :                 replaceAll("\\", "-=<[0x7F]>=-").
     908         314 :                 replaceAll("\\0x7F", "-=<[0x7F]>=-");
     909             : 
     910         314 :             sal_uInt16 nState = TXT_STATE_TEXT;
     911         942 :             for (sal_Int32 i = 1; i <= lcl_countOccurrences(sTmp, '"'); ++i)
     912             :             {
     913         628 :                 OString sToken(sTmp.getToken(i, '"'));
     914         628 :                 if (!sToken.isEmpty()) {
     915         314 :                     if ( nState == TXT_STATE_TEXT ) {
     916         314 :                         sReturn += sToken;
     917         314 :                         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         628 :             }
     938             : 
     939         628 :             sReturn = sReturn.replaceAll("-=<[0x7F]>=-", "").
     940             :                 replaceAll("-=<[Hochkomma]>=-", "\"").
     941             :                 replaceAll("-=<[BSlashBSlashHKom]>=-", "\\\\").
     942             :                 replaceAll("\\\\", "-=<[BSlashBSlash]>=-").
     943         628 :                 replaceAll("-=<[BSlashBSlash]>=-", "\\");
     944             :         }
     945         314 :         break;
     946             :     }
     947         314 :     return sReturn;
     948             : }
     949             : 
     950       22429 : void Export::WriteToMerged(const OString &rText , bool bSDFContent)
     951             : {
     952       22429 :     OString sText(rText);
     953             :     for (;;) {
     954       22429 :         sal_Int32 n = 0;
     955       22429 :         sText = sText.replaceFirst(" \n", "\n", &n);
     956       22429 :         if (n == -1) {
     957       22429 :             break;
     958             :         }
     959           0 :     }
     960       25323 :     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       22429 :     } else if (pParseQueue->bLastWasM && sText.getLength() > 2) {
     967       37987 :         for (sal_Int32 n = 0; n < sText.getLength(); ++n) {
     968       36478 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     969           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     970             :             }
     971       36478 :             if (sText[n] == '\n') {
     972         425 :                 pParseQueue->bMflag = true;
     973             :             }
     974             :         }
     975       20920 :     } 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       20920 :     } else if (pParseQueue->bMflag) {
     984        1843 :         for (sal_Int32 n = 1; n < sText.getLength(); ++n) {
     985         594 :             if (sText[n] == '\n' && sText[n - 1] != '\\') {
     986           0 :                 sText = sText.replaceAt(n++, 0, "\\");
     987             :             }
     988             :         }
     989      117156 :     } for (sal_Int32 i = 0; i < sText.getLength(); ++i) {
     990       94727 :         if (sText[i] == '\n') {
     991        3712 :             *aOutput.mSimple << '\n';
     992             :         } else {
     993       91015 :             char cChar = sText[i];
     994       91015 :             *aOutput.mSimple << cChar;
     995             :         }
     996       22429 :     }
     997       22429 : }
     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( size_t 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 ( size_t 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         711 : void Export::MergeRest( ResData *pResData )
    1064             : {
    1065         711 :     if ( !pMergeDataFile ){
    1066           8 :         pMergeDataFile = new MergeDataFile( sMergeSrc, global::inputPathname, true );
    1067           8 :         aLanguages = pMergeDataFile->GetLanguages();
    1068             : 
    1069             :     }
    1070             : 
    1071         711 :     MergeEntrys *pEntry = 0;
    1072         711 :     if( pResData->bText || pResData->bQuickHelpText || pResData->bTitle )
    1073         222 :         pEntry = pMergeDataFile->GetMergeEntrysCaseSensitive( pResData );
    1074             : 
    1075         711 :     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         711 :     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( size_t 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             : 
    1160           0 :                 if( pEntrys )
    1161             :                 {
    1162           0 :                     OString sText;
    1163           0 :                     pEntrys->GetText( sText, STRING_TYP_TEXT, sCur, false );
    1164           0 :                     if( !sText.isEmpty())
    1165             :                     {
    1166           0 :                         ConvertMergeContent( sText );
    1167           0 :                         sLine =
    1168           0 :                             sLine.copy( 0 , sLine.indexOf('"') ) +
    1169           0 :                             sText +
    1170           0 :                             sLine.copy( sLine.lastIndexOf('"') + 1 );
    1171           0 :                     }
    1172             :                 }
    1173             : 
    1174           0 :                 OString sText1( "\t" );
    1175           0 :                 sText1 += sLine;
    1176           0 :                 if ( bDefine || bNextMustBeDefineEOL )
    1177           0 :                     sText1 += " ;\\\n";
    1178             :                 else
    1179           0 :                     sText1 += " ;\n";
    1180           0 :                 sText1 += sSpace;
    1181           0 :                 sText1 += "\t";
    1182           0 :                 WriteToMerged( sText1 ,true );
    1183           0 :                 ++nLIndex;
    1184           0 :             }
    1185             : 
    1186           0 :             if ( nLIndex > 0 )
    1187             :             {
    1188           0 :                 OString sFooter;
    1189           0 :                 if (!sSpace.isEmpty())
    1190           0 :                     sFooter = sSpace.copy(1);
    1191             : 
    1192           0 :                 if ( bNextMustBeDefineEOL )
    1193           0 :                     sFooter += "};";
    1194           0 :                 else if ( !bDefine )
    1195           0 :                     sFooter += "};\n\t";
    1196             :                 else
    1197           0 :                     sFooter += "\n\n";
    1198           0 :                 WriteToMerged( sFooter ,true );
    1199             :             }
    1200             :         }
    1201           0 :         pResData->sId = sOldId;
    1202           0 :         pResData->sGId = sOldGId;
    1203           0 :         pResData->sResTyp = sOldTyp;
    1204             :     }
    1205         711 :     pParseQueue->bMflag = false;
    1206         711 : }
    1207             : 
    1208         222 : void Export::SetChildWithText()
    1209             : {
    1210         222 :     if ( aResStack.size() > 1 ) {
    1211         446 :         for ( size_t i = 0; i < aResStack.size() - 1; i++ ) {
    1212         289 :             aResStack[ i ]->bChildWithText = true;
    1213             :         }
    1214             :     }
    1215         222 : }
    1216             : 
    1217       22179 : void ParserQueue::Push( const QueueEntry& aEntry )
    1218             : {
    1219       22179 :     sal_Int32 nLen = aEntry.sLine.getLength();
    1220             : 
    1221       22179 :     if( !bStart ){
    1222       17306 :         aQueueCur->push( aEntry );
    1223       17306 :         if( nLen > 1 && aEntry.sLine[nLen-1] == '\n' )
    1224           6 :             bStart = true;
    1225       17300 :         else if ( aEntry.nTyp != IGNOREDTOKENS ){
    1226       14629 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1227             :                 // Next is Macro
    1228         289 :                 bCurrentIsM = true;
    1229             :              }else{
    1230             :                 // Next is no Macro
    1231       14340 :                 bCurrentIsM = false;
    1232             :              }
    1233             :         }
    1234             :     }
    1235             :     else{
    1236        4873 :         aQueueNext->push( aEntry );
    1237        4873 :         if( nLen > 1 && aEntry.sLine[nLen-1] != '\n' ){
    1238        1688 :             if( nLen > 1 && ( aEntry.sLine[nLen-1] == '\\') ){
    1239             :                 // Next is Macro
    1240         783 :                 bNextIsM = true;
    1241             :             }
    1242             :             else{
    1243             :                 // Next is no Macro
    1244         905 :                 bNextIsM = false;
    1245             :             }
    1246        3185 :         }else if( nLen > 2 && aEntry.sLine[nLen-1] == '\n' ){
    1247         308 :             if( aEntry.nTyp != IGNOREDTOKENS ){
    1248         308 :                 if( nLen > 2 && ( aEntry.sLine[nLen-2] == '\\') ){
    1249             :                     // Next is Macro
    1250         289 :                     bNextIsM = true;
    1251             :                 }
    1252             :                 else{
    1253             :                     // Next is no Macro
    1254          19 :                     bNextIsM = false;
    1255             :                 }
    1256             :             }
    1257             :             // Pop current
    1258         308 :             Pop( *aQueueCur );
    1259         308 :             bLastWasM = bCurrentIsM;
    1260             :             // next -> current
    1261         308 :             bCurrentIsM = bNextIsM;
    1262         308 :             std::queue<QueueEntry>* aQref = aQueueCur;
    1263         308 :             aQueueCur = aQueueNext;
    1264         308 :             aQueueNext = aQref;
    1265             : 
    1266             :         }
    1267             : 
    1268             :         else{
    1269             :             // Pop current
    1270        2877 :             Pop( *aQueueCur );
    1271        2877 :             bLastWasM = bCurrentIsM;
    1272             :             // next -> current
    1273        2877 :             bCurrentIsM = bNextIsM;
    1274        2877 :             std::queue<QueueEntry>* aQref = aQueueCur;
    1275        2877 :             aQueueCur = aQueueNext;
    1276        2877 :             aQueueNext = aQref;
    1277             :         }
    1278             :     }
    1279       22179 : }
    1280             : 
    1281           8 : void ParserQueue::Close(){
    1282             :     // Pop current
    1283           8 :     Pop( *aQueueCur );
    1284             :     // next -> current
    1285           8 :     bLastWasM = bCurrentIsM;
    1286           8 :     bCurrentIsM = bNextIsM;
    1287           8 :     std::queue<QueueEntry>* aQref = aQueueCur;
    1288           8 :     aQueueCur = aQueueNext;
    1289           8 :     aQueueNext = aQref;
    1290           8 :     bNextIsM = false;
    1291           8 :     Pop( *aQueueNext );
    1292           8 : };
    1293             : 
    1294        3201 : void ParserQueue::Pop( std::queue<QueueEntry>& aQueue )
    1295             : {
    1296       28581 :     while (!aQueue.empty())
    1297             :     {
    1298       22179 :         QueueEntry aEntry = aQueue.front();
    1299       22179 :         aQueue.pop();
    1300       22179 :         aExport.Execute(aEntry.nTyp, aEntry.sLine.getStr());
    1301       22179 :     }
    1302        3201 : }
    1303             : 
    1304           8 : ParserQueue::ParserQueue( Export& aExportObj )
    1305             :         :
    1306             :           bCurrentIsM( false ),
    1307             :           bNextIsM( false ) ,
    1308             :           bLastWasM( false ),
    1309             :           bMflag( false ) ,
    1310             :           aExport( aExportObj ) ,
    1311           8 :           bStart( false )
    1312             : {
    1313           8 :           aQueueNext = new std::queue<QueueEntry>;
    1314           8 :           aQueueCur  = new std::queue<QueueEntry>;
    1315           8 : }
    1316             : 
    1317             : 
    1318           8 : ParserQueue::~ParserQueue(){
    1319           8 :     if( aQueueNext )    delete aQueueNext;
    1320           8 :     if( aQueueCur )     delete aQueueCur;
    1321          32 : }
    1322             : 
    1323             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11