/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_l10ntools.hxx" #include #include #include #include "export.hxx" #include "tokens.h" #include #include #include extern "C" { int yyerror( const char * ); } extern "C" { int YYWarning( const char * ); } Export *pExport = 0L; // defines to parse command line #define STATE_NON 0x0001 #define STATE_INPUT 0x0002 #define STATE_OUTPUT 0x0003 #define STATE_PRJ 0x0004 #define STATE_ROOT 0x0005 #define STATE_MERGESRC 0x0006 #define STATE_ERRORLOG 0x0007 #define STATE_BREAKHELP 0x0008 #define STATE_UNMERGE 0x0009 #define STATE_UTF8 0x000A #define STATE_LANGUAGES 0X000B // set of global variables typedef ::std::vector< ByteString* > FileList; FileList aInputFileList; sal_Bool bEnableExport; sal_Bool bMergeMode; sal_Bool bErrorLog; sal_Bool bBreakWhenHelpText; sal_Bool bUnmerge; sal_Bool bUTF8; ByteString sPrj; ByteString sPrjRoot; ByteString sActFileName; ByteString sOutputFile; ByteString sMergeSrc; ByteString sTempFile; ByteString sFile; MergeDataFile *pMergeDataFile; FILE *pTempFile; ByteString sStrBuffer; bool bMarcro = false; extern "C" { // the whole interface to lexer is in this extern "C" section /*****************************************************************************/ extern char *GetOutputFile( int argc, char* argv[]) /*****************************************************************************/ { bEnableExport = sal_False; bMergeMode = sal_False; bErrorLog = sal_True; bBreakWhenHelpText = sal_False; bUnmerge = sal_False; bUTF8 = sal_True; sPrj = ""; sPrjRoot = ""; sActFileName = ""; Export::sLanguages = ""; Export::sForcedLanguages = ""; sTempFile = ""; pTempFile = NULL; sal_uInt16 nState = STATE_NON; sal_Bool bInput = sal_False; // parse command line for( int i = 1; i < argc; i++ ) { ByteString sSwitch( argv[ i ] ); if (sSwitch == "-i" || sSwitch == "-I" ) { nState = STATE_INPUT; // next tokens specifies source files } else if (sSwitch == "-o" || sSwitch == "-O" ) { nState = STATE_OUTPUT; // next token specifies the dest file } else if (sSwitch == "-p" || sSwitch == "-P" ) { nState = STATE_PRJ; // next token specifies the cur. project } else if (sSwitch == "-r" || sSwitch == "-R" ) { nState = STATE_ROOT; // next token specifies path to project root } else if (sSwitch == "-m" || sSwitch == "-M" ) { nState = STATE_MERGESRC; // next token specifies the merge database } else if (sSwitch == "-e" || sSwitch == "-E" ) { nState = STATE_ERRORLOG; bErrorLog = sal_False; } else if (sSwitch == "-b" || sSwitch == "-B" ) { nState = STATE_BREAKHELP; bBreakWhenHelpText = sal_True; } else if (sSwitch == "-u" || sSwitch == "-U" ) { nState = STATE_UNMERGE; bUnmerge = sal_True; bMergeMode = sal_True; } else if ( sSwitch.ToUpperAscii() == "-UTF8" ) { nState = STATE_UTF8; bUTF8 = sal_True; } else if ( sSwitch.ToUpperAscii() == "-NOUTF8" ) { nState = STATE_UTF8; bUTF8 = sal_False; } else if ( sSwitch == "-l" || sSwitch == "-L" ) { nState = STATE_LANGUAGES; } else { switch ( nState ) { case STATE_NON: { return NULL; // no valid command line } case STATE_INPUT: { aInputFileList.push_back( new ByteString( argv[ i ] ) ); bInput = sal_True; // min. one source file found } break; case STATE_OUTPUT: { sOutputFile = ByteString( argv[ i ]); // the dest. file } break; case STATE_PRJ: { sPrj = ByteString( argv[ i ]); } break; case STATE_ROOT: { sPrjRoot = ByteString( argv[ i ]); // path to project root } break; case STATE_MERGESRC: { sMergeSrc = ByteString( argv[ i ]); bMergeMode = sal_True; // activate merge mode, cause merge database found } break; case STATE_LANGUAGES: { Export::sLanguages = ByteString( argv[ i ]); } break; } } } if( bUnmerge ) sMergeSrc = ByteString(); if ( bInput ) { // command line is valid bEnableExport = sal_True; char *pReturn = new char[ sOutputFile.Len() + 1 ]; strcpy( pReturn, sOutputFile.GetBuffer()); // #100211# - checked return pReturn; } // command line is not valid return NULL; } /*****************************************************************************/ int InitExport( char *pOutput , char* pFilename ) /*****************************************************************************/ { // instanciate Export ByteString sOutput( pOutput ); ByteString sFilename( pFilename ); if ( bMergeMode && !bUnmerge ) { // merge mode enabled, so read database pExport = new Export(sOutput, bEnableExport, sPrj, sPrjRoot, sMergeSrc , sFilename ); } else // no merge mode, only export pExport = new Export( sOutput, bEnableExport, sPrj, sPrjRoot , sFilename ); return 1; } /*****************************************************************************/ int EndExport() /*****************************************************************************/ { delete pExport; return 1; } extern const char* getFilename() { return (*(aInputFileList[ 0 ])).GetBuffer(); } /*****************************************************************************/ extern FILE *GetNextFile() /*****************************************************************************/ { // look for next valid filename in input file list if ( sTempFile.Len()) { fclose( pTempFile ); String sTemp( sTempFile, RTL_TEXTENCODING_ASCII_US ); DirEntry aTemp( sTemp ); aTemp.Kill(); } while ( !aInputFileList.empty() ) { ByteString sFileName( *(aInputFileList[ 0 ]) ); ByteString sOrigFile( sFileName ); sFileName = Export::GetNativeFile( sFileName ); delete aInputFileList[ 0 ]; aInputFileList.erase( aInputFileList.begin() ); if ( sFileName == "" ) { fprintf( stderr, "ERROR: Could not precompile File %s\n", sOrigFile.GetBuffer()); return GetNextFile(); } sTempFile = sFileName; Export::RemoveUTF8ByteOrderMarkerFromFile( sFileName ); // able to open file? FILE *pFile = fopen( sFileName.GetBuffer(), "r" ); if ( !pFile ) fprintf( stderr, "Error: Could not open File %s\n", sFileName.GetBuffer()); else { pTempFile = pFile; // this is a valid file which can be opened, so // create path to project root DirEntry aEntry( String( sOrigFile, RTL_TEXTENCODING_ASCII_US )); aEntry.ToAbs(); ByteString sFullEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US ); aEntry += DirEntry( String( "..", RTL_TEXTENCODING_ASCII_US )); aEntry += DirEntry( sPrjRoot ); ByteString sPrjEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US ); // create file name, beginnig with project root // (e.g.: source\ui\src\menue.src) sActFileName = sFullEntry.Copy( sPrjEntry.Len() + 1 ); sActFileName.SearchAndReplaceAll( "/", "\\" ); sFile = sActFileName; if ( pExport ) { // create instance of class export pExport->Init(); } // return the valid file handle return pFile; } } // this means the file could not be opened return NULL; } int Parse( int nTyp, const char *pTokenText ){ pExport->Execute( nTyp , pTokenText ); return 1; } void Close(){ pExport->pParseQueue->Close(); } /*****************************************************************************/ int WorkOnTokenSet( int nTyp, char *pTokenText ) /*****************************************************************************/ { pExport->pParseQueue->Push( QueueEntry( nTyp , ByteString( pTokenText ) ) ); return 1; } } // extern extern "C" { /*****************************************************************************/ int SetError() /*****************************************************************************/ { // set error at global instance of class Export pExport->SetError(); return 1; } } extern "C" { /*****************************************************************************/ int GetError() /*****************************************************************************/ { // get error at global instance of class Export if ( pExport->GetError()) return 1; return sal_False; } } // // class ResData // void ResData::Dump(){ printf("**************\nResData\n"); printf("sPForm = %s , sResTyp = %s , sId = %s , sGId = %s , sHelpId = %s\n",sPForm.GetBuffer() ,sResTyp.GetBuffer(),sId.GetBuffer(),sGId.GetBuffer(),sHelpId.GetBuffer()); ByteString a("*pStringList"); ByteString b("*pUIEntries"); ByteString c("*pFilterList"); ByteString d("*pItemList"); ByteString e("*pPairedList"); ByteString f("sText"); Export::DumpMap( f , sText ); if( pStringList ) Export::DumpExportList( a , *pStringList ); if( pUIEntries ) Export::DumpExportList( b , *pUIEntries ); if( pFilterList ) Export::DumpExportList( c , *pFilterList ); if( pItemList ) Export::DumpExportList( d , *pItemList ); if( pPairedList ) Export::DumpExportList( e , *pPairedList ); printf("\n"); } void ResData::addFallbackData( ByteString& sId_in , const ByteString& sText_in ){ aFallbackData[ sId_in ] = sText_in; } bool ResData::getFallbackData( ByteString& sId_in , ByteString& sText_inout ){ sText_inout = aFallbackData[ sId_in ]; return sText_inout.Len() > 0; } void ResData::addMergedLanguage(rtl::OString& rLang) { aMergedLanguages[rLang] = rtl::OString(RTL_CONSTASCII_STRINGPARAM("1")); } bool ResData::isMerged(rtl::OString& rLang) { return aMergedLanguages[rLang].equalsL(RTL_CONSTASCII_STRINGPARAM("1")); } /*****************************************************************************/ sal_Bool ResData::SetId( const ByteString &rId, sal_uInt16 nLevel ) /*****************************************************************************/ { if ( nLevel > nIdLevel ) { nIdLevel = nLevel; sId = rId; if ( bChild && bChildWithText ) { rtl::OString sError(RTL_CONSTASCII_STRINGPARAM("ResId after child definition")); yyerror(sError.getStr()); SetError(); } if ( sId.Len() > 255 ) { ByteString sWarning( "LocalId > 255 chars, truncating..." ); YYWarning( sWarning.GetBufferAccess()); sWarning.ReleaseBufferAccess(); sId.Erase( 255 ); sId.EraseTrailingChars( ' ' ); sId.EraseTrailingChars( '\t' ); } return sal_True; } return sal_False; } // // class Export // /*****************************************************************************/ Export::Export( const ByteString &rOutput, sal_Bool bWrite, const ByteString &rPrj, const ByteString &rPrjRoot , const ByteString& rFile ) /*****************************************************************************/ : pWordTransformer( NULL ), aCharSet( RTL_TEXTENCODING_MS_1252 ), bDefine( sal_False ), bNextMustBeDefineEOL( sal_False ), nLevel( 0 ), nList( LIST_NON ), nListIndex( 0 ), nListLevel( 0 ), bSkipFile( false ), sProject( sPrj ), sRoot( sPrjRoot ), bEnableExport( bWrite ), bMergeMode( bUnmerge ), bError( sal_False ), bReadOver( sal_False ), bDontWriteOutput( sal_False ), sFilename( rFile ) { pParseQueue = new ParserQueue( *this ); (void) rPrj; (void) rPrjRoot; (void) rFile; if( !isInitialized ) InitLanguages(); // used when export is enabled // open output stream if ( bEnableExport ) { aOutput.Open( String( rOutput, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC ); if( !aOutput.IsOpen() ) { printf("ERROR : Can't open file %s\n",rOutput.GetBuffer()); exit ( -1 ); } aOutput.SetStreamCharSet( RTL_TEXTENCODING_UTF8 ); aOutput.SetLineDelimiter( LINEEND_CRLF ); } } /*****************************************************************************/ Export::Export( const ByteString &rOutput, sal_Bool bWrite, const ByteString &rPrj, const ByteString &rPrjRoot, const ByteString &rMergeSource , const ByteString& rFile ) /*****************************************************************************/ : pWordTransformer( NULL ), aCharSet( RTL_TEXTENCODING_MS_1252 ), bDefine( sal_False ), bNextMustBeDefineEOL( sal_False ), nLevel( 0 ), nList( LIST_NON ), nListIndex( 0 ), nListLevel( 0 ), bSkipFile( false ), sProject( sPrj ), sRoot( sPrjRoot ), bEnableExport( bWrite ), bMergeMode( sal_True ), sMergeSrc( rMergeSource ), bError( sal_False ), bReadOver( sal_False ), bDontWriteOutput( sal_False ), sFilename( rFile ) { (void) rPrj; (void) rPrjRoot; (void) rFile; pParseQueue = new ParserQueue( *this ); if( !isInitialized ) InitLanguages( bMergeMode ); // used when merge is enabled // open output stream if ( bEnableExport ) { aOutput.Open( String( rOutput, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC ); aOutput.SetStreamCharSet( RTL_TEXTENCODING_UTF8 ); aOutput.SetLineDelimiter( LINEEND_CRLF ); } } /*****************************************************************************/ void Export::Init() /*****************************************************************************/ { // resets the internal status, used before parseing another file sActPForm = ""; bDefine = sal_False; bNextMustBeDefineEOL = sal_False; nLevel = 0; nList = LIST_NON; m_sListLang = ByteString( String::CreateFromAscii(""),RTL_TEXTENCODING_ASCII_US ); nListIndex = 0; for ( size_t i = 0, n = aResStack.size(); i < n; ++i ) delete aResStack[ i ]; aResStack.clear(); } /*****************************************************************************/ Export::~Export() /*****************************************************************************/ { if( pParseQueue ) delete pParseQueue; // close output stream if ( bEnableExport ) aOutput.Close(); for ( size_t i = 0, n = aResStack.size(); i < n; ++i ) delete aResStack[ i ]; aResStack.clear(); if ( bMergeMode && !bUnmerge ) { if ( !pMergeDataFile ) pMergeDataFile = new MergeDataFile( sMergeSrc,sFile , bErrorLog, aCharSet);//, bUTF8 ); delete pMergeDataFile; } } /*****************************************************************************/ int Export::Execute( int nToken, const char * pToken ) /*****************************************************************************/ { ByteString sToken( pToken ); ByteString sOrig( sToken ); sal_Bool bWriteToMerged = bMergeMode; if ( nToken == CONDITION ) { ByteString sTestToken( pToken ); sTestToken.EraseAllChars( '\t' ); sTestToken.EraseAllChars( ' ' ); if (( !bReadOver ) && ( sTestToken.Search( "#ifndef__RSC_PARSER" ) == 0 )) bReadOver = sal_True; else if (( bReadOver ) && ( sTestToken.Search( "#endif" ) == 0 )) bReadOver = sal_False; } if ((( nToken < FILTER_LEVEL ) || ( bReadOver )) && (!(( bNextMustBeDefineEOL ) && ( sOrig == "\n" )))) { // this tokens are not mandatory for parsing, so ignore them ... if ( bMergeMode ) WriteToMerged( sOrig , false ); // ... ore whrite them directly to dest. return 0; } ResData *pResData = NULL; if ( nLevel ) { // res. exists at cur. level pResData = ( (nLevel-1) < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL; } else if (( nToken != RESSOURCE ) && ( nToken != RESSOURCEEXPR ) && ( nToken != SMALRESSOURCE ) && ( nToken != LEVELUP ) && ( nToken != NORMDEFINE ) && ( nToken != RSCDEFINE ) && ( nToken != CONDITION ) && ( nToken != PRAGMA )) { // no res. exists at cur. level so return if ( bMergeMode ) WriteToMerged( sOrig , false ); return 0; } // #define NO_LOCALIZE_EXPORT if( bSkipFile ){ if ( bMergeMode ) { WriteToMerged( sOrig , false ); } return 1; } if ( bDefine ) { if (( nToken != EMPTYLINE ) && ( nToken != LEVELDOWN ) && ( nToken != LEVELUP )) { // cur. res. defined in macro if ( bNextMustBeDefineEOL ) { if ( nToken != RSCDEFINELEND ) { // end of macro found, so destroy res. bDefine = sal_False; if ( bMergeMode ) { MergeRest( pResData ); } bNextMustBeDefineEOL = sal_False; Execute( LEVELDOWN, "" ); } else { // next line also in macro definition bNextMustBeDefineEOL = sal_False; if ( bMergeMode ) WriteToMerged( sOrig , false ); return 1; } } else if (( nToken != LISTASSIGNMENT ) && ( nToken != UIENTRIES )){ // cur. line has macro line end ByteString sTmpLine( sToken ); sTmpLine.EraseAllChars( '\t' ); sTmpLine.EraseAllChars( ' ' ); } } } sal_Bool bExecuteDown = sal_False; if ( nToken != LEVELDOWN ) { sal_uInt16 nOpen = 0; sal_uInt16 nClose = 0; sal_Bool bReadOver1 = sal_False; sal_uInt16 i = 0; for ( i = 0; i < sToken.Len(); i++ ) { if ( sToken.GetChar( i ) == '\"' ) bReadOver1 = !bReadOver1; if ( !bReadOver1 && ( sToken.GetChar( i ) == '{' )) nOpen++; } bReadOver1 = sal_False; for ( i = 0; i < sToken.Len(); i++ ) { if ( sToken.GetChar( i ) == '\"' ) bReadOver1 = !bReadOver1; if ( !bReadOver1 && ( sToken.GetChar( i ) == '}' )) nClose++; } if ( nOpen < nClose ) bExecuteDown = sal_True; } switch ( nToken ) { case NORMDEFINE: while( sToken.SearchAndReplace( "\r", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( " ", " " ) != STRING_NOTFOUND ) {}; if( sToken.EqualsIgnoreCaseAscii( "#define NO_LOCALIZE_EXPORT" ) ){ bSkipFile = true; return 0; } if ( bMergeMode ) WriteToMerged( sOrig , false ); return 0; case RSCDEFINE: bDefine = sal_True; // res. defined in macro case RESSOURCE: case RESSOURCEEXPR: { bDontWriteOutput = sal_False; if ( nToken != RSCDEFINE ) bNextMustBeDefineEOL = sal_False; // this is the beginning of a new res. nLevel++; if ( nLevel > 1 ) { aResStack[ nLevel - 2 ]->bChild = sal_True; } // create new instance for this res. and fill mandatory fields pResData = new ResData( sActPForm, FullId() , sFilename ); aResStack.push_back( pResData ); ByteString sBackup( sToken ); sToken.EraseAllChars( '\n' ); sToken.EraseAllChars( '\r' ); sToken.EraseAllChars( '{' ); while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; sToken.EraseTrailingChars( ' ' ); ByteString sT = sToken.GetToken( 0, ' ' ); pResData->sResTyp = sT.ToLowerAscii(); ByteString sId( sToken.Copy( pResData->sResTyp.Len() + 1 )); ByteString sCondition; if ( sId.Search( "#" ) != STRING_NOTFOUND ) { // between ResTyp, Id and paranthes is a precomp. condition sCondition = "#"; sCondition += sId.GetToken( 1, '#' ); sId = sId.GetToken( 0, '#' ); } sId = sId.GetToken( 0, '/' ); CleanValue( sId ); sId = sId.EraseAllChars( '\t' ); pResData->SetId( sId, ID_LEVEL_IDENTIFIER ); if ( sCondition.Len()) { ByteString sEmpty( "" ); Execute( CONDITION, sEmpty.GetBufferAccess()); // execute the // precomp. // condition sEmpty.ReleaseBufferAccess(); } } break; case SMALRESSOURCE: { bDontWriteOutput = sal_False; // this is the beginning of a new res. bNextMustBeDefineEOL = sal_False; nLevel++; if ( nLevel > 1 ) { aResStack[ nLevel - 2 ]->bChild = sal_True; } // create new instance for this res. and fill mandatory fields pResData = new ResData( sActPForm, FullId() , sFilename ); aResStack.push_back( pResData ); sToken.EraseAllChars( '\n' ); sToken.EraseAllChars( '\r' ); sToken.EraseAllChars( '{' ); sToken.EraseAllChars( '\t' ); sToken.EraseAllChars( ' ' ); sToken.EraseAllChars( '\\' ); pResData->sResTyp = sToken.ToLowerAscii(); } break; case LEVELUP: { // push if ( nList ) nListLevel++; if ( nList ) break; bDontWriteOutput = sal_False; ByteString sLowerTyp; if ( pResData ) sLowerTyp = "unknown"; nLevel++; if ( nLevel > 1 ) { aResStack[ nLevel - 2 ]->bChild = sal_True; } ResData *pNewData = new ResData( sActPForm, FullId() , sFilename ); pNewData->sResTyp = sLowerTyp; aResStack.push_back( pNewData ); } break; case LEVELDOWN: { // pop if ( !nList ) { bDontWriteOutput = sal_False; if ( nLevel ) { if ( bDefine && (nLevel == 1 )) { bDefine = sal_False; bNextMustBeDefineEOL = sal_False; } WriteData( pResData ); ResStack::iterator it = aResStack.begin(); ::std::advance( it, nLevel-1 ); delete *it; aResStack.erase( it ); nLevel--; } } else { if ( bDefine ) bNextMustBeDefineEOL = sal_True; if ( !nListLevel ) { if ( bMergeMode ) MergeRest( pResData, MERGE_MODE_LIST ); nList = LIST_NON; } else nListLevel--; } } break; case ASSIGNMENT: { bDontWriteOutput = sal_False; // interpret different types of assignement ByteString sKey = sToken.GetToken( 0, '=' ); sKey.EraseAllChars( ' ' ); sKey.EraseAllChars( '\t' ); ByteString sValue = sToken.GetToken( 1, '=' ); CleanValue( sValue ); if ( sKey.ToUpperAscii() == "IDENTIFIER" ) { ByteString sId( sValue.EraseAllChars( '\t' )); pResData->SetId( sId.EraseAllChars( ' ' ), ID_LEVEL_IDENTIFIER ); } else if ( sKey == "HELPID" ) { pResData->sHelpId = sValue; } else if ( sKey == "STRINGLIST" ) { pResData->bList = sal_True; nList = LIST_STRING; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } else if ( sKey == "FILTERLIST" ) { pResData->bList = sal_True; nList = LIST_FILTER; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } else if ( sKey == "UIENTRIES" ) { pResData->bList = sal_True; nList = LIST_UIENTRIES; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } if (( sToken.Search( "{" ) != STRING_NOTFOUND ) && ( sToken.GetTokenCount( '{' ) > sToken.GetTokenCount( '}' ))) { Parse( LEVELUP, "" ); } } break; case UIENTRIES: case LISTASSIGNMENT: { bDontWriteOutput = sal_False; ByteString sTmpToken( sToken); sTmpToken.EraseAllChars(' '); sal_uInt16 nPos = 0; nPos = sTmpToken.ToLowerAscii().Search("[en-us]="); if( nPos != STRING_NOTFOUND ) { ByteString sKey = sTmpToken.Copy( 0 , nPos ); sKey.EraseAllChars( ' ' ); sKey.EraseAllChars( '\t' ); ByteString sValue = sToken.GetToken( 1, '=' ); CleanValue( sValue ); if ( sKey.ToUpperAscii() == "STRINGLIST" ) { pResData->bList = sal_True; nList = LIST_STRING; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } else if ( sKey == "FILTERLIST" ) { pResData->bList = sal_True; nList = LIST_FILTER; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } // PairedList else if ( sKey == "PAIREDLIST" ) { pResData->bList = sal_True; nList = LIST_PAIRED; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } else if ( sKey == "ITEMLIST" ) { pResData->bList = sal_True; nList = LIST_ITEM; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } else if ( sKey == "UIENTRIES" ) { pResData->bList = sal_True; nList = LIST_UIENTRIES; m_sListLang = SOURCE_LANGUAGE; nListIndex = 0; nListLevel = 0; } } else { // new res. is a String- or FilterList ByteString sKey = sToken.GetToken( 0, '[' ); sKey.EraseAllChars( ' ' ); sKey.EraseAllChars( '\t' ); if ( sKey.ToUpperAscii() == "STRINGLIST" ) nList = LIST_STRING; else if ( sKey == "FILTERLIST" ) nList = LIST_FILTER; else if ( sKey == "PAIREDLIST" ) nList = LIST_PAIRED; // abcd else if ( sKey == "ITEMLIST" ) nList = LIST_ITEM; else if ( sKey == "UIENTRIES" ) nList = LIST_UIENTRIES; if ( nList ) { ByteString sLang=sToken.GetToken( 1, '[' ).GetToken( 0, ']' ); CleanValue( sLang ); m_sListLang = sLang; nListIndex = 0; nListLevel = 0; } } } break; case TEXT: case _LISTTEXT: case LISTTEXT: { // this is an entry for a String- or FilterList if ( nList ) { SetChildWithText(); ByteString sEntry( sToken.GetToken( 1, '\"' )); if ( sToken.GetTokenCount( '\"' ) > 3 ) sEntry += "\""; if ( sEntry == "\\\"" ) sEntry = "\""; InsertListEntry( sEntry, sOrig ); if ( bMergeMode && ( sEntry != "\"" )) { PrepareTextToMerge( sOrig, nList, m_sListLang, pResData ); } } } break; case LONGTEXTLINE: case TEXTLINE: bDontWriteOutput = sal_False; if ( nLevel ) { CutComment( sToken ); // this is a text line!!! ByteString sKey = sToken.GetToken( 0, '=' ).GetToken( 0, '[' ); sKey.EraseAllChars( ' ' ); sKey.EraseAllChars( '\t' ); ByteString sText( GetText( sToken, nToken )); if ( !bMergeMode ) sText = sText.Convert( aCharSet, RTL_TEXTENCODING_MS_1252 ); ByteString sLang; if ( sToken.GetToken( 0, '=' ).Search( "[" ) != STRING_NOTFOUND ) { sLang = sToken.GetToken( 0, '=' ).GetToken( 1, '[' ).GetToken( 0, ']' ); CleanValue( sLang ); } rtl::OString sLangIndex = sLang; ByteString sOrigKey = sKey; if ( sText.Len() && sLang.Len() ) { if (( sKey.ToUpperAscii() == "TEXT" ) || ( sKey == "MESSAGE" ) || ( sKey == "CUSTOMUNITTEXT" ) || ( sKey == "SLOTNAME" ) || ( sKey == "UINAME" )) { SetChildWithText(); if ( Export::isSourceLanguage( sLangIndex ) ) pResData->SetId( sText, ID_LEVEL_TEXT ); pResData->bText = sal_True; pResData->sTextTyp = sOrigKey; if ( bMergeMode ) { PrepareTextToMerge( sOrig, STRING_TYP_TEXT, sLangIndex, pResData ); } else { if (pResData->sText[ sLangIndex ].getLength()) { rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language ")); sError.append(sLangIndex); sError.append(RTL_CONSTASCII_STRINGPARAM("defined twice")); yyerror(sError.getStr()); } pResData->sText[ sLangIndex ] = sText; } } else if ( sKey == "HELPTEXT" ) { SetChildWithText(); pResData->bHelpText = sal_True; if ( bBreakWhenHelpText ) { rtl::OString sError( RTL_CONSTASCII_STRINGPARAM("\"HelpText\" found in source\n")); YYWarning(sError.getStr()); SetError(); } if ( bMergeMode ) PrepareTextToMerge( sOrig, STRING_TYP_HELPTEXT, sLangIndex, pResData ); else { if (pResData->sHelpText[ sLangIndex ].getLength()) { rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language ")); sError.append(sLangIndex); sError.append(" defined twice"); YYWarning(sError.getStr()); } pResData->sHelpText[ sLangIndex ] = sText; } } else if ( sKey == "QUICKHELPTEXT" ) { SetChildWithText(); pResData->bQuickHelpText = sal_True; if ( bMergeMode ) PrepareTextToMerge( sOrig, STRING_TYP_QUICKHELPTEXT, sLangIndex, pResData ); else { if (pResData->sQuickHelpText[ sLangIndex ].getLength()) { rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language ")); sError.append(sLangIndex); sError.append(RTL_CONSTASCII_STRINGPARAM(" defined twice")); YYWarning(sError.getStr()); } pResData->sQuickHelpText[ sLangIndex ] = sText; } } else if ( sKey == "TITLE" ) { SetChildWithText(); pResData->bTitle = sal_True; if ( bMergeMode ) PrepareTextToMerge( sOrig, STRING_TYP_TITLE, sLangIndex, pResData ); else { if ( pResData->sTitle[ sLangIndex ].getLength()) { rtl::OStringBuffer sError(RTL_CONSTASCII_STRINGPARAM("Language ")); sError.append(sLangIndex); sError.append(RTL_CONSTASCII_STRINGPARAM(" defined twice")); YYWarning(sError.getStr()); } pResData->sTitle[ sLangIndex ] = sText; } } else if ( sKey == "ACCESSPATH" ) { pResData->SetId( sText, ID_LEVEL_ACCESSPATH ); } else if ( sKey == "FIELDNAME" ) { pResData->SetId( sText, ID_LEVEL_FIELDNAME ); } } } break; case NEWTEXTINRES: { bDontWriteOutput = sal_True; } break; case APPFONTMAPPING: { bDontWriteOutput = sal_False; // this is a AppfontMapping, so look if its a definition // of field size ByteString sKey = sToken.GetToken( 0, '=' ); sKey.EraseAllChars( ' ' ); sKey.EraseAllChars( '\t' ); ByteString sMapping = sToken.GetToken( 1, '=' ); sMapping = sMapping.GetToken( 1, '(' ); sMapping = sMapping.GetToken( 0, ')' ); sMapping.EraseAllChars( ' ' ); sMapping.EraseAllChars( '\t' ); if ( sKey.ToUpperAscii() == "SIZE" ) { pResData->nWidth = ( sal_uInt16 ) sMapping.GetToken( 0, ',' ).ToInt64(); } else if ( sKey == "POSSIZE" ) { pResData->nWidth = ( sal_uInt16 ) sMapping.GetToken( 2, ',' ).ToInt64(); } } break; case RSCDEFINELEND: bDontWriteOutput = sal_False; break; case CONDITION: { bDontWriteOutput = sal_False; while( sToken.SearchAndReplace( "\r", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( " ", " " ) != STRING_NOTFOUND ) {}; ByteString sCondition = sToken.GetToken( 0, ' ' ); if ( sCondition == "#ifndef" ) { sActPForm = "!defined "; sActPForm += sToken.GetToken( 1, ' ' ); } else if ( sCondition == "#ifdef" ) { sActPForm = "defined "; sActPForm += sToken.GetToken( 1, ' ' ); } else if ( sCondition == "#if" ) { sActPForm = sToken.Copy( 4 ); while ( sActPForm.SearchAndReplace( "||", "\\or" ) != STRING_NOTFOUND ) {}; } else if ( sCondition == "#elif" ) { sActPForm = sToken.Copy( 6 ); while ( sActPForm.SearchAndReplace( "||", "\\or" ) != STRING_NOTFOUND ) {}; } else if ( sCondition == "#else" ) { sActPForm = sCondition; } else if ( sCondition == "#endif" ) { sActPForm = ""; } else break; if ( nLevel ) { WriteData( pResData, sal_True ); pResData->sPForm = sActPForm; } } break; case EMPTYLINE : { bDontWriteOutput = sal_False; if ( bDefine ) { bNextMustBeDefineEOL = sal_False; bDefine = sal_False; while ( nLevel ) Parse( LEVELDOWN, "" ); } } break; case PRAGMA : { bDontWriteOutput = sal_False; while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( " ", " " ) != STRING_NOTFOUND ) {}; sToken.EraseLeadingChars( ' ' ); sToken.EraseTrailingChars( ' ' ); ByteString sCharset = sToken.GetToken( 1, ' ' ); ByteString sSet = sToken.GetToken( 2, ' ' ); if (( sCharset.ToUpperAscii() == "CHARSET_IBMPC" ) || ( sCharset == "RTL_TEXTENCODING_IBM_850" ) || (( sCharset == "CHARSET" ) && ( sSet.ToUpperAscii() == "IBMPC" ))) { aCharSet = RTL_TEXTENCODING_IBM_850; } else if (( sCharset == "CHARSET_ANSI" ) || ( sCharset == "RTL_TEXTENCODING_MS_1252" ) || (( sCharset == "CHARSET" ) && ( sSet.ToUpperAscii() == "ANSI" ))) { aCharSet = RTL_TEXTENCODING_MS_1252; } } break; case TEXTREFID : { bDontWriteOutput = sal_True; } } if ( bWriteToMerged ) { // the current token must be written to dest. without merging if( bDefine && sOrig.Len() > 2 ){ for( sal_uInt16 n = 0 ; n < sOrig.Len() ; n++ ){ if( sOrig.GetChar( n ) == '\n' && sOrig.GetChar( n-1 ) != '\\'){ sOrig.Insert('\\' , n++ ); } } } WriteToMerged( sOrig , false); } if ( bExecuteDown ) { Parse( LEVELDOWN, "" ); } return 1; } /*****************************************************************************/ void Export::CutComment( ByteString &rText ) /*****************************************************************************/ { if ( rText.Search( "//" ) != STRING_NOTFOUND ) { ByteString sWork( rText ); sWork.SearchAndReplaceAll( "\\\"", "XX" ); sal_uInt16 i = 0; sal_Bool bInner = sal_False; while ( i < sWork.Len() - 1 ) { if ( sWork.GetChar( i ) == '\"' ) bInner = !bInner; else if (( sWork.GetChar( i ) == '/' ) && ( !bInner ) && ( sWork.GetChar( i + 1 ) == '/' )) { rText.Erase( i ); return; } i++; } } } /*****************************************************************************/ sal_Bool Export::WriteData( ResData *pResData, sal_Bool bCreateNew ) /*****************************************************************************/ { if ( bMergeMode ) { MergeRest( pResData ); return sal_True; } if ( bUnmerge ) return sal_True; // mandatory to export: en-US if (( pResData->sText[ SOURCE_LANGUAGE ].getLength()) || ( pResData->sHelpText[ SOURCE_LANGUAGE ].getLength()) || ( pResData->sQuickHelpText[ SOURCE_LANGUAGE ].getLength()) || ( pResData->sTitle[ SOURCE_LANGUAGE ].getLength())) { FillInFallbacks( pResData ); ByteString sGID = pResData->sGId; ByteString sLID; if ( !sGID.Len()) sGID = pResData->sId; else sLID = pResData->sId; ByteString sXText; ByteString sXHText; ByteString sXQHText; ByteString sXTitle; ByteString sTimeStamp( Export::GetTimeStamp()); ByteString sCur; for( unsigned int n = 0; n < aLanguages.size(); n++ ){ sCur = aLanguages[ n ]; if ( !sCur.EqualsIgnoreCaseAscii("x-comment") ){ if (pResData->sText[ sCur ].getLength()) sXText = pResData->sText[ sCur ]; else { sXText = pResData->sText[ SOURCE_LANGUAGE ]; } if (pResData->sHelpText[ sCur ].getLength()) sXHText = pResData->sHelpText[ sCur ]; else { sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ]; } if (pResData->sQuickHelpText[ sCur ].getLength()) sXQHText = pResData->sQuickHelpText[ sCur ]; else { sXQHText = pResData->sQuickHelpText[ SOURCE_LANGUAGE ]; } if (pResData->sTitle[ sCur ].getLength()) sXTitle = pResData->sTitle[ sCur ]; else sXTitle = pResData->sTitle[ SOURCE_LANGUAGE ]; if ( !sXText.Len()) sXText = "-"; if ( !sXHText.Len()) { if (pResData->sHelpText[ SOURCE_LANGUAGE ].getLength()) sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ]; } } else sXText = pResData->sText[ sCur ]; if ( bEnableExport ) { ByteString sOutput( sProject ); sOutput += "\t"; if ( sRoot.Len()) sOutput += sActFileName; sOutput += "\t0\t"; sOutput += pResData->sResTyp; sOutput += "\t"; sOutput += sGID; sOutput += "\t"; sOutput += sLID; sOutput += "\t"; sOutput += pResData->sHelpId; sOutput += "\t"; sOutput += pResData->sPForm; sOutput += "\t"; sOutput += ByteString(rtl::OString::valueOf(static_cast(pResData->nWidth))); sOutput += "\t"; sOutput += sCur; sOutput += "\t"; sOutput += sXText; sOutput += "\t"; sOutput += sXHText; sOutput += "\t"; sOutput += sXQHText; sOutput+= "\t"; sOutput += sXTitle; sOutput += "\t"; sOutput += sTimeStamp; aOutput.WriteLine( sOutput ); } if ( bCreateNew ) { pResData->sText[ sCur ] = ""; pResData->sHelpText[ sCur ] = ""; pResData->sQuickHelpText[ sCur ]= ""; pResData->sTitle[ sCur ] = ""; } } } FillInFallbacks( pResData ); if ( pResData->pStringList ) { ByteString sList( "stringlist" ); WriteExportList( pResData, pResData->pStringList, sList, bCreateNew ); if ( bCreateNew ) pResData->pStringList = 0; } if ( pResData->pFilterList ) { ByteString sList( "filterlist" ); WriteExportList( pResData, pResData->pFilterList, sList, bCreateNew ); if ( bCreateNew ) pResData->pFilterList = 0; } if ( pResData->pItemList ) { ByteString sList( "itemlist" ); WriteExportList( pResData, pResData->pItemList, sList, bCreateNew ); if ( bCreateNew ) pResData->pItemList = 0; } if ( pResData->pPairedList ) { ByteString sList( "pairedlist" ); WriteExportList( pResData, pResData->pPairedList, sList, bCreateNew ); if ( bCreateNew ) pResData->pItemList = 0; } if ( pResData->pUIEntries ) { ByteString sList( "uientries" ); WriteExportList( pResData, pResData->pUIEntries, sList, bCreateNew ); if ( bCreateNew ) pResData->pUIEntries = 0; } return sal_True; } ByteString Export::GetPairedListID( const ByteString& sText ){ // < "STRING" ; IDENTIFIER ; > ; ByteString sIdent = sText.GetToken( 1, ';' ); sIdent.ToUpperAscii(); while( sIdent.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; sIdent.EraseTrailingChars( ' ' ); sIdent.EraseLeadingChars( ' ' ); return sIdent; } ByteString Export::GetPairedListString( const ByteString& sText ){ // < "STRING" ; IDENTIFIER ; > ; ByteString sString = sText.GetToken( 0, ';' ); while( sString.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; sString.EraseTrailingChars( ' ' ); ByteString s1 = sString.Copy( sString.Search( '\"' )+1 ); sString = s1.Copy( 0 , s1.SearchBackward( '\"' ) ); sString.EraseTrailingChars( ' ' ); sString.EraseLeadingChars( ' ' ); return sString; } ByteString Export::StripList( const ByteString& sText ){ ByteString s1 = sText.Copy( sText.Search( '\"' ) + 1 ); return s1.Copy( 0 , s1.SearchBackward( '\"' ) ); } /*****************************************************************************/ sal_Bool Export::WriteExportList( ResData *pResData, ExportList *pExportList, const ByteString &rTyp, sal_Bool bCreateNew ) /*****************************************************************************/ { ByteString sGID = pResData->sGId; if ( !sGID.Len()) sGID = pResData->sId; else { sGID += "."; sGID += pResData->sId; sGID.EraseTrailingChars( '.' ); } ByteString sTimeStamp( Export::GetTimeStamp()); ByteString sCur; for ( size_t i = 0; pExportList != NULL && i < pExportList->size(); i++ ) { ExportListEntry *pEntry = (*pExportList)[ i ]; // mandatory for export: german and eng. and/or enus // ByteString a("Export::WriteExportList::pEntry"); // Export::DumpMap( a, *pEntry ); ByteString sLID(rtl::OString::valueOf(static_cast(i + 1))); for (unsigned int n = 0; n < aLanguages.size(); ++n) { sCur = aLanguages[ n ]; if ((*pEntry)[ SOURCE_LANGUAGE ].getLength()) { if ( bEnableExport ) { ByteString sText((*pEntry)[ SOURCE_LANGUAGE ] ); // Strip PairList Line String if( rTyp.EqualsIgnoreCaseAscii("pairedlist") ) { sLID = GetPairedListID( sText ); if ((*pEntry)[ sCur ].getLength()) sText = (*pEntry)[ sCur ]; sText = GetPairedListString( sText ); } else { sText = StripList( (*pEntry)[ sCur ] ); if( sText == "\\\"" ) sText = "\""; } ByteString sOutput( sProject ); sOutput += "\t"; if ( sRoot.Len()) sOutput += sActFileName; sOutput += "\t0\t"; sOutput += rTyp; sOutput += "\t"; sOutput += sGID; sOutput += "\t"; sOutput += sLID; sOutput += "\t\t"; sOutput += pResData->sPForm; sOutput += "\t0\t"; sOutput += sCur; sOutput += "\t"; sOutput += sText; sOutput += "\t\t\t\t"; sOutput += sTimeStamp; aOutput.WriteLine( sOutput ); } } } if ( bCreateNew ) delete [] pEntry; } if ( bCreateNew ) delete pExportList; return sal_True; } /*****************************************************************************/ ByteString Export::FullId() /*****************************************************************************/ { ByteString sFull; if ( nLevel > 1 ) { sFull = aResStack[ 0 ]->sId; for ( size_t i = 1; i < nLevel - 1; i++ ) { ByteString sToAdd = aResStack[ i ]->sId; if ( sToAdd.Len()) { sFull += "."; sFull += sToAdd; } } } if ( sFull.Len() > 255 ) { rtl::OString sError(RTL_CONSTASCII_STRINGPARAM("GroupId > 255 chars")); printf("GroupID = %s\n", sFull.GetBuffer()); yyerror(sError.getStr()); } return sFull; } /*****************************************************************************/ void Export::InsertListEntry( const ByteString &rText, const ByteString &rLine ) /*****************************************************************************/ { ResData *pResData = ( nLevel-1 < aResStack.size() ) ? aResStack[ nLevel-1 ] : NULL; ExportList *pList = NULL; if ( nList == LIST_STRING ) { pList = pResData->pStringList; if ( !pList ) { pResData->pStringList = new ExportList(); pList = pResData->pStringList; nListIndex = 0; } } else if ( nList == LIST_FILTER ) { pList = pResData->pFilterList; if ( !pList ) { pResData->pFilterList = new ExportList(); pList = pResData->pFilterList; nListIndex = 0; } } else if ( nList == LIST_ITEM ) { pList = pResData->pItemList; if ( !pList ) { pResData->pItemList = new ExportList(); pList = pResData->pItemList; nListIndex = 0; } } else if ( nList == LIST_PAIRED ) { pList = pResData->pPairedList; if ( !pList ) { pResData->pPairedList = new ExportList(); pList = pResData->pPairedList; nListIndex = 0; } } else if ( nList == LIST_UIENTRIES ) { pList = pResData->pUIEntries; if ( !pList ) { pResData->pUIEntries = new ExportList(); pList = pResData->pUIEntries; nListIndex = 0; } } else return; if ( nListIndex + 1 > pList->size()) { ExportListEntry *pNew = new ExportListEntry(); (*pNew)[LIST_REFID] = rtl::OString::valueOf(static_cast(REFID_NONE)); pList->push_back(pNew); } ExportListEntry *pCurEntry = (*pList)[ nListIndex ]; // For paired list use the line to set proper lid if( nList == LIST_PAIRED ){ (*pCurEntry)[ m_sListLang ] = rLine; }else (*pCurEntry)[ m_sListLang ] = rText; // Remember en-US fallback string, so each list has the same amount of elements if ( Export::isSourceLanguage( m_sListLang ) ) { if( nList == LIST_PAIRED ){ const ByteString sPlist("pairedlist"); ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sId , GetPairedListID( rLine ) , sFilename ); pResData->addFallbackData( sKey , rText ); } // new fallback else{ const ByteString sPlist("list"); ByteString a( pResData->sGId ); a.Append( "." ); a.Append( pResData->sId ); sal_Int64 x = nListIndex+1; ByteString b(rtl::OString::valueOf(x)); ByteString sKey = MergeDataFile::CreateKey( sPlist , a , b , sFilename ); pResData->addFallbackData( sKey , rText ); } // new fallback } if ( Export::isSourceLanguage( m_sListLang ) ) { if( nList == LIST_PAIRED ){ (*pCurEntry)[ SOURCE_LANGUAGE ] = rLine; } else (*pCurEntry)[ SOURCE_LANGUAGE ] = rLine; pList->NewSourceLanguageListEntry(); } //printf("Export::InsertListEntry ResData.id = %s ResData.ListData = %s\n",pResData->sId.GetBuffer() ,(*pCurEntry)[ m_sListLang ].GetBuffer()); nListIndex++; } /*****************************************************************************/ void Export::CleanValue( ByteString &rValue ) /*****************************************************************************/ { while ( rValue.Len()) { if (( rValue.GetChar( 0 ) == ' ' ) || ( rValue.GetChar( 0 ) == '\t' )) rValue = rValue.Copy( 1 ); else break; } if ( rValue.Len()) { for ( sal_uInt16 i = rValue.Len() - 1; i > 0; i-- ) { if (( rValue.GetChar( i ) == ' ' ) || ( rValue.GetChar( i ) == '\t' ) || ( rValue.GetChar( i ) == '\n' ) || ( rValue.GetChar( i ) == ';' ) || ( rValue.GetChar( i ) == '{' ) || ( rValue.GetChar( i ) == '\\' ) || ( rValue.GetChar( i ) == '\r' )) rValue.Erase( i ); else break; } } } /*****************************************************************************/ ByteString Export::GetText( const ByteString &rSource, int nToken ) /*****************************************************************************/ #define TXT_STATE_NON 0x000 #define TXT_STATE_TEXT 0x001 #define TXT_STATE_MACRO 0x002 { ByteString sReturn; switch ( nToken ) { case TEXTLINE: case LONGTEXTLINE: { ByteString sTmp( rSource.Copy( rSource.Search( "=" ))); CleanValue( sTmp ); sTmp.EraseAllChars( '\n' ); sTmp.EraseAllChars( '\r' ); while ( sTmp.SearchAndReplace( "\\\\\"", "-=<[BSlashBSlashHKom]>=-\"" ) != STRING_NOTFOUND ) {}; while ( sTmp.SearchAndReplace( "\\\"", "-=<[Hochkomma]>=-" ) != STRING_NOTFOUND ) {}; while ( sTmp.SearchAndReplace( "\\", "-=<[0x7F]>=-" ) != STRING_NOTFOUND ) {}; while ( sTmp.SearchAndReplace( "\\0x7F", "-=<[0x7F]>=-" ) != STRING_NOTFOUND ) {}; sal_uInt16 nStart = 0; sal_uInt16 nState = TXT_STATE_MACRO; nState = TXT_STATE_TEXT; nStart = 1; for ( sal_uInt16 i = nStart; i < sTmp.GetTokenCount( '\"' ); i++ ) { ByteString sToken = sTmp.GetToken( i, '\"' ); if ( sToken.Len()) { if ( nState == TXT_STATE_TEXT ) { sReturn += sToken; nState = TXT_STATE_MACRO; } else { while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {}; while( sToken.SearchAndReplace( " ", " " ) != STRING_NOTFOUND ) {}; sToken.EraseLeadingChars( ' ' ); sToken.EraseTrailingChars( ' ' ); if ( sToken.Len()) { sReturn += "\\\" "; sReturn += sToken; sReturn += " \\\""; } nState = TXT_STATE_TEXT; } } } while ( sReturn.SearchAndReplace( "-=<[0x7F]>=-", "" ) != STRING_NOTFOUND ) {}; while ( sReturn.SearchAndReplace( "-=<[Hochkomma]>=-", "\"" ) != STRING_NOTFOUND ) {}; while ( sReturn.SearchAndReplace( "-=<[BSlashBSlashHKom]>=-", "\\\\" ) != STRING_NOTFOUND ) {}; while ( sReturn.SearchAndReplace( "\\\\", "-=<[BSlashBSlash]>=-" ) != STRING_NOTFOUND ) {}; while ( sReturn.SearchAndReplace( "-=<[BSlashBSlash]>=-", "\\" ) != STRING_NOTFOUND ) {}; } break; } return sReturn; } /*****************************************************************************/ void Export::WriteToMerged( const ByteString &rText , bool bSDFContent ) /*****************************************************************************/ { static ByteString SLASH ('\\'); static ByteString RETURN ('\n'); //printf("%s\n",rText.GetBuffer() ); if ( !bDontWriteOutput || !bUnmerge ) { ByteString sText( rText ); while ( sText.SearchAndReplace( " \n", "\n" ) != STRING_NOTFOUND ) {}; if( pParseQueue->bNextIsM && bSDFContent && sText.Len() > 2 ){ for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){ if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){ sText.Insert('\\' , n++ ); } } } else if( pParseQueue->bLastWasM && sText.Len() > 2 ){ for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){ if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){ sText.Insert('\\' , n++ ); } if( sText.GetChar( n ) == '\n' )pParseQueue->bMflag=true; } } else if( pParseQueue->bCurrentIsM && bSDFContent && sText.Len() > 2 ){ for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){ if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){ sText.Insert('\\' , n++ ); pParseQueue->bMflag=true; } } } else if( pParseQueue->bMflag ){ for( sal_uInt16 n = 1 ; n < sText.Len() ; n++ ){ if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){ sText.Insert('\\' , n++ ); } } } for ( sal_uInt16 i = 0; i < sText.Len(); i++ ) { if ( sText.GetChar( i ) != '\n' ){ aOutput.Write( ByteString( sText.GetChar( i )).GetBuffer(), 1 ); } else{ aOutput.WriteLine( ByteString()); } } } } /*****************************************************************************/ void Export::ConvertMergeContent( ByteString &rText ) /*****************************************************************************/ { sal_Bool bNoOpen = ( rText.Search( "\\\"" ) != 0 ); ByteString sClose( rText.Copy( rText.Len() - 2 )); sal_Bool bNoClose = ( sClose != "\\\"" ); ByteString sNew; for ( sal_uInt16 i = 0; i < rText.Len(); i++ ) { ByteString sChar( rText.GetChar( i )); if ( sChar == "\\" ) { if (( i + 1 ) < rText.Len()) { ByteString sNext( rText.GetChar( i + 1 )); if ( sNext == "\"" ) { sChar = "\""; i++; } else if ( sNext == "n" ) { sChar = "\\n"; i++; } else if ( sNext == "t" ) { sChar = "\\t"; i++; } else if ( sNext == "\'" ) { sChar = "\\\'"; i++; } else sChar = "\\\\"; } else { sChar = "\\\\"; } } else if ( sChar == "\"" ) { sChar = "\\\""; } else if ( sChar == "" ) { sChar = "\\0x7F"; } sNew += sChar; } rText = sNew; if ( bNoOpen ) { ByteString sTmp( rText ); rText = "\""; rText += sTmp; } if ( bNoClose ) rText += "\""; } sal_Bool Export::PrepareTextToMerge(ByteString &rText, sal_uInt16 nTyp, rtl::OString &rLangIndex, ResData *pResData) { // position to merge in: sal_uInt16 nStart = 0; sal_uInt16 nEnd = 0; ByteString sOldId = pResData->sId; ByteString sOldGId = pResData->sGId; ByteString sOldTyp = pResData->sResTyp; ByteString sOrigText( rText ); switch ( nTyp ) { case LIST_STRING : case LIST_UIENTRIES : case LIST_FILTER : case LIST_PAIRED: case LIST_ITEM : { if ( bUnmerge ) return sal_True; ExportList *pList = NULL; switch ( nTyp ) { case LIST_STRING : { pResData->sResTyp = "stringlist"; pList = pResData->pStringList; } break; case LIST_UIENTRIES : { pResData->sResTyp = "uientries"; pList = pResData->pUIEntries; } break; case LIST_FILTER : { pResData->sResTyp = "filterlist"; pList = pResData->pFilterList; } break; case LIST_ITEM : { pResData->sResTyp = "itemlist"; pList = pResData->pItemList; } break; case LIST_PAIRED : { pResData->sResTyp = "pairedlist"; pList = pResData->pPairedList; } break; } if (pList) { ExportListEntry *pCurEntry = (*pList)[ nListIndex - 1 ]; if ( pCurEntry ) { rText = (*pCurEntry)[ SOURCE_LANGUAGE ]; if( nTyp == LIST_PAIRED ) pResData->addMergedLanguage(rLangIndex); } } nStart = rText.Search( "\"" ); if ( nStart == STRING_NOTFOUND ) { rText = sOrigText; return sal_False; } sal_Bool bFound = sal_False; for ( nEnd = nStart + 1; nEnd < rText.Len() && !bFound; nEnd++ ) { if ( rText.GetChar( nEnd ) == '\"' ) bFound = sal_True; } if ( !bFound ) { rText = sOrigText; return sal_False; } nEnd --; sLastListLine = rText; if (( sLastListLine.Search( ">" ) != STRING_NOTFOUND ) && ( sLastListLine.Search( "<" ) == STRING_NOTFOUND )) { ByteString sTmp = sLastListLine; sLastListLine = "<"; sLastListLine += sTmp; } if ( pResData->sResTyp.EqualsIgnoreCaseAscii( "pairedlist" ) ){ pResData->sId = GetPairedListID( sLastListLine ); } else pResData->sId = rtl::OString::valueOf(static_cast(nListIndex)); if ( pResData->sGId.Len()) pResData->sGId += "."; pResData->sGId += sOldId; nTyp = STRING_TYP_TEXT; } break; case STRING_TYP_TEXT : case STRING_TYP_HELPTEXT : case STRING_TYP_QUICKHELPTEXT : case STRING_TYP_TITLE : { nStart = rText.Search( "=" ); if ( nStart == STRING_NOTFOUND ) { rText = sOrigText; return sal_False; } nStart++; sal_Bool bFound = sal_False; while(( nStart < rText.Len()) && !bFound ) { if (( rText.GetChar( nStart ) != ' ' ) && ( rText.GetChar( nStart ) != '\t' )) bFound = sal_True; else nStart ++; } // no start position found if ( !bFound ) { rText = sOrigText; return sal_False; } // position to end mergeing in nEnd = rText.Len() - 1; bFound = sal_False; while (( nEnd > nStart ) && !bFound ) { if (( rText.GetChar( nEnd ) != ' ' ) && ( rText.GetChar( nEnd ) != '\t' ) && ( rText.GetChar( nEnd ) != '\n' ) && ( rText.GetChar( nEnd ) != ';' ) && ( rText.GetChar( nEnd ) != '{' ) && ( rText.GetChar( nEnd ) != '\\' )) { bFound = sal_True; } else nEnd --; } } break; } // search for merge data if ( !pMergeDataFile ){ pMergeDataFile = new MergeDataFile( sMergeSrc, sFile , bErrorLog, aCharSet);//, bUTF8 ); // Init Languages ByteString sTmp = Export::sLanguages; if( sTmp.ToUpperAscii().Equals("ALL") ) SetLanguages( pMergeDataFile->GetLanguages() ); else if( !isInitialized )InitLanguages(); } PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); pResData->sId = sOldId; pResData->sGId = sOldGId; pResData->sResTyp = sOldTyp; if ( !pEntrys ) { rText = sOrigText; return sal_False; // no data found } ByteString sContent; pEntrys->GetTransex3Text(sContent, nTyp, rLangIndex); if (!sContent.Len() && (!Export::isSourceLanguage(rLangIndex))) { rText = sOrigText; return sal_False; // no data found } if (Export::isSourceLanguage(rLangIndex)) return sal_False; ByteString sPostFix( rText.Copy( ++nEnd )); rText.Erase( nStart ); ConvertMergeContent( sContent ); // merge new res. in text line rText += sContent; rText += sPostFix; return sal_True; } /*****************************************************************************/ void Export::MergeRest( ResData *pResData, sal_uInt16 nMode ) /*****************************************************************************/ { if ( !pMergeDataFile ){ pMergeDataFile = new MergeDataFile( sMergeSrc, sFile ,bErrorLog, aCharSet);//, bUTF8 ); // Init Languages ByteString sTmp = Export::sLanguages; if( sTmp.ToUpperAscii().Equals("ALL") ) SetLanguages( pMergeDataFile->GetLanguages() ); else if( !isInitialized )InitLanguages(); } switch ( nMode ) { case MERGE_MODE_NORMAL : { PFormEntrys *pEntry = pMergeDataFile->GetPFormEntrys( pResData ); bool bWriteNoSlash = false; if ( pEntry && pResData->bText ) { sal_Bool bAddSemikolon = sal_False; sal_Bool bFirst = sal_True; ByteString sCur; ByteString sTmp = Export::sLanguages; for( unsigned int n = 0; n < aLanguages.size(); n++ ){ sCur = aLanguages[ n ]; ByteString sText; sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_TEXT, sCur , sal_True ); if ( bText && sText.Len() && sText != "-" ) { ByteString sOutput; if ( bNextMustBeDefineEOL) { if ( bFirst ) sOutput += "\t\\\n"; else sOutput += ";\t\\\n"; } bFirst=sal_False; sOutput += "\t"; sOutput += pResData->sTextTyp; if ( ! Export::isSourceLanguage( sCur ) ) { sOutput += "[ "; sOutput += sCur; sOutput += " ] "; } sOutput += "= "; ConvertMergeContent( sText ); sOutput += sText; if ( bDefine && bWriteNoSlash ) sOutput += ";\n"; if ( bDefine ) sOutput += ";\\\n"; else if ( !bNextMustBeDefineEOL ) sOutput += ";\n"; else bAddSemikolon = sal_True; for ( sal_uInt16 j = 1; j < nLevel; j++ ) sOutput += "\t"; WriteToMerged( sOutput , true ); } } if ( bAddSemikolon ) { ByteString sOutput( ";" ); WriteToMerged( sOutput , false ); } } if ( pEntry && pResData->bQuickHelpText ) { sal_Bool bAddSemikolon = sal_False; sal_Bool bFirst = sal_True; ByteString sCur; for( unsigned int n = 0; n < aLanguages.size(); n++ ){ sCur = aLanguages[ n ]; ByteString sText; sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_QUICKHELPTEXT, sCur, sal_True ); if ( bText && sText.Len() && sText != "-" ) { ByteString sOutput; if ( bNextMustBeDefineEOL) { if ( bFirst ) sOutput += "\t\\\n"; else sOutput += ";\t\\\n"; } bFirst=sal_False; sOutput += "\t"; sOutput += "QuickHelpText"; if ( ! Export::isSourceLanguage( sCur ) ) { sOutput += "[ "; sOutput += sCur; sOutput += " ] "; } sOutput += "= "; ConvertMergeContent( sText ); sOutput += sText; if ( bDefine ) sOutput += ";\\\n"; else if ( !bNextMustBeDefineEOL ) sOutput += ";\n"; else bAddSemikolon = sal_True; for ( sal_uInt16 j = 1; j < nLevel; j++ ) sOutput += "\t"; WriteToMerged( sOutput ,true ); } } if ( bAddSemikolon ) { ByteString sOutput( ";" ); WriteToMerged( sOutput , false ); } } if ( pEntry && pResData->bTitle ) { sal_Bool bAddSemikolon = sal_False; sal_Bool bFirst = sal_True; ByteString sCur; for( unsigned int n = 0; n < aLanguages.size(); n++ ){ sCur = aLanguages[ n ]; ByteString sText; sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_TITLE, sCur, sal_True ); if ( bText && sText.Len() && sText != "-" ) { ByteString sOutput; if ( bNextMustBeDefineEOL) { if ( bFirst ) sOutput += "\t\\\n"; else sOutput += ";\t\\\n"; } bFirst=sal_False; sOutput += "\t"; sOutput += "Title"; if ( ! Export::isSourceLanguage( sCur ) ) { sOutput += "[ "; sOutput += sCur; sOutput += " ] "; } sOutput += "= "; ConvertMergeContent( sText ); sOutput += sText; if ( bDefine ) sOutput += ";\\\n"; else if ( !bNextMustBeDefineEOL ) sOutput += ";\n"; else bAddSemikolon = sal_True; for ( sal_uInt16 j = 1; j < nLevel; j++ ) sOutput += "\t"; WriteToMerged( sOutput ,true ); } } if ( bAddSemikolon ) { ByteString sOutput( ";" ); WriteToMerged( sOutput ,false); } } // Merge Lists if ( pResData->bList ) { bool bPairedList = false; ByteString sOldId = pResData->sId; ByteString sOldGId = pResData->sGId; ByteString sOldTyp = pResData->sResTyp; if ( pResData->sGId.Len()) pResData->sGId += "."; pResData->sGId += sOldId; ByteString sSpace; for ( sal_uInt16 i = 1; i < nLevel-1; i++ ) sSpace += "\t"; for ( sal_uInt16 nT = LIST_STRING; nT <= LIST_UIENTRIES; nT++ ) { ExportList *pList = NULL; switch ( nT ) { case LIST_STRING : pResData->sResTyp = "stringlist"; pList = pResData->pStringList; bPairedList = false; break; case LIST_FILTER : pResData->sResTyp = "filterlist"; pList = pResData->pFilterList; bPairedList = false; break; case LIST_UIENTRIES : pResData->sResTyp = "uientries"; pList = pResData->pUIEntries;bPairedList = false; break; case LIST_ITEM : pResData->sResTyp = "itemlist"; pList = pResData->pItemList; bPairedList = false; break; case LIST_PAIRED : pResData->sResTyp = "pairedlist"; pList = pResData->pPairedList; bPairedList = true; break; } rtl::OString sCur; for( unsigned int n = 0; n < aLanguages.size(); n++ ) { sCur = aLanguages[ n ]; sal_uInt16 nIdx = 1; // Set matching pairedlist identifier if( bPairedList && pResData->pPairedList && ( nIdx == 1 ) ){ ExportListEntry* pListE = ( ExportListEntry* ) (*pResData->pPairedList)[ nIdx-1 ]; pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] ); } else pResData->sId = ByteString("1"); PFormEntrys *pEntrys; sal_uLong nLIndex = 0; sal_uLong nMaxIndex = 0; if ( pList ) nMaxIndex = pList->GetSourceLanguageListEntryCount(); pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); while( pEntrys && ( nLIndex < nMaxIndex )) { ByteString sText; sal_Bool bText; bText = pEntrys->GetTransex3Text( sText, STRING_TYP_TEXT, sCur, sal_True ); if( !bText ) bText = pEntrys->GetTransex3Text( sText , STRING_TYP_TEXT, SOURCE_LANGUAGE , sal_False ); // Use fallback, if data is missing in sdf file if( !bText && bPairedList ) { if( pResData->isMerged( sCur ) ) break; const ByteString sPlist("pairedlist"); ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sGId , pResData->sId , sFilename ); bText = pResData->getFallbackData( sKey , sText ); } else if ( !bText ) // new fallback { if( pResData->isMerged( sCur ) ) break; const ByteString sPlist("list"); ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sGId , pResData->sId , sFilename ); bText = pResData->getFallbackData( sKey , sText ); } // new fallback if ( bText && sText.Len()) { if ( nIdx == 1 ) { rtl::OStringBuffer sHead; if ( bNextMustBeDefineEOL ) sHead.append(RTL_CONSTASCII_STRINGPARAM("\\\n\t")); sHead.append(sSpace); switch ( nT ) { case LIST_STRING: sHead.append(RTL_CONSTASCII_STRINGPARAM("StringList ")); break; case LIST_FILTER: sHead.append(RTL_CONSTASCII_STRINGPARAM("FilterList ")); break; case LIST_ITEM: sHead.append(RTL_CONSTASCII_STRINGPARAM("ItemList ")); break; case LIST_PAIRED: sHead.append(RTL_CONSTASCII_STRINGPARAM("PairedList ")); break; case LIST_UIENTRIES: sHead.append(RTL_CONSTASCII_STRINGPARAM("UIEntries ")); break; } sHead.append(RTL_CONSTASCII_STRINGPARAM("[ ")); sHead.append(sCur); sHead.append(RTL_CONSTASCII_STRINGPARAM(" ] ")); //} if ( bDefine || bNextMustBeDefineEOL ) { sHead.append(RTL_CONSTASCII_STRINGPARAM("= \\\n")); sHead.append(sSpace); sHead.append(RTL_CONSTASCII_STRINGPARAM("\t{\\\n\t")); } else { sHead.append(RTL_CONSTASCII_STRINGPARAM("= \n")); sHead.append(sSpace); sHead.append(RTL_CONSTASCII_STRINGPARAM("\t{\n\t")); } WriteToMerged(sHead.makeStringAndClear() , true); } ByteString sLine; if ( pList && (*pList)[ nLIndex ] ) sLine = ( *(*pList)[ nLIndex ])[ SOURCE_LANGUAGE ]; if ( !sLine.Len()) sLine = sLastListLine; if ( sLastListLine.Search( "<" ) != STRING_NOTFOUND ) { if (( nT != LIST_UIENTRIES ) && (( sLine.Search( "{" ) == STRING_NOTFOUND ) || ( sLine.Search( "{" ) >= sLine.Search( "\"" ))) && (( sLine.Search( "<" ) == STRING_NOTFOUND ) || ( sLine.Search( "<" ) >= sLine.Search( "\"" )))) { sLine.SearchAndReplace( "\"", "< \"" ); } } sal_uInt16 nStart, nEnd; nStart = sLine.Search( "\"" ); ByteString sPostFix; if( !bPairedList ){ nEnd = sLine.SearchBackward( '\"' ); sPostFix = ByteString( sLine.Copy( ++nEnd )); sLine.Erase( nStart ); } ConvertMergeContent( sText ); // merge new res. in text line if( bPairedList ){ sLine = MergePairedList( sLine , sText ); } else{ sLine += sText; sLine += sPostFix; } ByteString sText1( "\t" ); sText1 += sLine; if ( bDefine || bNextMustBeDefineEOL ) sText1 += " ;\\\n"; else sText1 += " ;\n"; sText1 += sSpace; sText1 += "\t"; WriteToMerged( sText1 ,true ); // Set matching pairedlist identifier if ( bPairedList ){ nIdx++; ExportListEntry* pListE = ( ExportListEntry* )(*pResData->pPairedList)[ ( nIdx ) -1 ]; if( pListE ){ pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] ); } } else pResData->sId = rtl::OString::valueOf(static_cast(++nIdx)); } else break; nLIndex ++; PFormEntrys *oldEntry = pEntrys; pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); if( !pEntrys ) pEntrys = oldEntry; } if ( nIdx > 1 ) { ByteString sFooter( sSpace.Copy( 1 )); if ( bNextMustBeDefineEOL ) sFooter += "};"; else if ( !bDefine ) sFooter += "};\n\t"; else sFooter += "\n\n"; WriteToMerged( sFooter ,true ); } } } pResData->sId = sOldId; pResData->sGId = sOldGId; pResData->sResTyp = sOldTyp; } } break; case MERGE_MODE_LIST : { ExportList *pList = NULL; switch ( nList ) { // PairedList case LIST_STRING : pList = pResData->pStringList; break; case LIST_FILTER : pList = pResData->pFilterList; break; case LIST_UIENTRIES : pList = pResData->pUIEntries; break; case LIST_ITEM : pList = pResData->pItemList; break; case LIST_PAIRED : pList = pResData->pPairedList; break; } nListIndex++; sal_uLong nMaxIndex = 0; if ( pList ) nMaxIndex = pList->GetSourceLanguageListEntryCount(); ByteString sLine; if ( pList && (*pList)[ nListIndex ] ) sLine = ( *(*pList)[ nListIndex ])[ SOURCE_LANGUAGE ]; if ( !sLine.Len()) sLine = sLastListLine; if ( sLastListLine.Search( "<" ) != STRING_NOTFOUND ) { if (( nList != LIST_UIENTRIES ) && (( sLine.Search( "{" ) == STRING_NOTFOUND ) || ( sLine.Search( "{" ) >= sLine.Search( "\"" ))) && (( sLine.Search( "<" ) == STRING_NOTFOUND ) || ( sLine.Search( "<" ) >= sLine.Search( "\"" )))) { sLine.SearchAndReplace( "\"", "< \"" ); } } while( PrepareTextToMerge( sLine, nList, m_sListLang, pResData ) && ( nListIndex <= nMaxIndex )) { ByteString sText( "\t" ); sText += sLine; sText += " ;"; sText += "\n"; for ( sal_uInt16 i = 0; i < nLevel; i++ ) sText += "\t"; WriteToMerged( sText ,false ); nListIndex++; if ( pList && (*pList)[ nListIndex ]) sLine = ( *(*pList)[ nListIndex ])[ SOURCE_LANGUAGE ]; if ( !sLine.Len()) sLine = sLastListLine; sLine += " ;"; } } break; } pParseQueue->bMflag = false; } ByteString Export::MergePairedList( ByteString& sLine , ByteString& sText ){ // < "xy" ; IDENTIFIER ; > ByteString sPre = sLine.Copy( 0 , sLine.Search('\"') ); ByteString sPost = sLine.Copy( sLine.SearchBackward('\"') + 1 , sLine.Len() ); sPre.Append( sText ); sPre.Append( sPost ); return sPre; } /*****************************************************************************/ void Export::SetChildWithText() /*****************************************************************************/ { if ( aResStack.size() > 1 ) { for ( size_t i = 0; i < aResStack.size() - 1; i++ ) { aResStack[ i ]->bChildWithText = sal_True; } } } void ParserQueue::Push( const QueueEntry& aEntry ){ sal_uInt16 nLen = aEntry.sLine.Len(); if( !bStart ){ aQueueCur->push( aEntry ); if( nLen > 1 && aEntry.sLine.GetChar( nLen-1 ) == '\n' ) bStart = true; else if ( aEntry.nTyp != IGNOREDTOKENS ){ if( nLen > 1 && ( aEntry.sLine.GetChar( nLen-1 ) == '\\') ){ // Next is Macro bCurrentIsM = true; }else{ // Next is no Macro bCurrentIsM = false; } } } else{ aQueueNext->push( aEntry ); if( nLen > 1 && aEntry.sLine.GetChar( nLen-1 ) != '\n' ){ if( nLen > 1 && ( aEntry.sLine.GetChar( nLen-1 ) == '\\') ){ // Next is Macro bNextIsM = true; } else{ // Next is no Macro bNextIsM = false; } }else if( nLen > 2 && aEntry.sLine.GetChar( nLen-1 ) == '\n' ){ if( aEntry.nTyp != IGNOREDTOKENS ){ if( nLen > 2 && ( aEntry.sLine.GetChar( nLen-2 ) == '\\') ){ // Next is Macro bNextIsM = true; } else{ // Next is no Macro bNextIsM = false; } } // Pop current Pop( *aQueueCur ); bLastWasM = bCurrentIsM; // next -> current bCurrentIsM = bNextIsM; aQref = aQueueCur; aQueueCur = aQueueNext; aQueueNext = aQref; } else{ // Pop current Pop( *aQueueCur ); bLastWasM = bCurrentIsM; // next -> current bCurrentIsM = bNextIsM; aQref = aQueueCur; aQueueCur = aQueueNext; aQueueNext = aQref; } } } void ParserQueue::Close(){ // Pop current Pop( *aQueueCur ); // next -> current bLastWasM = bCurrentIsM; bCurrentIsM = bNextIsM; aQref = aQueueCur; aQueueCur = aQueueNext; aQueueNext = aQref; bNextIsM = false; Pop( *aQueueNext ); }; void ParserQueue::Pop( std::queue& aQueue ){ while( !aQueue.empty() ){ QueueEntry aEntry = aQueue.front(); aQueue.pop(); aExport.Execute( aEntry.nTyp , (char*) aEntry.sLine.GetBuffer() ); } } ParserQueue::ParserQueue( Export& aExportObj ) : bCurrentIsM( false ), bNextIsM( false ) , bLastWasM( false ), bMflag( false ) , aExport( aExportObj ) , bStart( false ) , bStartNext( false ) { aQueueNext = new std::queue; aQueueCur = new std::queue; } ParserQueue::~ParserQueue(){ if( aQueueNext ) delete aQueueNext; if( aQueueCur ) delete aQueueCur; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */