LCOV - code coverage report
Current view: top level - l10ntools/source - export.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 1207 0.0 %
Date: 2012-08-25 Functions: 0 37 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

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

Generated by: LCOV version 1.10