summaryrefslogtreecommitdiff
path: root/l10ntools/source/export.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'l10ntools/source/export.cxx')
-rw-r--r--l10ntools/source/export.cxx2463
1 files changed, 2463 insertions, 0 deletions
diff --git a/l10ntools/source/export.cxx b/l10ntools/source/export.cxx
new file mode 100644
index 000000000000..e3ee7aee552a
--- /dev/null
+++ b/l10ntools/source/export.cxx
@@ -0,0 +1,2463 @@
+/* -*- 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_l10ntools.hxx"
+#include <stdio.h>
+#include <stdlib.h>
+#include <tools/fsys.hxx>
+#include "export.hxx"
+#include "tokens.h"
+#include "utf8conv.hxx"
+#include <iostream>
+#include <vector>
+
+extern "C" { int yyerror( char * ); }
+extern "C" { int YYWarning( 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( ByteString& sLang ){
+ aMergedLanguages[ sLang ]=ByteString("1");
+}
+bool ResData::isMerged( ByteString& sLang ){
+ return aMergedLanguages[ sLang ].Equals("1");
+}
+
+/*****************************************************************************/
+sal_Bool ResData::SetId( const ByteString &rId, sal_uInt16 nLevel )
+/*****************************************************************************/
+{
+ if ( nLevel > nIdLevel )
+ {
+ nIdLevel = nLevel;
+ sId = rId;
+
+ if ( bChild && bChildWithText ) {
+ ByteString sError( "ResId after child definition" );
+ yyerror( sError.GetBufferAccess());
+ sError.ReleaseBufferAccess();
+ 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;
+ nListLang = 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;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+ else if ( sKey == "FILTERLIST" ) {
+ pResData->bList = sal_True;
+ nList = LIST_FILTER;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+ else if ( sKey == "UIENTRIES" ) {
+ pResData->bList = sal_True;
+ nList = LIST_UIENTRIES;
+ nListLang = 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;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+ else if ( sKey == "FILTERLIST" ) {
+ pResData->bList = sal_True;
+ nList = LIST_FILTER;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+ // PairedList
+ else if ( sKey == "PAIREDLIST" ) {
+ pResData->bList = sal_True;
+ nList = LIST_PAIRED;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+
+ else if ( sKey == "ITEMLIST" ) {
+ pResData->bList = sal_True;
+ nList = LIST_ITEM;
+ nListLang = SOURCE_LANGUAGE;
+ nListIndex = 0;
+ nListLevel = 0;
+ }
+ else if ( sKey == "UIENTRIES" ) {
+ pResData->bList = sal_True;
+ nList = LIST_UIENTRIES;
+ nListLang = 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 );
+ nListLang = 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, nListLang, 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 );
+ }
+ ByteString nLangIndex = 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( nLangIndex ) )
+ pResData->SetId( sText, ID_LEVEL_TEXT );
+
+ pResData->bText = sal_True;
+ pResData->sTextTyp = sOrigKey;
+ if ( bMergeMode ) {
+ PrepareTextToMerge( sOrig, STRING_TYP_TEXT, nLangIndex, pResData );
+ }
+ else {
+ if ( pResData->sText[ nLangIndex ].Len()) {
+ ByteString sError( "Language " );
+ sError += nLangIndex;
+ sError += " defined twice";
+ }
+ pResData->sText[ nLangIndex ] = sText;
+ }
+ }
+ else if ( sKey == "HELPTEXT" ) {
+ SetChildWithText();
+ pResData->bHelpText = sal_True;
+ if ( bBreakWhenHelpText ) {
+ ByteString sError( "\"HelpText\" found in source\n" );
+ YYWarning( sError.GetBufferAccess());
+ sError.ReleaseBufferAccess();
+ SetError();
+ }
+ if ( bMergeMode )
+ PrepareTextToMerge( sOrig, STRING_TYP_HELPTEXT, nLangIndex, pResData );
+ else {
+ if ( pResData->sHelpText[ nLangIndex ].Len()) {
+ ByteString sError( "Language " );
+ sError += nLangIndex;
+ sError += " defined twice";
+ }
+ pResData->sHelpText[ nLangIndex ] = sText;
+ }
+ }
+ else if ( sKey == "QUICKHELPTEXT" ) {
+ SetChildWithText();
+ pResData->bQuickHelpText = sal_True;
+ if ( bMergeMode )
+ PrepareTextToMerge( sOrig, STRING_TYP_QUICKHELPTEXT, nLangIndex, pResData );
+ else {
+ if ( pResData->sQuickHelpText[ nLangIndex ].Len()) {
+ ByteString sError( "Language " );
+ sError += nLangIndex;
+ sError += " defined twice";
+ }
+ pResData->sQuickHelpText[ nLangIndex ] = sText;
+ }
+ }
+ else if ( sKey == "TITLE" ) {
+ SetChildWithText();
+ pResData->bTitle = sal_True;
+ if ( bMergeMode )
+ PrepareTextToMerge( sOrig, STRING_TYP_TITLE, nLangIndex, pResData );
+ else {
+ if ( pResData->sTitle[ nLangIndex ].Len()) {
+ ByteString sError( "Language " );
+ sError += nLangIndex;
+ sError += " defined twice";
+ }
+ pResData->sTitle[ nLangIndex ] = 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++;
+ }
+ }
+}
+
+void Export::UnmergeUTF8( ByteString& sOrig ){
+ sal_uInt16 nPos1 = sOrig.Search('\"');
+ sal_uInt16 nPos2 = sOrig.SearchBackward('\"');
+ if( nPos1 > 0 && nPos2 > 0 && nPos1 < nPos2){
+ ByteString sPart = sOrig.Copy(nPos1+1 , nPos2-1);
+ ByteString sPartUTF8 = sPart;
+ sPartUTF8.Convert( RTL_TEXTENCODING_MS_1252 , RTL_TEXTENCODING_UTF8 );
+ sOrig.SearchAndReplace( sPart , sPartUTF8 );
+ }
+}
+
+/*****************************************************************************/
+sal_Bool Export::ListExists( ResData *pResData, sal_uInt16 nLst )
+/*****************************************************************************/
+{
+ switch ( nLst ) {
+ case LIST_STRING: return pResData->pStringList != NULL;
+ case LIST_FILTER: return pResData->pFilterList != NULL;
+ case LIST_ITEM: return pResData->pItemList != NULL;
+ case LIST_PAIRED: return pResData->pPairedList != NULL;
+ case LIST_UIENTRIES: return pResData->pUIEntries != NULL;
+ }
+ return sal_False;
+}
+
+/*****************************************************************************/
+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 ].Len())
+ ||
+ ( pResData->sHelpText[ SOURCE_LANGUAGE ].Len())
+ ||
+ ( pResData->sQuickHelpText[ SOURCE_LANGUAGE ].Len())
+ ||
+ ( pResData->sTitle[ SOURCE_LANGUAGE ].Len()))
+
+ {
+ 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 ].Len())
+ sXText = pResData->sText[ sCur ];
+ else {
+ sXText = pResData->sText[ SOURCE_LANGUAGE ];
+ }
+
+ if ( pResData->sHelpText[ sCur ].Len())
+ sXHText = pResData->sHelpText[ sCur ];
+ else {
+ sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ];
+ }
+
+ if ( pResData->sQuickHelpText[ sCur ].Len())
+ sXQHText = pResData->sQuickHelpText[ sCur ];
+ else {
+ sXQHText = pResData->sQuickHelpText[ SOURCE_LANGUAGE ];
+ }
+
+ if ( pResData->sTitle[ sCur ].Len())
+ sXTitle = pResData->sTitle[ sCur ];
+ else {
+ sXTitle = pResData->sTitle[ SOURCE_LANGUAGE ];
+ }
+
+ if ( !sXText.Len())
+ sXText = "-";
+
+ if ( !sXHText.Len()) {
+ if ( pResData->sHelpText[ SOURCE_LANGUAGE ].Len())
+ 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::CreateFromInt64( 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( ByteString::CreateFromInt64( i + 1 ));
+ for( unsigned int n = 0; n < aLanguages.size(); n++ ){
+ sCur = aLanguages[ n ];
+ if ( (*pEntry)[ SOURCE_LANGUAGE ].Len() )
+ {
+ if ( bEnableExport )
+ {
+ ByteString sText((*pEntry)[ SOURCE_LANGUAGE ] );
+
+ // Strip PairList Line String
+ if( rTyp.EqualsIgnoreCaseAscii("pairedlist") ){
+ sLID = GetPairedListID( sText );
+ if ((*pEntry)[ sCur ].Len())
+ 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 ) {
+ ByteString sError( "GroupId > 255 chars" );
+ printf("GroupID = %s\n",sFull.GetBuffer());
+ yyerror( sError.GetBufferAccess());
+ sError.ReleaseBufferAccess();
+ }
+
+ 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 ] = ByteString::CreateFromInt32( 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)[ nListLang ] = rLine;
+ }else
+ (*pCurEntry)[ nListLang ] = rText;
+
+ // Remember en-US fallback string, so each list has the same amount of elements
+ if ( Export::isSourceLanguage( nListLang ) ) {
+ 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( ByteString::CreateFromInt64( x ) );
+ ByteString sKey = MergeDataFile::CreateKey( sPlist , a , b , sFilename );
+ pResData->addFallbackData( sKey , rText );
+ }
+ // new fallback
+ }
+
+ if ( Export::isSourceLanguage( nListLang ) ) {
+ 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)[ nListLang ].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,
+ ByteString &nLangIndex, 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( nLangIndex );
+ }
+ }
+ }
+
+ 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 = ByteString::CreateFromInt32( 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, nLangIndex );
+ if ( !sContent.Len() && ( ! Export::isSourceLanguage( nLangIndex ) )) {
+ rText = sOrigText;
+ return sal_False; // no data found
+ }
+
+ if ( Export::isSourceLanguage( nLangIndex ) ) {
+ 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;
+ }
+ ByteString 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 ) {
+ ByteString sHead;
+ if ( bNextMustBeDefineEOL )
+ sHead = "\\\n\t";
+ sHead += sSpace;
+ switch ( nT ) {
+ case LIST_STRING : sHead += "StringList "; break;
+ case LIST_FILTER : sHead += "FilterList "; break;
+ case LIST_ITEM : sHead += "ItemList "; break;
+ case LIST_PAIRED : sHead += "PairedList "; break;
+ case LIST_UIENTRIES : sHead += "UIEntries "; break;
+ }
+ sHead += "[ ";
+ sHead += sCur;
+ sHead += " ] ";
+ //}
+ if ( bDefine || bNextMustBeDefineEOL ) {
+ sHead += "= \\\n";
+ sHead += sSpace;
+ sHead += "\t{\\\n\t";
+ }
+ else {
+ sHead += "= \n";
+ sHead += sSpace;
+ sHead += "\t{\n\t";
+ }
+ WriteToMerged( sHead , 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 = ByteString::CreateFromInt32( ++nIdx );
+ }
+ else
+ break;
+ nLIndex ++;
+ PFormEntrys *oldEntry = pEntrys;
+ pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); // <--- game over
+ 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, nListLang, 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<QueueEntry>& 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<QueueEntry>;
+ aQueueCur = new std::queue<QueueEntry>;
+}
+
+
+ParserQueue::~ParserQueue(){
+ if( aQueueNext ) delete aQueueNext;
+ if( aQueueCur ) delete aQueueCur;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */