xref: /aoo41x/main/l10ntools/source/export.cxx (revision 3cd96b95)
1*3cd96b95SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*3cd96b95SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*3cd96b95SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*3cd96b95SAndrew Rist  * distributed with this work for additional information
6*3cd96b95SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*3cd96b95SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*3cd96b95SAndrew Rist  * "License"); you may not use this file except in compliance
9*3cd96b95SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*3cd96b95SAndrew Rist  *
11*3cd96b95SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*3cd96b95SAndrew Rist  *
13*3cd96b95SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*3cd96b95SAndrew Rist  * software distributed under the License is distributed on an
15*3cd96b95SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3cd96b95SAndrew Rist  * KIND, either express or implied.  See the License for the
17*3cd96b95SAndrew Rist  * specific language governing permissions and limitations
18*3cd96b95SAndrew Rist  * under the License.
19*3cd96b95SAndrew Rist  *
20*3cd96b95SAndrew Rist  *************************************************************/
21*3cd96b95SAndrew Rist 
22*3cd96b95SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_l10ntools.hxx"
26cdf0e10cSrcweir #include <stdio.h>
27cdf0e10cSrcweir #include <stdlib.h>
28cdf0e10cSrcweir #include <tools/fsys.hxx>
29cdf0e10cSrcweir #include "export.hxx"
30cdf0e10cSrcweir #include "tokens.h"
31cdf0e10cSrcweir #include "utf8conv.hxx"
32cdf0e10cSrcweir #include <iostream>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir extern "C" { int yyerror( char * ); }
35cdf0e10cSrcweir extern "C" { int YYWarning( char * ); }
36cdf0e10cSrcweir 
37cdf0e10cSrcweir Export *pExport = 0L;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir // defines to parse command line
40cdf0e10cSrcweir #define STATE_NON  		0x0001
41cdf0e10cSrcweir #define STATE_INPUT		0x0002
42cdf0e10cSrcweir #define STATE_OUTPUT	0x0003
43cdf0e10cSrcweir #define STATE_PRJ		0x0004
44cdf0e10cSrcweir #define STATE_ROOT		0x0005
45cdf0e10cSrcweir #define STATE_MERGESRC	0x0006
46cdf0e10cSrcweir #define STATE_ERRORLOG	0x0007
47cdf0e10cSrcweir #define STATE_BREAKHELP	0x0008
48cdf0e10cSrcweir #define STATE_UNMERGE	0x0009
49cdf0e10cSrcweir #define STATE_UTF8		0x000A
50cdf0e10cSrcweir #define STATE_LANGUAGES	0X000B
51cdf0e10cSrcweir 
52cdf0e10cSrcweir // set of global variables
53cdf0e10cSrcweir DECLARE_LIST( FileList, ByteString * )
54cdf0e10cSrcweir FileList aInputFileList;
55cdf0e10cSrcweir sal_Bool bEnableExport;
56cdf0e10cSrcweir sal_Bool bMergeMode;
57cdf0e10cSrcweir sal_Bool bErrorLog;
58cdf0e10cSrcweir sal_Bool bBreakWhenHelpText;
59cdf0e10cSrcweir sal_Bool bUnmerge;
60cdf0e10cSrcweir sal_Bool bUTF8;
61cdf0e10cSrcweir ByteString sPrj;
62cdf0e10cSrcweir ByteString sPrjRoot;
63cdf0e10cSrcweir ByteString sActFileName;
64cdf0e10cSrcweir ByteString sOutputFile;
65cdf0e10cSrcweir ByteString sMergeSrc;
66cdf0e10cSrcweir ByteString sTempFile;
67cdf0e10cSrcweir ByteString sFile;
68cdf0e10cSrcweir MergeDataFile *pMergeDataFile;
69cdf0e10cSrcweir FILE *pTempFile;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 
72cdf0e10cSrcweir ByteString sStrBuffer;
73cdf0e10cSrcweir bool bMarcro = false;
74cdf0e10cSrcweir 
75cdf0e10cSrcweir extern "C" {
76cdf0e10cSrcweir // the whole interface to lexer is in this extern "C" section
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 
79cdf0e10cSrcweir /*****************************************************************************/
GetOutputFile(int argc,char * argv[])80cdf0e10cSrcweir extern char *GetOutputFile( int argc, char* argv[])
81cdf0e10cSrcweir /*****************************************************************************/
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	bEnableExport = sal_False;
84cdf0e10cSrcweir 	bMergeMode = sal_False;
85cdf0e10cSrcweir 	bErrorLog = sal_True;
86cdf0e10cSrcweir 	bBreakWhenHelpText = sal_False;
87cdf0e10cSrcweir 	bUnmerge = sal_False;
88cdf0e10cSrcweir 	bUTF8 = sal_True;
89cdf0e10cSrcweir 	sPrj = "";
90cdf0e10cSrcweir 	sPrjRoot = "";
91cdf0e10cSrcweir 	sActFileName = "";
92cdf0e10cSrcweir 	Export::sLanguages = "";
93cdf0e10cSrcweir     Export::sForcedLanguages = "";
94cdf0e10cSrcweir 	sTempFile = "";
95cdf0e10cSrcweir 	pTempFile = NULL;
96cdf0e10cSrcweir 	sal_uInt16 nState = STATE_NON;
97cdf0e10cSrcweir 	sal_Bool bInput = sal_False;
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 	// parse command line
100cdf0e10cSrcweir 	for( int i = 1; i < argc; i++ ) {
101cdf0e10cSrcweir 		ByteString sSwitch( argv[ i ] );
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         if (sSwitch == "-i"  || sSwitch == "-I" ) {
104cdf0e10cSrcweir 			nState = STATE_INPUT; // next tokens specifies source files
105cdf0e10cSrcweir 		}
106cdf0e10cSrcweir 		else if (sSwitch == "-o"  || sSwitch == "-O" ) {
107cdf0e10cSrcweir 			nState = STATE_OUTPUT; // next token specifies the dest file
108cdf0e10cSrcweir 		}
109cdf0e10cSrcweir 		else if (sSwitch == "-p"  || sSwitch == "-P" ) {
110cdf0e10cSrcweir 			nState = STATE_PRJ; // next token specifies the cur. project
111cdf0e10cSrcweir 		}
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 		else if (sSwitch == "-r"  || sSwitch == "-R" ) {
114cdf0e10cSrcweir 			nState = STATE_ROOT; // next token specifies path to project root
115cdf0e10cSrcweir 		}
116cdf0e10cSrcweir 		else if (sSwitch == "-m"  || sSwitch == "-M" ) {
117cdf0e10cSrcweir 			nState = STATE_MERGESRC; // next token specifies the merge database
118cdf0e10cSrcweir 		}
119cdf0e10cSrcweir 		else if (sSwitch == "-e"  || sSwitch == "-E" ) {
120cdf0e10cSrcweir 			nState = STATE_ERRORLOG;
121cdf0e10cSrcweir 			bErrorLog = sal_False;
122cdf0e10cSrcweir 		}
123cdf0e10cSrcweir 		else if (sSwitch == "-b"  || sSwitch == "-B" ) {
124cdf0e10cSrcweir 			nState = STATE_BREAKHELP;
125cdf0e10cSrcweir 			bBreakWhenHelpText = sal_True;
126cdf0e10cSrcweir 		}
127cdf0e10cSrcweir 		else if (sSwitch == "-u"  || sSwitch == "-U" ) {
128cdf0e10cSrcweir 			nState = STATE_UNMERGE;
129cdf0e10cSrcweir 			bUnmerge = sal_True;
130cdf0e10cSrcweir 			bMergeMode = sal_True;
131cdf0e10cSrcweir 		}
132cdf0e10cSrcweir 		else if ( sSwitch.ToUpperAscii() == "-UTF8" ) {
133cdf0e10cSrcweir 			nState = STATE_UTF8;
134cdf0e10cSrcweir 			bUTF8 = sal_True;
135cdf0e10cSrcweir 		}
136cdf0e10cSrcweir 		else if ( sSwitch.ToUpperAscii() == "-NOUTF8" ) {
137cdf0e10cSrcweir 			nState = STATE_UTF8;
138cdf0e10cSrcweir 			bUTF8 = sal_False;
139cdf0e10cSrcweir 		}
140cdf0e10cSrcweir 		else if ( sSwitch == "-l"  || sSwitch == "-L" ) {
141cdf0e10cSrcweir 			nState = STATE_LANGUAGES;
142cdf0e10cSrcweir 		}
143cdf0e10cSrcweir 		else {
144cdf0e10cSrcweir 			switch ( nState ) {
145cdf0e10cSrcweir 				case STATE_NON: {
146cdf0e10cSrcweir 					return NULL;	// no valid command line
147cdf0e10cSrcweir 				}
148cdf0e10cSrcweir 				case STATE_INPUT: {
149cdf0e10cSrcweir 					aInputFileList.Insert( new ByteString( argv[ i ]), LIST_APPEND );
150cdf0e10cSrcweir 					bInput = sal_True; // min. one source file found
151cdf0e10cSrcweir 				}
152cdf0e10cSrcweir 				break;
153cdf0e10cSrcweir 				case STATE_OUTPUT: {
154cdf0e10cSrcweir 					sOutputFile = ByteString( argv[ i ]); // the dest. file
155cdf0e10cSrcweir 				}
156cdf0e10cSrcweir 				break;
157cdf0e10cSrcweir 				case STATE_PRJ: {
158cdf0e10cSrcweir 					sPrj = ByteString( argv[ i ]);
159cdf0e10cSrcweir 				}
160cdf0e10cSrcweir 				break;
161cdf0e10cSrcweir 				case STATE_ROOT: {
162cdf0e10cSrcweir 					sPrjRoot = ByteString( argv[ i ]); // path to project root
163cdf0e10cSrcweir 				}
164cdf0e10cSrcweir 				break;
165cdf0e10cSrcweir 				case STATE_MERGESRC: {
166cdf0e10cSrcweir 					sMergeSrc = ByteString( argv[ i ]);
167cdf0e10cSrcweir 					bMergeMode = sal_True; // activate merge mode, cause merge database found
168cdf0e10cSrcweir 				}
169cdf0e10cSrcweir 				break;
170cdf0e10cSrcweir 				case STATE_LANGUAGES: {
171cdf0e10cSrcweir 					Export::sLanguages = ByteString( argv[ i ]);
172cdf0e10cSrcweir 				}
173cdf0e10cSrcweir 				break;
174cdf0e10cSrcweir 			}
175cdf0e10cSrcweir 		}
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir     if( bUnmerge ) sMergeSrc = ByteString();
178cdf0e10cSrcweir 	if ( bInput ) {
179cdf0e10cSrcweir 		// command line is valid
180cdf0e10cSrcweir 		bEnableExport = sal_True;
181cdf0e10cSrcweir 		char *pReturn = new char[ sOutputFile.Len() + 1 ];
182cdf0e10cSrcweir 		strcpy( pReturn, sOutputFile.GetBuffer());  // #100211# - checked
183cdf0e10cSrcweir 		return pReturn;
184cdf0e10cSrcweir 	}
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	// command line is not valid
187cdf0e10cSrcweir 	return NULL;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir /*****************************************************************************/
InitExport(char * pOutput,char * pFilename)190cdf0e10cSrcweir int InitExport( char *pOutput , char* pFilename )
191cdf0e10cSrcweir /*****************************************************************************/
192cdf0e10cSrcweir {
193cdf0e10cSrcweir 	// instanciate Export
194cdf0e10cSrcweir 	ByteString sOutput( pOutput );
195cdf0e10cSrcweir     ByteString sFilename( pFilename );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 	if ( bMergeMode && !bUnmerge ) {
198cdf0e10cSrcweir 		// merge mode enabled, so read database
199cdf0e10cSrcweir 		pExport = new Export(sOutput, bEnableExport, sPrj, sPrjRoot, sMergeSrc , sFilename );
200cdf0e10cSrcweir 	}
201cdf0e10cSrcweir 	else
202cdf0e10cSrcweir 		// no merge mode, only export
203cdf0e10cSrcweir 		pExport = new Export( sOutput, bEnableExport, sPrj, sPrjRoot , sFilename );
204cdf0e10cSrcweir 	return 1;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir /*****************************************************************************/
EndExport()208cdf0e10cSrcweir int EndExport()
209cdf0e10cSrcweir /*****************************************************************************/
210cdf0e10cSrcweir {
211cdf0e10cSrcweir 	delete pExport;
212cdf0e10cSrcweir 	return 1;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
getFilename()215cdf0e10cSrcweir extern const char* getFilename()
216cdf0e10cSrcweir {
217cdf0e10cSrcweir 	return (*(aInputFileList.GetObject( 0 ))).GetBuffer();
218cdf0e10cSrcweir }
219cdf0e10cSrcweir /*****************************************************************************/
GetNextFile()220cdf0e10cSrcweir extern FILE *GetNextFile()
221cdf0e10cSrcweir /*****************************************************************************/
222cdf0e10cSrcweir {
223cdf0e10cSrcweir 	// look for next valid filename in input file list
224cdf0e10cSrcweir 	if ( sTempFile.Len()) {
225cdf0e10cSrcweir 		fclose( pTempFile );
226cdf0e10cSrcweir 		String sTemp( sTempFile, RTL_TEXTENCODING_ASCII_US );
227cdf0e10cSrcweir 		DirEntry aTemp( sTemp );
228cdf0e10cSrcweir 		aTemp.Kill();
229cdf0e10cSrcweir 	}
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 	while ( aInputFileList.Count()) {
232cdf0e10cSrcweir 		ByteString sFileName( *(aInputFileList.GetObject( 0 )));
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 		ByteString sOrigFile( sFileName );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 		sFileName = Export::GetNativeFile( sFileName );
237cdf0e10cSrcweir 		delete aInputFileList.GetObject(( sal_uLong ) 0 );
238cdf0e10cSrcweir 		aInputFileList.Remove(( sal_uLong ) 0 );
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 		if ( sFileName == "" ) {
241cdf0e10cSrcweir 			fprintf( stderr, "ERROR: Could not precompile File %s\n",
242cdf0e10cSrcweir 				sOrigFile.GetBuffer());
243cdf0e10cSrcweir 			return GetNextFile();
244cdf0e10cSrcweir 		}
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 		sTempFile = sFileName;
247cdf0e10cSrcweir         Export::RemoveUTF8ByteOrderMarkerFromFile( sFileName );
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 		// able to open file?
250cdf0e10cSrcweir 		FILE *pFile = fopen( sFileName.GetBuffer(), "r" );
251cdf0e10cSrcweir 		if ( !pFile )
252cdf0e10cSrcweir 			fprintf( stderr, "Error: Could not open File %s\n",
253cdf0e10cSrcweir 				sFileName.GetBuffer());
254cdf0e10cSrcweir 		else {
255cdf0e10cSrcweir 			pTempFile = pFile;
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 			// this is a valid file which can be opened, so
258cdf0e10cSrcweir 			// create path to project root
259cdf0e10cSrcweir 			DirEntry aEntry( String( sOrigFile, RTL_TEXTENCODING_ASCII_US ));
260cdf0e10cSrcweir 			aEntry.ToAbs();
261cdf0e10cSrcweir 			ByteString sFullEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
262cdf0e10cSrcweir 			aEntry += DirEntry( String( "..", RTL_TEXTENCODING_ASCII_US ));
263cdf0e10cSrcweir 			aEntry += DirEntry( sPrjRoot );
264cdf0e10cSrcweir 			ByteString sPrjEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 			// create file name, beginnig with project root
267cdf0e10cSrcweir 			// (e.g.: source\ui\src\menue.src)
268cdf0e10cSrcweir 			sActFileName = sFullEntry.Copy( sPrjEntry.Len() + 1 );
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 			sActFileName.SearchAndReplaceAll( "/", "\\" );
272cdf0e10cSrcweir             sFile = sActFileName;
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 			if ( pExport ) {
275cdf0e10cSrcweir 				// create instance of class export
276cdf0e10cSrcweir 				pExport->Init();
277cdf0e10cSrcweir 			}
278cdf0e10cSrcweir 			// return the valid file handle
279cdf0e10cSrcweir             return pFile;
280cdf0e10cSrcweir 		}
281cdf0e10cSrcweir 	}
282cdf0e10cSrcweir 	// this means the file could not be opened
283cdf0e10cSrcweir 	return NULL;
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
Parse(int nTyp,const char * pTokenText)286cdf0e10cSrcweir int Parse( int nTyp, const char *pTokenText ){
287cdf0e10cSrcweir     pExport->Execute( nTyp , pTokenText );
288cdf0e10cSrcweir     return 1;
289cdf0e10cSrcweir }
Close()290cdf0e10cSrcweir void Close(){
291cdf0e10cSrcweir     pExport->pParseQueue->Close();
292cdf0e10cSrcweir }
293cdf0e10cSrcweir /*****************************************************************************/
WorkOnTokenSet(int nTyp,char * pTokenText)294cdf0e10cSrcweir int WorkOnTokenSet( int nTyp, char *pTokenText )
295cdf0e10cSrcweir /*****************************************************************************/
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     pExport->pParseQueue->Push( QueueEntry( nTyp , ByteString( pTokenText ) ) );
299cdf0e10cSrcweir     return 1;
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
302cdf0e10cSrcweir } // extern
303cdf0e10cSrcweir 
304cdf0e10cSrcweir extern "C" {
305cdf0e10cSrcweir /*****************************************************************************/
SetError()306cdf0e10cSrcweir int SetError()
307cdf0e10cSrcweir /*****************************************************************************/
308cdf0e10cSrcweir {
309cdf0e10cSrcweir 	// set error at global instance of class Export
310cdf0e10cSrcweir 	pExport->SetError();
311cdf0e10cSrcweir 	return 1;
312cdf0e10cSrcweir }
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
315cdf0e10cSrcweir extern "C" {
316cdf0e10cSrcweir /*****************************************************************************/
GetError()317cdf0e10cSrcweir int GetError()
318cdf0e10cSrcweir /*****************************************************************************/
319cdf0e10cSrcweir {
320cdf0e10cSrcweir 	// get error at global instance of class Export
321cdf0e10cSrcweir 	if ( pExport->GetError())
322cdf0e10cSrcweir 		return 1;
323cdf0e10cSrcweir 	return sal_False;
324cdf0e10cSrcweir }
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir //
328cdf0e10cSrcweir // class ResData
329cdf0e10cSrcweir //
330cdf0e10cSrcweir 
Dump()331cdf0e10cSrcweir void ResData::Dump(){
332cdf0e10cSrcweir 	printf("**************\nResData\n");
333cdf0e10cSrcweir 	printf("sPForm = %s , sResTyp = %s , sId = %s , sGId = %s , sHelpId = %s\n",sPForm.GetBuffer()
334cdf0e10cSrcweir 		,sResTyp.GetBuffer(),sId.GetBuffer(),sGId.GetBuffer(),sHelpId.GetBuffer());
335cdf0e10cSrcweir 
336cdf0e10cSrcweir 	ByteString a("*pStringList");
337cdf0e10cSrcweir 	ByteString b("*pUIEntries");
338cdf0e10cSrcweir 	ByteString c("*pFilterList");
339cdf0e10cSrcweir 	ByteString d("*pItemList");
340cdf0e10cSrcweir 	ByteString e("*pPairedList");
341cdf0e10cSrcweir 	ByteString f("sText");
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 	Export::DumpMap( f , sText );
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 	if( pStringList )	Export::DumpExportList( a , *pStringList );
346cdf0e10cSrcweir 	if( pUIEntries )	Export::DumpExportList( b , *pUIEntries );
347cdf0e10cSrcweir 	if( pFilterList )	Export::DumpExportList( c , *pFilterList );
348cdf0e10cSrcweir 	if( pItemList )		Export::DumpExportList( d , *pItemList );
349cdf0e10cSrcweir 	if( pPairedList )	Export::DumpExportList( e , *pPairedList );
350cdf0e10cSrcweir 	printf("\n");
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
addFallbackData(ByteString & sId_in,const ByteString & sText_in)353cdf0e10cSrcweir void ResData::addFallbackData( ByteString& sId_in , const ByteString& sText_in ){
354cdf0e10cSrcweir 	//printf(" ResData::addFallbackData ( sId = %s , sText = %s )\n", sId_in.GetBuffer() , sText_in.GetBuffer() );
355cdf0e10cSrcweir     aFallbackData[ sId_in ] = sText_in;
356cdf0e10cSrcweir }
getFallbackData(ByteString & sId_in,ByteString & sText_inout)357cdf0e10cSrcweir bool ResData::getFallbackData( ByteString& sId_in , ByteString& sText_inout ){
358cdf0e10cSrcweir 	sText_inout = aFallbackData[ sId_in ];
359cdf0e10cSrcweir 	//printf("ResData::getFallbackData( sId = %s , return sText = %s \n" , sId_in.GetBuffer(), sText_inout.GetBuffer());
360cdf0e10cSrcweir     return sText_inout.Len() > 0;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
addMergedLanguage(ByteString & sLang)363cdf0e10cSrcweir void ResData::addMergedLanguage( ByteString& sLang ){
364cdf0e10cSrcweir 	aMergedLanguages[ sLang ]=ByteString("1");
365cdf0e10cSrcweir }
isMerged(ByteString & sLang)366cdf0e10cSrcweir bool ResData::isMerged( ByteString& sLang ){
367cdf0e10cSrcweir 	return aMergedLanguages[ sLang ].Equals("1");
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir /*****************************************************************************/
SetId(const ByteString & rId,sal_uInt16 nLevel)371cdf0e10cSrcweir sal_Bool ResData::SetId( const ByteString &rId, sal_uInt16 nLevel )
372cdf0e10cSrcweir /*****************************************************************************/
373cdf0e10cSrcweir {
374cdf0e10cSrcweir 	if ( nLevel > nIdLevel )
375cdf0e10cSrcweir 	{
376cdf0e10cSrcweir 		nIdLevel = nLevel;
377cdf0e10cSrcweir 		sId = rId;
378cdf0e10cSrcweir 
379cdf0e10cSrcweir 		if ( bChild && bChildWithText ) {
380cdf0e10cSrcweir 			ByteString sError( "ResId after child definition" );
381cdf0e10cSrcweir 			yyerror( sError.GetBufferAccess());
382cdf0e10cSrcweir 			sError.ReleaseBufferAccess();
383cdf0e10cSrcweir 			SetError();
384cdf0e10cSrcweir 		}
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 		if ( sId.Len() > 255 ) {
387cdf0e10cSrcweir 			ByteString sWarning( "LocalId > 255 chars, truncating..." );
388cdf0e10cSrcweir 			YYWarning( sWarning.GetBufferAccess());
389cdf0e10cSrcweir 			sWarning.ReleaseBufferAccess();
390cdf0e10cSrcweir 			sId.Erase( 255 );
391cdf0e10cSrcweir 			sId.EraseTrailingChars( ' ' );
392cdf0e10cSrcweir 			sId.EraseTrailingChars( '\t' );
393cdf0e10cSrcweir 		}
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 		return sal_True;
396cdf0e10cSrcweir 	}
397cdf0e10cSrcweir 
398cdf0e10cSrcweir 	return sal_False;
399cdf0e10cSrcweir }
400cdf0e10cSrcweir 
401cdf0e10cSrcweir //
402cdf0e10cSrcweir // class Export
403cdf0e10cSrcweir //
404cdf0e10cSrcweir 
405cdf0e10cSrcweir /*****************************************************************************/
Export(const ByteString & rOutput,sal_Bool bWrite,const ByteString & rPrj,const ByteString & rPrjRoot,const ByteString & rFile)406cdf0e10cSrcweir Export::Export( const ByteString &rOutput, sal_Bool bWrite,
407cdf0e10cSrcweir 				const ByteString &rPrj, const ByteString &rPrjRoot , const ByteString& rFile )
408cdf0e10cSrcweir /*****************************************************************************/
409cdf0e10cSrcweir 				:
410cdf0e10cSrcweir 				pWordTransformer( NULL ),
411cdf0e10cSrcweir 				aCharSet( RTL_TEXTENCODING_MS_1252 ),
412cdf0e10cSrcweir 				bDefine( sal_False ),
413cdf0e10cSrcweir 				bNextMustBeDefineEOL( sal_False ),
414cdf0e10cSrcweir                 nLevel( 0 ),
415cdf0e10cSrcweir 				nList( LIST_NON ),
416cdf0e10cSrcweir 				nListIndex( 0 ),
417cdf0e10cSrcweir 				nListLevel( 0 ),
418cdf0e10cSrcweir                 bSkipFile( false ),
419cdf0e10cSrcweir 				sProject( sPrj ),
420cdf0e10cSrcweir 				sRoot( sPrjRoot ),
421cdf0e10cSrcweir 				bEnableExport( bWrite ),
422cdf0e10cSrcweir 				bMergeMode( bUnmerge ),
423cdf0e10cSrcweir 				bError( sal_False ),
424cdf0e10cSrcweir 				bReadOver( sal_False ),
425cdf0e10cSrcweir 				bDontWriteOutput( sal_False ),
426cdf0e10cSrcweir 				sFilename( rFile )
427cdf0e10cSrcweir {
428cdf0e10cSrcweir     pParseQueue = new ParserQueue( *this );
429cdf0e10cSrcweir     (void) rPrj;
430cdf0e10cSrcweir     (void) rPrjRoot;
431cdf0e10cSrcweir     (void) rFile;
432cdf0e10cSrcweir 
433cdf0e10cSrcweir     if( !isInitialized ) InitLanguages();
434cdf0e10cSrcweir     // used when export is enabled
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 	// open output stream
437cdf0e10cSrcweir 	if ( bEnableExport ) {
438cdf0e10cSrcweir 		aOutput.Open( String( rOutput, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC );
439cdf0e10cSrcweir 		if( !aOutput.IsOpen() ) {
440cdf0e10cSrcweir             printf("ERROR : Can't open file %s\n",rOutput.GetBuffer());
441cdf0e10cSrcweir             exit ( -1 );
442cdf0e10cSrcweir         }
443cdf0e10cSrcweir         aOutput.SetStreamCharSet( RTL_TEXTENCODING_UTF8 );
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 		aOutput.SetLineDelimiter( LINEEND_CRLF );
446cdf0e10cSrcweir 	}
447cdf0e10cSrcweir }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir /*****************************************************************************/
Export(const ByteString & rOutput,sal_Bool bWrite,const ByteString & rPrj,const ByteString & rPrjRoot,const ByteString & rMergeSource,const ByteString & rFile)450cdf0e10cSrcweir Export::Export( const ByteString &rOutput, sal_Bool bWrite,
451cdf0e10cSrcweir 				const ByteString &rPrj, const ByteString &rPrjRoot,
452cdf0e10cSrcweir 				const ByteString &rMergeSource , const ByteString& rFile )
453cdf0e10cSrcweir /*****************************************************************************/
454cdf0e10cSrcweir 				:
455cdf0e10cSrcweir 				pWordTransformer( NULL ),
456cdf0e10cSrcweir 				aCharSet( RTL_TEXTENCODING_MS_1252 ),
457cdf0e10cSrcweir 				bDefine( sal_False ),
458cdf0e10cSrcweir 				bNextMustBeDefineEOL( sal_False ),
459cdf0e10cSrcweir                 nLevel( 0 ),
460cdf0e10cSrcweir 				nList( LIST_NON ),
461cdf0e10cSrcweir 				nListIndex( 0 ),
462cdf0e10cSrcweir 				nListLevel( 0 ),
463cdf0e10cSrcweir                 bSkipFile( false ),
464cdf0e10cSrcweir 				sProject( sPrj ),
465cdf0e10cSrcweir 				sRoot( sPrjRoot ),
466cdf0e10cSrcweir 				bEnableExport( bWrite ),
467cdf0e10cSrcweir 				bMergeMode( sal_True ),
468cdf0e10cSrcweir 				sMergeSrc( rMergeSource ),
469cdf0e10cSrcweir 				bError( sal_False ),
470cdf0e10cSrcweir 				bReadOver( sal_False ),
471cdf0e10cSrcweir 				bDontWriteOutput( sal_False ),
472cdf0e10cSrcweir 				sFilename( rFile )
473cdf0e10cSrcweir {
474cdf0e10cSrcweir     (void) rPrj;
475cdf0e10cSrcweir     (void) rPrjRoot;
476cdf0e10cSrcweir     (void) rFile;
477cdf0e10cSrcweir     pParseQueue = new ParserQueue( *this );
478cdf0e10cSrcweir     if( !isInitialized ) InitLanguages( bMergeMode );
479cdf0e10cSrcweir     // used when merge is enabled
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 	// open output stream
482cdf0e10cSrcweir 	if ( bEnableExport ) {
483cdf0e10cSrcweir 		aOutput.Open( String( rOutput, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC );
484cdf0e10cSrcweir         aOutput.SetStreamCharSet( RTL_TEXTENCODING_UTF8 );
485cdf0e10cSrcweir 		aOutput.SetLineDelimiter( LINEEND_CRLF );
486cdf0e10cSrcweir 	}
487cdf0e10cSrcweir 
488cdf0e10cSrcweir }
489cdf0e10cSrcweir 
490cdf0e10cSrcweir /*****************************************************************************/
Init()491cdf0e10cSrcweir void Export::Init()
492cdf0e10cSrcweir /*****************************************************************************/
493cdf0e10cSrcweir {
494cdf0e10cSrcweir 	// resets the internal status, used before parseing another file
495cdf0e10cSrcweir 	sActPForm = "";
496cdf0e10cSrcweir 	bDefine = sal_False;
497cdf0e10cSrcweir 	bNextMustBeDefineEOL = sal_False;
498cdf0e10cSrcweir 	nLevel = 0;
499cdf0e10cSrcweir 	nList = LIST_NON;
500cdf0e10cSrcweir     nListLang = ByteString( String::CreateFromAscii(""),RTL_TEXTENCODING_ASCII_US );
501cdf0e10cSrcweir 	nListIndex = 0;
502cdf0e10cSrcweir 	while ( aResStack.Count()) {
503cdf0e10cSrcweir 		delete aResStack.GetObject(( sal_uLong ) 0 );
504cdf0e10cSrcweir 		aResStack.Remove(( sal_uLong ) 0 );
505cdf0e10cSrcweir 	}
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir /*****************************************************************************/
~Export()509cdf0e10cSrcweir Export::~Export()
510cdf0e10cSrcweir /*****************************************************************************/
511cdf0e10cSrcweir {
512cdf0e10cSrcweir 	if( pParseQueue )
513cdf0e10cSrcweir         delete pParseQueue;
514cdf0e10cSrcweir 	// close output stream
515cdf0e10cSrcweir 	if ( bEnableExport )
516cdf0e10cSrcweir 		aOutput.Close();
517cdf0e10cSrcweir 	while ( aResStack.Count()) {
518cdf0e10cSrcweir 		delete aResStack.GetObject(( sal_uLong ) 0 );
519cdf0e10cSrcweir 		aResStack.Remove(( sal_uLong ) 0 );
520cdf0e10cSrcweir 	}
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 	if ( bMergeMode && !bUnmerge ) {
523cdf0e10cSrcweir 		if ( !pMergeDataFile )
524cdf0e10cSrcweir 			pMergeDataFile = new MergeDataFile( sMergeSrc,sFile , bErrorLog, aCharSet);//, bUTF8 );
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 		//pMergeDataFile->WriteErrorLog( sActFileName );
527cdf0e10cSrcweir 		delete pMergeDataFile;
528cdf0e10cSrcweir 	}
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir /*****************************************************************************/
Execute(int nToken,const char * pToken)532cdf0e10cSrcweir int Export::Execute( int nToken, const char * pToken )
533cdf0e10cSrcweir /*****************************************************************************/
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 
536cdf0e10cSrcweir     ByteString sToken( pToken );
537cdf0e10cSrcweir 	ByteString sOrig( sToken );
538cdf0e10cSrcweir /*	printf("+---------------\n");
539cdf0e10cSrcweir 	printf("sToken = %s\n",sToken.GetBuffer());
540cdf0e10cSrcweir 	printf("nToken = %d\n",nToken);
541cdf0e10cSrcweir 	printf("+---------------\n"); */
542cdf0e10cSrcweir     sal_Bool bWriteToMerged = bMergeMode;
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 	if ( nToken == CONDITION ) {
545cdf0e10cSrcweir 		ByteString sTestToken( pToken );
546cdf0e10cSrcweir 		sTestToken.EraseAllChars( '\t' );
547cdf0e10cSrcweir 		sTestToken.EraseAllChars( ' ' );
548cdf0e10cSrcweir 		if (( !bReadOver ) && ( sTestToken.Search( "#ifndef__RSC_PARSER" ) == 0 ))
549cdf0e10cSrcweir 			bReadOver = sal_True;
550cdf0e10cSrcweir 		else if (( bReadOver ) && ( sTestToken.Search( "#endif" ) == 0 ))
551cdf0e10cSrcweir 			bReadOver = sal_False;
552cdf0e10cSrcweir 	}
553cdf0e10cSrcweir 	if ((( nToken < FILTER_LEVEL ) || ( bReadOver )) &&
554cdf0e10cSrcweir 		(!(( bNextMustBeDefineEOL ) && ( sOrig == "\n" )))) {
555cdf0e10cSrcweir 		// this tokens are not mandatory for parsing, so ignore them ...
556cdf0e10cSrcweir 		if ( bMergeMode )
557cdf0e10cSrcweir 			WriteToMerged( sOrig , false ); // ... ore whrite them directly to dest.
558cdf0e10cSrcweir 		return 0;
559cdf0e10cSrcweir 	}
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 	ResData *pResData = NULL;
562cdf0e10cSrcweir 	if ( nLevel ) {
563cdf0e10cSrcweir 		// res. exists at cur. level
564cdf0e10cSrcweir 		pResData = aResStack.GetObject( nLevel-1 );
565cdf0e10cSrcweir 	}
566cdf0e10cSrcweir 	else if (( nToken != RESSOURCE ) &&
567cdf0e10cSrcweir 			( nToken != RESSOURCEEXPR ) &&
568cdf0e10cSrcweir 			( nToken != SMALRESSOURCE ) &&
569cdf0e10cSrcweir 			( nToken != LEVELUP ) &&
570cdf0e10cSrcweir 			( nToken != NORMDEFINE ) &&
571cdf0e10cSrcweir             ( nToken != RSCDEFINE ) &&
572cdf0e10cSrcweir 			( nToken != CONDITION ) &&
573cdf0e10cSrcweir 			( nToken != PRAGMA ))
574cdf0e10cSrcweir 	{
575cdf0e10cSrcweir 		// no res. exists at cur. level so return
576cdf0e10cSrcweir 		if ( bMergeMode )
577cdf0e10cSrcweir 			WriteToMerged( sOrig , false );
578cdf0e10cSrcweir 		return 0;
579cdf0e10cSrcweir 	}
580cdf0e10cSrcweir     // #define NO_LOCALIZE_EXPORT
581cdf0e10cSrcweir     if( bSkipFile ){
582cdf0e10cSrcweir         if ( bMergeMode ) {
583cdf0e10cSrcweir             WriteToMerged( sOrig , false );
584cdf0e10cSrcweir         }
585cdf0e10cSrcweir         return 1;
586cdf0e10cSrcweir 	}
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 
589cdf0e10cSrcweir 	if ( bDefine ) {
590cdf0e10cSrcweir 		if (( nToken != EMPTYLINE ) && ( nToken != LEVELDOWN ) && ( nToken != LEVELUP )) {
591cdf0e10cSrcweir 			// cur. res. defined in macro
592cdf0e10cSrcweir 			if ( bNextMustBeDefineEOL ) {
593cdf0e10cSrcweir                 if ( nToken != RSCDEFINELEND ) {
594cdf0e10cSrcweir 					// end of macro found, so destroy res.
595cdf0e10cSrcweir 					bDefine = sal_False;
596cdf0e10cSrcweir 					if ( bMergeMode ) {
597cdf0e10cSrcweir 						/*if ( bDontWriteOutput && bUnmerge ) {
598cdf0e10cSrcweir 							bDontWriteOutput = sal_False;
599cdf0e10cSrcweir 							bNextMustBeDefineEOL = sal_False;
600cdf0e10cSrcweir 							bDefine = sal_True;
601cdf0e10cSrcweir 						}*/
602cdf0e10cSrcweir 						MergeRest( pResData );
603cdf0e10cSrcweir 					}
604cdf0e10cSrcweir 					bNextMustBeDefineEOL = sal_False;
605cdf0e10cSrcweir 					Execute( LEVELDOWN, "" );
606cdf0e10cSrcweir 				}
607cdf0e10cSrcweir 				else {
608cdf0e10cSrcweir 					// next line also in macro definition
609cdf0e10cSrcweir 					bNextMustBeDefineEOL = sal_False;
610cdf0e10cSrcweir 					if ( bMergeMode )
611cdf0e10cSrcweir 						WriteToMerged( sOrig , false );
612cdf0e10cSrcweir 					return 1;
613cdf0e10cSrcweir 				}
614cdf0e10cSrcweir 			}
615cdf0e10cSrcweir 			else if (( nToken != LISTASSIGNMENT ) && ( nToken != UIENTRIES )){
616cdf0e10cSrcweir 				// cur. line has macro line end
617cdf0e10cSrcweir 				ByteString sTmpLine( sToken );
618cdf0e10cSrcweir 				sTmpLine.EraseAllChars( '\t' ); sTmpLine.EraseAllChars( ' ' );
619cdf0e10cSrcweir                 #if 0
620cdf0e10cSrcweir                 // impossible, unsigned is never negative
621cdf0e10cSrcweir 				if( sTmpLine.Len() < 0 ){
622cdf0e10cSrcweir 					if ( sTmpLine.GetChar(( sal_uInt16 )( sTmpLine.Len() - 1 )) != '\\' )
623cdf0e10cSrcweir 						bNextMustBeDefineEOL = sal_True;
624cdf0e10cSrcweir 				}
625cdf0e10cSrcweir                 #endif
626cdf0e10cSrcweir 			}
627cdf0e10cSrcweir 		}
628cdf0e10cSrcweir 	}
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 	sal_Bool bExecuteDown = sal_False;
631cdf0e10cSrcweir 	if ( nToken != LEVELDOWN ) {
632cdf0e10cSrcweir 		sal_uInt16 nOpen = 0;
633cdf0e10cSrcweir 		sal_uInt16 nClose = 0;
634cdf0e10cSrcweir 		sal_Bool bReadOver1 = sal_False;
635cdf0e10cSrcweir         sal_uInt16 i = 0;
636cdf0e10cSrcweir 		for ( i = 0; i < sToken.Len(); i++ ) {
637cdf0e10cSrcweir 			if ( sToken.GetChar( i ) == '\"' )
638cdf0e10cSrcweir 				bReadOver1 = !bReadOver1;
639cdf0e10cSrcweir 			if ( !bReadOver1 && ( sToken.GetChar( i ) == '{' ))
640cdf0e10cSrcweir 				nOpen++;
641cdf0e10cSrcweir 		}
642cdf0e10cSrcweir 
643cdf0e10cSrcweir 		bReadOver1 = sal_False;
644cdf0e10cSrcweir 		for ( i = 0; i < sToken.Len(); i++ ) {
645cdf0e10cSrcweir 			if ( sToken.GetChar( i ) == '\"' )
646cdf0e10cSrcweir 				bReadOver1 = !bReadOver1;
647cdf0e10cSrcweir 			if ( !bReadOver1 && ( sToken.GetChar( i ) == '}' ))
648cdf0e10cSrcweir 				nClose++;
649cdf0e10cSrcweir 		}
650cdf0e10cSrcweir 
651cdf0e10cSrcweir 		if ( nOpen < nClose )
652cdf0e10cSrcweir 			bExecuteDown = sal_True;
653cdf0e10cSrcweir 	}
654cdf0e10cSrcweir 	switch ( nToken ) {
655cdf0e10cSrcweir 
656cdf0e10cSrcweir         case NORMDEFINE:
657cdf0e10cSrcweir                         //printf("sToken = '%s'",sToken.GetBuffer());
658cdf0e10cSrcweir                         while( sToken.SearchAndReplace( "\r", " " ) != STRING_NOTFOUND ) {};
659cdf0e10cSrcweir                         while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
660cdf0e10cSrcweir                         while( sToken.SearchAndReplace( "  ", " " ) != STRING_NOTFOUND ) {};
661cdf0e10cSrcweir                         if( sToken.EqualsIgnoreCaseAscii( "#define NO_LOCALIZE_EXPORT" ) ){
662cdf0e10cSrcweir                             bSkipFile = true;
663cdf0e10cSrcweir                             return 0;
664cdf0e10cSrcweir                         }
665cdf0e10cSrcweir                         if ( bMergeMode )
666cdf0e10cSrcweir                           WriteToMerged( sOrig , false );
667cdf0e10cSrcweir 
668cdf0e10cSrcweir                         return 0;
669cdf0e10cSrcweir 
670cdf0e10cSrcweir 
671cdf0e10cSrcweir         case RSCDEFINE:
672cdf0e10cSrcweir 			bDefine = sal_True; // res. defined in macro
673cdf0e10cSrcweir 
674cdf0e10cSrcweir 		case RESSOURCE:
675cdf0e10cSrcweir 		case RESSOURCEEXPR: {
676cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
677cdf0e10cSrcweir 			if ( nToken != RSCDEFINE )
678cdf0e10cSrcweir 				bNextMustBeDefineEOL = sal_False;
679cdf0e10cSrcweir 			// this is the beginning of a new res.
680cdf0e10cSrcweir 			nLevel++;
681cdf0e10cSrcweir 			if ( nLevel > 1 ) {
682cdf0e10cSrcweir 				aResStack.GetObject( nLevel - 2 )->bChild = sal_True;
683cdf0e10cSrcweir 			}
684cdf0e10cSrcweir 
685cdf0e10cSrcweir 			// create new instance for this res. and fill mandatory fields
686cdf0e10cSrcweir 
687cdf0e10cSrcweir 			pResData = new ResData( sActPForm, FullId() , sFilename );
688cdf0e10cSrcweir 			aResStack.Insert( pResData, LIST_APPEND );
689cdf0e10cSrcweir 			ByteString sBackup( sToken );
690cdf0e10cSrcweir 			sToken.EraseAllChars( '\n' );
691cdf0e10cSrcweir 			sToken.EraseAllChars( '\r' );
692cdf0e10cSrcweir 			sToken.EraseAllChars( '{' );
693cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
694cdf0e10cSrcweir 			sToken.EraseTrailingChars( ' ' );
695cdf0e10cSrcweir 			ByteString sT =  sToken.GetToken( 0, ' ' );
696cdf0e10cSrcweir             pResData->sResTyp = sT.ToLowerAscii();
697cdf0e10cSrcweir 			ByteString sId( sToken.Copy( pResData->sResTyp.Len() + 1 ));
698cdf0e10cSrcweir 			ByteString sCondition;
699cdf0e10cSrcweir 			if ( sId.Search( "#" ) != STRING_NOTFOUND ) {
700cdf0e10cSrcweir 				// between ResTyp, Id and paranthes is a precomp. condition
701cdf0e10cSrcweir 				sCondition = "#";
702cdf0e10cSrcweir 				sCondition += sId.GetToken( 1, '#' );
703cdf0e10cSrcweir 				sId = sId.GetToken( 0, '#' );
704cdf0e10cSrcweir 			}
705cdf0e10cSrcweir 			sId = sId.GetToken( 0, '/' );
706cdf0e10cSrcweir 			CleanValue( sId );
707cdf0e10cSrcweir 			sId = sId.EraseAllChars( '\t' );
708cdf0e10cSrcweir 			pResData->SetId( sId, ID_LEVEL_IDENTIFIER );
709cdf0e10cSrcweir 			if ( sCondition.Len()) {
710cdf0e10cSrcweir 				ByteString sEmpty( "" );
711cdf0e10cSrcweir 				Execute( CONDITION, sEmpty.GetBufferAccess()); 	// execute the
712cdf0e10cSrcweir 														  		// precomp.
713cdf0e10cSrcweir 																// condition
714cdf0e10cSrcweir 				sEmpty.ReleaseBufferAccess();
715cdf0e10cSrcweir 			}
716cdf0e10cSrcweir 		}
717cdf0e10cSrcweir 		break;
718cdf0e10cSrcweir 		case SMALRESSOURCE: {
719cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
720cdf0e10cSrcweir 			// this is the beginning of a new res.
721cdf0e10cSrcweir 			bNextMustBeDefineEOL = sal_False;
722cdf0e10cSrcweir 			nLevel++;
723cdf0e10cSrcweir 			if ( nLevel > 1 ) {
724cdf0e10cSrcweir 				aResStack.GetObject( nLevel - 2 )->bChild = sal_True;
725cdf0e10cSrcweir 			}
726cdf0e10cSrcweir 
727cdf0e10cSrcweir 			// create new instance for this res. and fill mandatory fields
728cdf0e10cSrcweir 
729cdf0e10cSrcweir 			pResData = new ResData( sActPForm, FullId() , sFilename );
730cdf0e10cSrcweir 			aResStack.Insert( pResData, LIST_APPEND );
731cdf0e10cSrcweir 			sToken.EraseAllChars( '\n' );
732cdf0e10cSrcweir 			sToken.EraseAllChars( '\r' );
733cdf0e10cSrcweir 			sToken.EraseAllChars( '{' );
734cdf0e10cSrcweir 			sToken.EraseAllChars( '\t' );
735cdf0e10cSrcweir 			sToken.EraseAllChars( ' ' );
736cdf0e10cSrcweir 			sToken.EraseAllChars( '\\' );
737cdf0e10cSrcweir 			pResData->sResTyp = sToken.ToLowerAscii();
738cdf0e10cSrcweir 		}
739cdf0e10cSrcweir 		break;
740cdf0e10cSrcweir 		case LEVELUP: {
741cdf0e10cSrcweir 			// push
742cdf0e10cSrcweir 			if ( nList )
743cdf0e10cSrcweir 				nListLevel++;
744cdf0e10cSrcweir 			if ( nList )
745cdf0e10cSrcweir 				break;
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
748cdf0e10cSrcweir 			ByteString sLowerTyp;
749cdf0e10cSrcweir 			if ( pResData )
750cdf0e10cSrcweir 				sLowerTyp = "unknown";
751cdf0e10cSrcweir 			nLevel++;
752cdf0e10cSrcweir 			if ( nLevel > 1 ) {
753cdf0e10cSrcweir 				aResStack.GetObject( nLevel - 2 )->bChild = sal_True;
754cdf0e10cSrcweir 			}
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 			ResData *pNewData = new ResData( sActPForm, FullId() , sFilename );
757cdf0e10cSrcweir 			pNewData->sResTyp = sLowerTyp;
758cdf0e10cSrcweir 			aResStack.Insert( pNewData, LIST_APPEND );
759cdf0e10cSrcweir 		}
760cdf0e10cSrcweir 		break;
761cdf0e10cSrcweir 		case LEVELDOWN: {
762cdf0e10cSrcweir 			// pop
763cdf0e10cSrcweir 			if ( !nList  ) {
764cdf0e10cSrcweir 				bDontWriteOutput = sal_False;
765cdf0e10cSrcweir 				if ( nLevel ) {
766cdf0e10cSrcweir 					if ( bDefine && (nLevel == 1 )) {
767cdf0e10cSrcweir                         bDefine = sal_False;
768cdf0e10cSrcweir 						bNextMustBeDefineEOL = sal_False;
769cdf0e10cSrcweir 					}
770cdf0e10cSrcweir 					WriteData( pResData );
771cdf0e10cSrcweir 					delete aResStack.GetObject( nLevel - 1 );
772cdf0e10cSrcweir 					aResStack.Remove( nLevel - 1 );
773cdf0e10cSrcweir 					nLevel--;
774cdf0e10cSrcweir 				}
775cdf0e10cSrcweir 			}
776cdf0e10cSrcweir 			else {
777cdf0e10cSrcweir 				if ( bDefine )
778cdf0e10cSrcweir 					bNextMustBeDefineEOL = sal_True;
779cdf0e10cSrcweir 				if ( !nListLevel ) {
780cdf0e10cSrcweir 					if ( bMergeMode )
781cdf0e10cSrcweir 						MergeRest( pResData, MERGE_MODE_LIST );
782cdf0e10cSrcweir 					nList = LIST_NON;
783cdf0e10cSrcweir 				}
784cdf0e10cSrcweir 				else
785cdf0e10cSrcweir 					nListLevel--;
786cdf0e10cSrcweir 			}
787cdf0e10cSrcweir 		}
788cdf0e10cSrcweir 		break;
789cdf0e10cSrcweir         case ASSIGNMENT: {
790cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
791cdf0e10cSrcweir 			// interpret different types of assignement
792cdf0e10cSrcweir  			ByteString sKey = sToken.GetToken( 0, '=' );
793cdf0e10cSrcweir 			sKey.EraseAllChars( ' ' );
794cdf0e10cSrcweir 			sKey.EraseAllChars( '\t' );
795cdf0e10cSrcweir 			ByteString sValue = sToken.GetToken( 1, '=' );
796cdf0e10cSrcweir 			CleanValue( sValue );
797cdf0e10cSrcweir 			if ( sKey.ToUpperAscii() == "IDENTIFIER" ) {
798cdf0e10cSrcweir 				ByteString sId( sValue.EraseAllChars( '\t' ));
799cdf0e10cSrcweir 				pResData->SetId( sId.EraseAllChars( ' ' ), ID_LEVEL_IDENTIFIER );
800cdf0e10cSrcweir 			}
801cdf0e10cSrcweir 			else if ( sKey == "HELPID" ) {
802cdf0e10cSrcweir 				pResData->sHelpId = sValue;
803cdf0e10cSrcweir 			}
804cdf0e10cSrcweir 			else if ( sKey == "STRINGLIST" ) {
805cdf0e10cSrcweir 				//if ( bUnmerge ){
806cdf0e10cSrcweir 				//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
807cdf0e10cSrcweir 				//}
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 				pResData->bList = sal_True;
810cdf0e10cSrcweir 				nList = LIST_STRING;
811cdf0e10cSrcweir                 //ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
812cdf0e10cSrcweir                 nListLang = SOURCE_LANGUAGE;
813cdf0e10cSrcweir 				nListIndex = 0;
814cdf0e10cSrcweir 				nListLevel = 0;
815cdf0e10cSrcweir 			}
816cdf0e10cSrcweir 			else if ( sKey == "FILTERLIST" ) {
817cdf0e10cSrcweir 				//if ( bUnmerge ){
818cdf0e10cSrcweir 				//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
819cdf0e10cSrcweir 				//}
820cdf0e10cSrcweir 				pResData->bList = sal_True;
821cdf0e10cSrcweir 				nList = LIST_FILTER;
822cdf0e10cSrcweir                 //ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
823cdf0e10cSrcweir 				nListLang = SOURCE_LANGUAGE;
824cdf0e10cSrcweir 				nListIndex = 0;
825cdf0e10cSrcweir 				nListLevel = 0;
826cdf0e10cSrcweir 			}
827cdf0e10cSrcweir 			else if ( sKey == "UIENTRIES" ) {
828cdf0e10cSrcweir 				//if ( bUnmerge ){
829cdf0e10cSrcweir 				//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));}
830cdf0e10cSrcweir 				pResData->bList = sal_True;
831cdf0e10cSrcweir 				nList = LIST_UIENTRIES;
832cdf0e10cSrcweir 				//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
833cdf0e10cSrcweir 				nListLang = SOURCE_LANGUAGE;
834cdf0e10cSrcweir 				nListIndex = 0;
835cdf0e10cSrcweir 				nListLevel = 0;
836cdf0e10cSrcweir 			}
837cdf0e10cSrcweir 			if (( sToken.Search( "{" ) != STRING_NOTFOUND ) &&
838cdf0e10cSrcweir 				( sToken.GetTokenCount( '{' ) > sToken.GetTokenCount( '}' )))
839cdf0e10cSrcweir 			{
840cdf0e10cSrcweir 				//WorkOnTokenSet( LEVELUP, pTkn );
841cdf0e10cSrcweir                 Parse( LEVELUP, "" );
842cdf0e10cSrcweir 			}
843cdf0e10cSrcweir             //if ( bUnmerge && ( nListLang.EqualsIgnoreCaseAscii("de") || nListLang.EqualsIgnoreCaseAscii("en-US") ) && ListExists( pResData, nList ))
844cdf0e10cSrcweir 			//	bDontWriteOutput = sal_True;
845cdf0e10cSrcweir  		}
846cdf0e10cSrcweir 		break;
847cdf0e10cSrcweir 		case UIENTRIES:
848cdf0e10cSrcweir 		case LISTASSIGNMENT: {
849cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
850cdf0e10cSrcweir             ByteString sTmpToken( sToken);
851cdf0e10cSrcweir             sTmpToken.EraseAllChars(' ');
852cdf0e10cSrcweir             sal_uInt16 nPos = 0;
853cdf0e10cSrcweir             //nPos = sTmpToken.ToLowerAscii().Search("[de]=");
854cdf0e10cSrcweir 			nPos = sTmpToken.ToLowerAscii().Search("[en-us]=");
855cdf0e10cSrcweir             if( nPos != STRING_NOTFOUND ) {
856cdf0e10cSrcweir 				//if ( bUnmerge ){
857cdf0e10cSrcweir 				//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
858cdf0e10cSrcweir 				//}
859cdf0e10cSrcweir                 ByteString sKey = sTmpToken.Copy( 0 , nPos );
860cdf0e10cSrcweir 				sKey.EraseAllChars( ' ' );
861cdf0e10cSrcweir 				sKey.EraseAllChars( '\t' );
862cdf0e10cSrcweir 				ByteString sValue = sToken.GetToken( 1, '=' );
863cdf0e10cSrcweir 				CleanValue( sValue );
864cdf0e10cSrcweir 				if ( sKey.ToUpperAscii() ==  "STRINGLIST" ) {
865cdf0e10cSrcweir 					pResData->bList = sal_True;
866cdf0e10cSrcweir 					nList = LIST_STRING;
867cdf0e10cSrcweir 					//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
868cdf0e10cSrcweir 					nListLang = SOURCE_LANGUAGE;
869cdf0e10cSrcweir 					nListIndex = 0;
870cdf0e10cSrcweir 					nListLevel = 0;
871cdf0e10cSrcweir 				}
872cdf0e10cSrcweir 				else if ( sKey == "FILTERLIST" ) {
873cdf0e10cSrcweir 					pResData->bList = sal_True;
874cdf0e10cSrcweir 					nList = LIST_FILTER;
875cdf0e10cSrcweir 					//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
876cdf0e10cSrcweir 					nListLang = SOURCE_LANGUAGE;
877cdf0e10cSrcweir 					nListIndex = 0;
878cdf0e10cSrcweir 					nListLevel = 0;
879cdf0e10cSrcweir 				}
880cdf0e10cSrcweir 				// PairedList
881cdf0e10cSrcweir                 else if ( sKey ==  "PAIREDLIST" ) {
882cdf0e10cSrcweir 					pResData->bList = sal_True;
883cdf0e10cSrcweir 					nList = LIST_PAIRED;
884cdf0e10cSrcweir 					//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
885cdf0e10cSrcweir 					nListLang = SOURCE_LANGUAGE;
886cdf0e10cSrcweir 					nListIndex = 0;
887cdf0e10cSrcweir 					nListLevel = 0;
888cdf0e10cSrcweir 				}
889cdf0e10cSrcweir 
890cdf0e10cSrcweir                 else if ( sKey ==  "ITEMLIST" ) {
891cdf0e10cSrcweir 					pResData->bList = sal_True;
892cdf0e10cSrcweir 					nList = LIST_ITEM;
893cdf0e10cSrcweir 					//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
894cdf0e10cSrcweir 					nListLang = SOURCE_LANGUAGE;
895cdf0e10cSrcweir 					nListIndex = 0;
896cdf0e10cSrcweir 					nListLevel = 0;
897cdf0e10cSrcweir 				}
898cdf0e10cSrcweir 				else if ( sKey ==  "UIENTRIES" ) {
899cdf0e10cSrcweir 					pResData->bList = sal_True;
900cdf0e10cSrcweir 					nList = LIST_UIENTRIES;
901cdf0e10cSrcweir 					//ByteString sLang("en-US" , RTL_TEXTENCODING_ASCII_US );
902cdf0e10cSrcweir 					nListLang = SOURCE_LANGUAGE;
903cdf0e10cSrcweir 					nListIndex = 0;
904cdf0e10cSrcweir 					nListLevel = 0;
905cdf0e10cSrcweir 				}
906cdf0e10cSrcweir                 /*if ( bUnmerge && ( nListLang.EqualsIgnoreCaseAscii( "de" )
907cdf0e10cSrcweir                     || nListLang.EqualsIgnoreCaseAscii("en-US" ) )
908cdf0e10cSrcweir                     && ListExists( pResData, nList ))
909cdf0e10cSrcweir 					bDontWriteOutput = sal_True;*/
910cdf0e10cSrcweir 			}
911cdf0e10cSrcweir 			else {
912cdf0e10cSrcweir 				// new res. is a String- or FilterList
913cdf0e10cSrcweir 				ByteString sKey = sToken.GetToken( 0, '[' );
914cdf0e10cSrcweir 				sKey.EraseAllChars( ' ' );
915cdf0e10cSrcweir 				sKey.EraseAllChars( '\t' );
916cdf0e10cSrcweir 				if ( sKey.ToUpperAscii() == "STRINGLIST" )
917cdf0e10cSrcweir 					nList = LIST_STRING;
918cdf0e10cSrcweir 				else if ( sKey == "FILTERLIST" )
919cdf0e10cSrcweir 					nList = LIST_FILTER;
920cdf0e10cSrcweir 				else if ( sKey == "PAIREDLIST" )
921cdf0e10cSrcweir 					nList = LIST_PAIRED;				// abcd
922cdf0e10cSrcweir 				else if ( sKey == "ITEMLIST" )
923cdf0e10cSrcweir 					nList = LIST_ITEM;
924cdf0e10cSrcweir 				else if ( sKey == "UIENTRIES" )
925cdf0e10cSrcweir 					nList = LIST_UIENTRIES;
926cdf0e10cSrcweir 				if ( nList ) {
927cdf0e10cSrcweir 					ByteString sLang=sToken.GetToken( 1, '[' ).GetToken( 0, ']' );
928cdf0e10cSrcweir 					CleanValue( sLang );
929cdf0e10cSrcweir                     nListLang = sLang;
930cdf0e10cSrcweir                     /*if (( bUnmerge ) && ( !nListLang.EqualsIgnoreCaseAscii("de")) && ( !nListLang.EqualsIgnoreCaseAscii("en-US")))
931cdf0e10cSrcweir                         bDontWriteOutput = sal_True;*/
932cdf0e10cSrcweir 					nListIndex = 0;
933cdf0e10cSrcweir 					nListLevel = 0;
934cdf0e10cSrcweir                     /*if ( bUnmerge && nListLang.EqualsIgnoreCaseAscii("de")  && ListExists( pResData, nList ) )
935cdf0e10cSrcweir 						bDontWriteOutput = sal_True;*/
936cdf0e10cSrcweir 				}
937cdf0e10cSrcweir 			}
938cdf0e10cSrcweir 		}
939cdf0e10cSrcweir 		break;
940cdf0e10cSrcweir 		case TEXT:
941cdf0e10cSrcweir 		case _LISTTEXT:
942cdf0e10cSrcweir 		case LISTTEXT: {
943cdf0e10cSrcweir 			// this is an entry for a String- or FilterList
944cdf0e10cSrcweir 			if ( nList ) {
945cdf0e10cSrcweir 				SetChildWithText();
946cdf0e10cSrcweir 				ByteString sEntry( sToken.GetToken( 1, '\"' ));
947cdf0e10cSrcweir 				if ( sToken.GetTokenCount( '\"' ) > 3 )
948cdf0e10cSrcweir 					sEntry += "\"";
949cdf0e10cSrcweir 				if ( sEntry == "\\\"" )
950cdf0e10cSrcweir 					sEntry = "\"";
951cdf0e10cSrcweir 				//sEntry = sEntry.Convert( aCharSet, RTL_TEXTENCODING_MS_1252 );
952cdf0e10cSrcweir 				//sEntry = sEntry.Convert( RTL_TEXTENCODING_MS_1252, RTL_TEXTENCODING_UTF8 );
953cdf0e10cSrcweir 				InsertListEntry( sEntry, sOrig );
954cdf0e10cSrcweir 				if ( bMergeMode && ( sEntry != "\"" )) {
955cdf0e10cSrcweir 					PrepareTextToMerge( sOrig, nList, nListLang, pResData );
956cdf0e10cSrcweir 				}
957cdf0e10cSrcweir 			}
958cdf0e10cSrcweir 		}
959cdf0e10cSrcweir 		break;
960cdf0e10cSrcweir 		case LONGTEXTLINE:
961cdf0e10cSrcweir 		case TEXTLINE:
962cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
963cdf0e10cSrcweir 			if ( nLevel ) {
964cdf0e10cSrcweir 				CutComment( sToken );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir 				// this is a text line!!!
967cdf0e10cSrcweir 				ByteString sKey = sToken.GetToken( 0, '=' ).GetToken( 0, '[' );
968cdf0e10cSrcweir 				sKey.EraseAllChars( ' ' );
969cdf0e10cSrcweir 				sKey.EraseAllChars( '\t' );
970cdf0e10cSrcweir 				ByteString sText( GetText( sToken, nToken ));
971cdf0e10cSrcweir 				if ( !bMergeMode )
972cdf0e10cSrcweir 					sText = sText.Convert( aCharSet, RTL_TEXTENCODING_MS_1252 );
973cdf0e10cSrcweir 				ByteString sLang;
974cdf0e10cSrcweir 				if ( sToken.GetToken( 0, '=' ).Search( "[" ) != STRING_NOTFOUND ) {
975cdf0e10cSrcweir  					sLang = sToken.GetToken( 0, '=' ).GetToken( 1, '[' ).GetToken( 0, ']' );
976cdf0e10cSrcweir 					CleanValue( sLang );
977cdf0e10cSrcweir 				}
978cdf0e10cSrcweir 				ByteString nLangIndex = sLang;
979cdf0e10cSrcweir                 ByteString sOrigKey = sKey;
980cdf0e10cSrcweir 				if ( sText.Len() && sLang.Len() ) {
981cdf0e10cSrcweir 					if (( sKey.ToUpperAscii() == "TEXT" ) ||
982cdf0e10cSrcweir 						( sKey == "MESSAGE" ) ||
983cdf0e10cSrcweir 						( sKey == "CUSTOMUNITTEXT" ) ||
984cdf0e10cSrcweir 						( sKey == "SLOTNAME" ) ||
985cdf0e10cSrcweir 						( sKey == "UINAME" ))
986cdf0e10cSrcweir 					{
987cdf0e10cSrcweir 						//if ( bUnmerge && sToken.GetToken( 0, '=' ).Search( "[" ) == STRING_NOTFOUND )
988cdf0e10cSrcweir 						//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
989cdf0e10cSrcweir 
990cdf0e10cSrcweir 						SetChildWithText();
991cdf0e10cSrcweir                         //if ( nLangIndex.EqualsIgnoreCaseAscii("en-US") )
992cdf0e10cSrcweir 						if ( Export::isSourceLanguage( nLangIndex ) )
993cdf0e10cSrcweir 							pResData->SetId( sText, ID_LEVEL_TEXT );
994cdf0e10cSrcweir 
995cdf0e10cSrcweir 						pResData->bText = sal_True;
996cdf0e10cSrcweir 						pResData->sTextTyp = sOrigKey;
997cdf0e10cSrcweir 						if ( bMergeMode ) {
998cdf0e10cSrcweir 							PrepareTextToMerge( sOrig, STRING_TYP_TEXT, nLangIndex, pResData );
999cdf0e10cSrcweir 							//if ( bUnmerge )
1000cdf0e10cSrcweir 							//	pResData->sText[ nLangIndex ] = sText;
1001cdf0e10cSrcweir 						}
1002cdf0e10cSrcweir 						else {
1003cdf0e10cSrcweir 							if ( pResData->sText[ nLangIndex ].Len()) {
1004cdf0e10cSrcweir 								ByteString sError( "Language " );
1005cdf0e10cSrcweir                                 sError += nLangIndex;
1006cdf0e10cSrcweir 								sError += " defined twice";
1007cdf0e10cSrcweir 							}
1008cdf0e10cSrcweir 							pResData->sText[ nLangIndex ] = sText;
1009cdf0e10cSrcweir 						}
1010cdf0e10cSrcweir 					}
1011cdf0e10cSrcweir 					else if ( sKey == "HELPTEXT" ) {
1012cdf0e10cSrcweir 						//if ( bUnmerge && sToken.GetToken( 0, '=' ).Search( "[" ) == STRING_NOTFOUND ){
1013cdf0e10cSrcweir 						//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
1014cdf0e10cSrcweir 						//	}
1015cdf0e10cSrcweir 						SetChildWithText();
1016cdf0e10cSrcweir 						pResData->bHelpText = sal_True;
1017cdf0e10cSrcweir 						if ( bBreakWhenHelpText ) {
1018cdf0e10cSrcweir 							ByteString sError( "\"HelpText\" found in source\n" );
1019cdf0e10cSrcweir 							YYWarning( sError.GetBufferAccess());
1020cdf0e10cSrcweir 							sError.ReleaseBufferAccess();
1021cdf0e10cSrcweir 							SetError();
1022cdf0e10cSrcweir 						}
1023cdf0e10cSrcweir 						if ( bMergeMode )
1024cdf0e10cSrcweir 							PrepareTextToMerge( sOrig, STRING_TYP_HELPTEXT, nLangIndex, pResData );
1025cdf0e10cSrcweir 							//if ( bUnmerge )
1026cdf0e10cSrcweir 							//	pResData->sHelpText[ nLangIndex ] = sText;
1027cdf0e10cSrcweir 						else {
1028cdf0e10cSrcweir 							if ( pResData->sHelpText[ nLangIndex ].Len()) {
1029cdf0e10cSrcweir 								ByteString sError( "Language " );
1030cdf0e10cSrcweir                                 sError += nLangIndex;
1031cdf0e10cSrcweir 								sError += " defined twice";
1032cdf0e10cSrcweir 							}
1033cdf0e10cSrcweir 							pResData->sHelpText[ nLangIndex ] = sText;
1034cdf0e10cSrcweir 						}
1035cdf0e10cSrcweir 					}
1036cdf0e10cSrcweir 					else if ( sKey == "QUICKHELPTEXT" ) {
1037cdf0e10cSrcweir 						//if ( bUnmerge && sToken.GetToken( 0, '=' ).Search( "[" ) == STRING_NOTFOUND ){
1038cdf0e10cSrcweir 						//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
1039cdf0e10cSrcweir 						//	}
1040cdf0e10cSrcweir 						SetChildWithText();
1041cdf0e10cSrcweir 						pResData->bQuickHelpText = sal_True;
1042cdf0e10cSrcweir 						if ( bMergeMode )
1043cdf0e10cSrcweir 							PrepareTextToMerge( sOrig, STRING_TYP_QUICKHELPTEXT, nLangIndex, pResData );
1044cdf0e10cSrcweir 							//if ( bUnmerge )
1045cdf0e10cSrcweir 							//	pResData->sQuickHelpText[ nLangIndex ] = sText;
1046cdf0e10cSrcweir 						else {
1047cdf0e10cSrcweir 							if ( pResData->sQuickHelpText[ nLangIndex ].Len()) {
1048cdf0e10cSrcweir 								ByteString sError( "Language " );
1049cdf0e10cSrcweir                                 sError += nLangIndex;
1050cdf0e10cSrcweir 								sError += " defined twice";
1051cdf0e10cSrcweir 							}
1052cdf0e10cSrcweir 							pResData->sQuickHelpText[ nLangIndex ] = sText;
1053cdf0e10cSrcweir 						}
1054cdf0e10cSrcweir 					}
1055cdf0e10cSrcweir 					else if ( sKey == "TITLE" ) {
1056cdf0e10cSrcweir 						//if ( bUnmerge && sToken.GetToken( 0, '=' ).Search( "[" ) == STRING_NOTFOUND ){
1057cdf0e10cSrcweir 						//	( sOrig.SearchAndReplace( "=", "[ de ] =" ));
1058cdf0e10cSrcweir 						//	}
1059cdf0e10cSrcweir 						SetChildWithText();
1060cdf0e10cSrcweir 						pResData->bTitle = sal_True;
1061cdf0e10cSrcweir 						if ( bMergeMode )
1062cdf0e10cSrcweir 							PrepareTextToMerge( sOrig, STRING_TYP_TITLE, nLangIndex, pResData );
1063cdf0e10cSrcweir 							//if ( bUnmerge )
1064cdf0e10cSrcweir 							//	pResData->sTitle[ nLangIndex ] = sText;
1065cdf0e10cSrcweir 						else {
1066cdf0e10cSrcweir 							if ( pResData->sTitle[ nLangIndex ].Len()) {
1067cdf0e10cSrcweir 								ByteString sError( "Language " );
1068cdf0e10cSrcweir                                 sError += nLangIndex;
1069cdf0e10cSrcweir 								sError += " defined twice";
1070cdf0e10cSrcweir 							}
1071cdf0e10cSrcweir 							pResData->sTitle[ nLangIndex ] = sText;
1072cdf0e10cSrcweir 						}
1073cdf0e10cSrcweir 					}
1074cdf0e10cSrcweir 					else if ( sKey == "ACCESSPATH" ) {
1075cdf0e10cSrcweir 						pResData->SetId( sText, ID_LEVEL_ACCESSPATH );
1076cdf0e10cSrcweir 					}
1077cdf0e10cSrcweir 					else if ( sKey == "FIELDNAME" ) {
1078cdf0e10cSrcweir 						pResData->SetId( sText, ID_LEVEL_FIELDNAME );
1079cdf0e10cSrcweir 					}
1080cdf0e10cSrcweir 				}
1081cdf0e10cSrcweir 			}
1082cdf0e10cSrcweir 		break;
1083cdf0e10cSrcweir 		case NEWTEXTINRES: {
1084cdf0e10cSrcweir 			bDontWriteOutput = sal_True;
1085cdf0e10cSrcweir 			// this means something like // ### Achtung : Neuer Text ...
1086cdf0e10cSrcweir 			/*ByteString sLang( "GERMAN" );
1087cdf0e10cSrcweir 			ByteString sText = sToken.GetToken( 2, ':' ).GetToken( 0, '*' );
1088cdf0e10cSrcweir 			CleanValue( sText );
1089cdf0e10cSrcweir 			if ( sText.Len())
1090cdf0e10cSrcweir             	pResData->sText[ sLang ] = sText;*/
1091cdf0e10cSrcweir 		}
1092cdf0e10cSrcweir 		break;
1093cdf0e10cSrcweir 		case APPFONTMAPPING: {
1094cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
1095cdf0e10cSrcweir 			// this is a AppfontMapping, so look if its a definition
1096cdf0e10cSrcweir 			// of field size
1097cdf0e10cSrcweir 			ByteString sKey = sToken.GetToken( 0, '=' );
1098cdf0e10cSrcweir 			sKey.EraseAllChars( ' ' );
1099cdf0e10cSrcweir 			sKey.EraseAllChars( '\t' );
1100cdf0e10cSrcweir 			ByteString sMapping = sToken.GetToken( 1, '=' );
1101cdf0e10cSrcweir 			sMapping = sMapping.GetToken( 1, '(' );
1102cdf0e10cSrcweir 			sMapping = sMapping.GetToken( 0, ')' );
1103cdf0e10cSrcweir 			sMapping.EraseAllChars( ' ' );
1104cdf0e10cSrcweir 			sMapping.EraseAllChars( '\t' );
1105cdf0e10cSrcweir 			if ( sKey.ToUpperAscii() == "SIZE" ) {
1106cdf0e10cSrcweir 				pResData->nWidth = ( sal_uInt16 ) sMapping.GetToken( 0, ',' ).ToInt64();
1107cdf0e10cSrcweir 			}
1108cdf0e10cSrcweir 			else if ( sKey == "POSSIZE" ) {
1109cdf0e10cSrcweir 				pResData->nWidth = ( sal_uInt16 ) sMapping.GetToken( 2, ',' ).ToInt64();
1110cdf0e10cSrcweir 			}
1111cdf0e10cSrcweir 		}
1112cdf0e10cSrcweir 		break;
1113cdf0e10cSrcweir 		case RSCDEFINELEND:
1114cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
1115cdf0e10cSrcweir 		break;
1116cdf0e10cSrcweir 		case CONDITION: {
1117cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
1118cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "\r", " " ) != STRING_NOTFOUND ) {};
1119cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
1120cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "  ", " " ) != STRING_NOTFOUND ) {};
1121cdf0e10cSrcweir 			ByteString sCondition = sToken.GetToken( 0, ' ' );
1122cdf0e10cSrcweir 			if ( sCondition == "#ifndef" ) {
1123cdf0e10cSrcweir 				sActPForm = "!defined ";
1124cdf0e10cSrcweir 				sActPForm += sToken.GetToken( 1, ' ' );
1125cdf0e10cSrcweir 			}
1126cdf0e10cSrcweir 			else if ( sCondition == "#ifdef" ) {
1127cdf0e10cSrcweir 				sActPForm = "defined ";
1128cdf0e10cSrcweir 				sActPForm += sToken.GetToken( 1, ' ' );
1129cdf0e10cSrcweir 			}
1130cdf0e10cSrcweir 			else if ( sCondition == "#if" ) {
1131cdf0e10cSrcweir 				sActPForm = sToken.Copy( 4 );
1132cdf0e10cSrcweir 				while ( sActPForm.SearchAndReplace( "||", "\\or" ) != STRING_NOTFOUND ) {};
1133cdf0e10cSrcweir 			}
1134cdf0e10cSrcweir 			else if ( sCondition == "#elif" ) {
1135cdf0e10cSrcweir 				sActPForm = sToken.Copy( 6 );
1136cdf0e10cSrcweir 				while ( sActPForm.SearchAndReplace( "||", "\\or" ) != STRING_NOTFOUND ) {};
1137cdf0e10cSrcweir 			}
1138cdf0e10cSrcweir 			else if ( sCondition == "#else" ) {
1139cdf0e10cSrcweir 				sActPForm = sCondition;
1140cdf0e10cSrcweir 			}
1141cdf0e10cSrcweir 			else if ( sCondition == "#endif" ) {
1142cdf0e10cSrcweir 				sActPForm = "";
1143cdf0e10cSrcweir 			}
1144cdf0e10cSrcweir 			else break;
1145cdf0e10cSrcweir 			if ( nLevel ) {
1146cdf0e10cSrcweir 				WriteData( pResData, sal_True );
1147cdf0e10cSrcweir 				pResData->sPForm = sActPForm;
1148cdf0e10cSrcweir 			}
1149cdf0e10cSrcweir 		}
1150cdf0e10cSrcweir 		break;
1151cdf0e10cSrcweir 		case EMPTYLINE : {
1152cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
1153cdf0e10cSrcweir 			if ( bDefine ) {
1154cdf0e10cSrcweir 				bNextMustBeDefineEOL = sal_False;
1155cdf0e10cSrcweir                 bDefine = sal_False;
1156cdf0e10cSrcweir 				while ( nLevel )
1157cdf0e10cSrcweir 					Parse( LEVELDOWN, "" );
1158cdf0e10cSrcweir                     //WorkOnTokenSet( LEVELDOWN, pTkn );
1159cdf0e10cSrcweir 			}
1160cdf0e10cSrcweir 		}
1161cdf0e10cSrcweir 		break;
1162cdf0e10cSrcweir 		case PRAGMA : {
1163cdf0e10cSrcweir 			bDontWriteOutput = sal_False;
1164cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
1165cdf0e10cSrcweir 			while( sToken.SearchAndReplace( "  ", " " ) != STRING_NOTFOUND ) {};
1166cdf0e10cSrcweir 			sToken.EraseLeadingChars( ' ' );
1167cdf0e10cSrcweir 			sToken.EraseTrailingChars( ' ' );
1168cdf0e10cSrcweir 
1169cdf0e10cSrcweir 			ByteString sCharset = sToken.GetToken( 1, ' ' );
1170cdf0e10cSrcweir 			ByteString sSet = sToken.GetToken( 2, ' ' );
1171cdf0e10cSrcweir 			if (( sCharset.ToUpperAscii() == "CHARSET_IBMPC" ) ||
1172cdf0e10cSrcweir 				( sCharset == "RTL_TEXTENCODING_IBM_850" ) ||
1173cdf0e10cSrcweir 				(( sCharset == "CHARSET" ) && ( sSet.ToUpperAscii() == "IBMPC" )))
1174cdf0e10cSrcweir 			{
1175cdf0e10cSrcweir 				aCharSet = RTL_TEXTENCODING_IBM_850;
1176cdf0e10cSrcweir 			}
1177cdf0e10cSrcweir 			else if (( sCharset == "CHARSET_ANSI" ) ||
1178cdf0e10cSrcweir 				( sCharset == "RTL_TEXTENCODING_MS_1252" ) ||
1179cdf0e10cSrcweir 				(( sCharset == "CHARSET" ) && ( sSet.ToUpperAscii() == "ANSI" )))
1180cdf0e10cSrcweir 			{
1181cdf0e10cSrcweir 				aCharSet = RTL_TEXTENCODING_MS_1252;
1182cdf0e10cSrcweir 			}
1183cdf0e10cSrcweir 		}
1184cdf0e10cSrcweir 		break;
1185cdf0e10cSrcweir 		case TEXTREFID : {
1186cdf0e10cSrcweir 			bDontWriteOutput = sal_True;
1187cdf0e10cSrcweir  			/*ByteString sK = sToken.GetToken( 0, '=' );
1188cdf0e10cSrcweir             ByteString sKey = sK.EraseAllChars( '\t' ).EraseAllChars( ' ' );
1189cdf0e10cSrcweir 			ByteString sT = sToken.GetToken( 1, '=' ).GetToken( 0, ';' );
1190cdf0e10cSrcweir             sal_uInt16 nRefId = ( sal_uInt16 ) sT.EraseAllChars( '\t' ).EraseAllChars( ' ' ).ToInt32();
1191cdf0e10cSrcweir 			if (( sKey.ToUpperAscii() == "TEXT" ) ||
1192cdf0e10cSrcweir 				( sKey == "MESSAGE" ) ||
1193cdf0e10cSrcweir 				( sKey == "CUSTOMUNITTEXT" ) ||
1194cdf0e10cSrcweir 				( sKey == "SLOTNAME" ) ||
1195cdf0e10cSrcweir 				( sKey == "UINAME" ))
1196cdf0e10cSrcweir 					pResData->nTextRefId = nRefId;
1197cdf0e10cSrcweir 			else if ( sKey == "HELPTEXT" )
1198cdf0e10cSrcweir 				pResData->nHelpTextRefId = nRefId;
1199cdf0e10cSrcweir 			else if ( sKey == "QUICKHELPTEXT" )
1200cdf0e10cSrcweir 				pResData->nQuickHelpTextRefId = nRefId;
1201cdf0e10cSrcweir 			else if ( sKey == "TITLE" )
1202cdf0e10cSrcweir 				pResData->nTitleRefId = nRefId;*/
1203cdf0e10cSrcweir 		}
1204cdf0e10cSrcweir 		}
1205cdf0e10cSrcweir 	if ( bWriteToMerged ) {
1206cdf0e10cSrcweir 		// the current token must be written to dest. without merging
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir         if( bDefine && sOrig.Len() > 2 ){
1209cdf0e10cSrcweir             for( sal_uInt16 n = 0 ; n < sOrig.Len() ; n++ ){
1210cdf0e10cSrcweir                 if( sOrig.GetChar( n ) == '\n' && sOrig.GetChar( n-1 ) != '\\'){
1211cdf0e10cSrcweir                     sOrig.Insert('\\' , n++ );
1212cdf0e10cSrcweir                 }
1213cdf0e10cSrcweir             }
1214cdf0e10cSrcweir         }
1215cdf0e10cSrcweir         WriteToMerged( sOrig , false);
1216cdf0e10cSrcweir 	}
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir 	if ( bExecuteDown ) {
1219cdf0e10cSrcweir 		Parse( LEVELDOWN, "" );
1220cdf0e10cSrcweir         //WorkOnTokenSet( LEVELDOWN, pTkn );
1221cdf0e10cSrcweir 	}
1222cdf0e10cSrcweir 
1223cdf0e10cSrcweir 	return 1;
1224cdf0e10cSrcweir }
1225cdf0e10cSrcweir 
1226cdf0e10cSrcweir /*****************************************************************************/
CutComment(ByteString & rText)1227cdf0e10cSrcweir void Export::CutComment( ByteString &rText )
1228cdf0e10cSrcweir /*****************************************************************************/
1229cdf0e10cSrcweir {
1230cdf0e10cSrcweir 	if ( rText.Search( "//" ) != STRING_NOTFOUND ) {
1231cdf0e10cSrcweir 		ByteString sWork( rText );
1232cdf0e10cSrcweir 		sWork.SearchAndReplaceAll( "\\\"", "XX" );
1233cdf0e10cSrcweir 		sal_uInt16 i = 0;
1234cdf0e10cSrcweir 		sal_Bool bInner = sal_False;
1235cdf0e10cSrcweir 
1236cdf0e10cSrcweir 		while ( i < sWork.Len() - 1 ) {
1237cdf0e10cSrcweir 			if ( sWork.GetChar( i ) == '\"' )
1238cdf0e10cSrcweir 				bInner = !bInner;
1239cdf0e10cSrcweir 			else if
1240cdf0e10cSrcweir 				(( sWork.GetChar( i ) == '/' ) &&
1241cdf0e10cSrcweir 				( !bInner ) &&
1242cdf0e10cSrcweir 				( sWork.GetChar( i + 1 ) == '/' ))
1243cdf0e10cSrcweir 			{
1244cdf0e10cSrcweir 				rText.Erase( i );
1245cdf0e10cSrcweir 				return;
1246cdf0e10cSrcweir 			}
1247cdf0e10cSrcweir 			i++;
1248cdf0e10cSrcweir 		}
1249cdf0e10cSrcweir 	}
1250cdf0e10cSrcweir }
1251cdf0e10cSrcweir 
UnmergeUTF8(ByteString & sOrig)1252cdf0e10cSrcweir void Export::UnmergeUTF8( ByteString& sOrig ){
1253cdf0e10cSrcweir 	sal_uInt16 nPos1 = sOrig.Search('\"');
1254cdf0e10cSrcweir 	sal_uInt16 nPos2 = sOrig.SearchBackward('\"');
1255cdf0e10cSrcweir 	if( nPos1 > 0 && nPos2 > 0 && nPos1 < nPos2){
1256cdf0e10cSrcweir 		ByteString sPart = sOrig.Copy(nPos1+1 , nPos2-1);
1257cdf0e10cSrcweir 		ByteString sPartUTF8 = sPart;
1258cdf0e10cSrcweir 		sPartUTF8.Convert( RTL_TEXTENCODING_MS_1252 , RTL_TEXTENCODING_UTF8 );
1259cdf0e10cSrcweir 		sOrig.SearchAndReplace( sPart , sPartUTF8 );
1260cdf0e10cSrcweir 	}
1261cdf0e10cSrcweir }
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir /*****************************************************************************/
ListExists(ResData * pResData,sal_uInt16 nLst)1264cdf0e10cSrcweir sal_Bool Export::ListExists( ResData *pResData, sal_uInt16 nLst )
1265cdf0e10cSrcweir /*****************************************************************************/
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir 	switch ( nLst ) {
1268cdf0e10cSrcweir 		case LIST_STRING: return pResData->pStringList != NULL;
1269cdf0e10cSrcweir 		case LIST_FILTER: return pResData->pFilterList != NULL;
1270cdf0e10cSrcweir 		case LIST_ITEM: return pResData->pItemList != NULL;
1271cdf0e10cSrcweir         case LIST_PAIRED: return pResData->pPairedList != NULL;
1272cdf0e10cSrcweir 		case LIST_UIENTRIES: return pResData->pUIEntries != NULL;
1273cdf0e10cSrcweir 	}
1274cdf0e10cSrcweir 	return sal_False;
1275cdf0e10cSrcweir }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir /*****************************************************************************/
WriteData(ResData * pResData,sal_Bool bCreateNew)1278cdf0e10cSrcweir sal_Bool Export::WriteData( ResData *pResData, sal_Bool bCreateNew )
1279cdf0e10cSrcweir /*****************************************************************************/
1280cdf0e10cSrcweir {
1281cdf0e10cSrcweir 	if ( bMergeMode ) {
1282cdf0e10cSrcweir 		MergeRest( pResData );
1283cdf0e10cSrcweir 		return sal_True;
1284cdf0e10cSrcweir 	}
1285cdf0e10cSrcweir 
1286cdf0e10cSrcweir 	if ( bUnmerge )
1287cdf0e10cSrcweir 		return sal_True;
1288cdf0e10cSrcweir 
1289cdf0e10cSrcweir /*    ByteStringHashMap::iterator pos3 = pResData->sText.begin();
1290cdf0e10cSrcweir     ByteStringHashMap::iterator end3 = pResData->sText.end();
1291cdf0e10cSrcweir     for(;pos3!=end3;++pos3){
1292cdf0e10cSrcweir 
1293cdf0e10cSrcweir         printf("[%s]=%s\n", pos3->first.GetBuffer(), pos3->second.GetBuffer() );
1294cdf0e10cSrcweir     }*/
1295cdf0e10cSrcweir    	// mandatory to export: en-US
1296cdf0e10cSrcweir 
1297cdf0e10cSrcweir      if (( //pResData->sText[ ByteString("de") ].Len() &&
1298cdf0e10cSrcweir         ( pResData->sText[ SOURCE_LANGUAGE ].Len()))
1299cdf0e10cSrcweir         ||
1300cdf0e10cSrcweir         ( //pResData->sHelpText[ ByteString("de") ].Len() &&
1301cdf0e10cSrcweir         (  pResData->sHelpText[ SOURCE_LANGUAGE ].Len()))
1302cdf0e10cSrcweir         ||
1303cdf0e10cSrcweir         ( //pResData->sQuickHelpText[ ByteString("de") ].Len() &&
1304cdf0e10cSrcweir         (  pResData->sQuickHelpText[ SOURCE_LANGUAGE ].Len()))
1305cdf0e10cSrcweir          ||
1306cdf0e10cSrcweir         ( //pResData->sTitle[ ByteString("de") ].Len() &&
1307cdf0e10cSrcweir         (  pResData->sTitle[ SOURCE_LANGUAGE ].Len())))
1308cdf0e10cSrcweir 
1309cdf0e10cSrcweir    	{
1310cdf0e10cSrcweir 		FillInFallbacks( pResData );
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir 		ByteString sGID = pResData->sGId;
1313cdf0e10cSrcweir 		ByteString sLID;
1314cdf0e10cSrcweir 		if ( !sGID.Len())
1315cdf0e10cSrcweir 			sGID = pResData->sId;
1316cdf0e10cSrcweir 		else
1317cdf0e10cSrcweir 			sLID = pResData->sId;
1318cdf0e10cSrcweir 
1319cdf0e10cSrcweir 		ByteString sXText;
1320cdf0e10cSrcweir 		ByteString sXHText;
1321cdf0e10cSrcweir 		ByteString sXQHText;
1322cdf0e10cSrcweir 		ByteString sXTitle;
1323cdf0e10cSrcweir 
1324cdf0e10cSrcweir 		ByteString sTimeStamp( Export::GetTimeStamp());
1325cdf0e10cSrcweir         ByteString sCur;
1326cdf0e10cSrcweir 
1327cdf0e10cSrcweir         for( unsigned int n = 0; n < aLanguages.size(); n++ ){
1328cdf0e10cSrcweir             sCur = aLanguages[ n ];
1329cdf0e10cSrcweir                 if ( !sCur.EqualsIgnoreCaseAscii("x-comment") ){
1330cdf0e10cSrcweir                     if ( pResData->sText[ sCur ].Len())
1331cdf0e10cSrcweir                         sXText = pResData->sText[ sCur ];
1332cdf0e10cSrcweir 					else {
1333cdf0e10cSrcweir 						sXText = pResData->sText[ SOURCE_LANGUAGE ];
1334cdf0e10cSrcweir 						/*if ( !sXText.Len())
1335cdf0e10cSrcweir 							sXText = pResData->sText[ ByteString("en") ];
1336cdf0e10cSrcweir 						if ( !sXText.Len())
1337cdf0e10cSrcweir 							sXText = pResData->sText[ ByteString("de") ];*/
1338cdf0e10cSrcweir 					}
1339cdf0e10cSrcweir 
1340cdf0e10cSrcweir                     if ( pResData->sHelpText[ sCur ].Len())
1341cdf0e10cSrcweir                         sXHText = pResData->sHelpText[ sCur ];
1342cdf0e10cSrcweir 					else {
1343cdf0e10cSrcweir 						sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ];
1344cdf0e10cSrcweir 						/*if ( !sXHText.Len())
1345cdf0e10cSrcweir 							sXHText = pResData->sHelpText[ ByteString("en") ];
1346cdf0e10cSrcweir 						if ( !sXText.Len())
1347cdf0e10cSrcweir 							sXHText = pResData->sHelpText[ ByteString("de") ];*/
1348cdf0e10cSrcweir 					}
1349cdf0e10cSrcweir 
1350cdf0e10cSrcweir                     if ( pResData->sQuickHelpText[ sCur ].Len())
1351cdf0e10cSrcweir                         sXQHText = pResData->sQuickHelpText[ sCur ];
1352cdf0e10cSrcweir 					else {
1353cdf0e10cSrcweir 						sXQHText = pResData->sQuickHelpText[ SOURCE_LANGUAGE ];
1354cdf0e10cSrcweir 						/*if ( !sXQHText.Len())
1355cdf0e10cSrcweir 							sXQHText = pResData->sQuickHelpText[ ByteString("en") ];
1356cdf0e10cSrcweir 						if ( !sXQHText.Len())
1357cdf0e10cSrcweir 							sXQHText = pResData->sQuickHelpText[ ByteString("de") ];*/
1358cdf0e10cSrcweir 					}
1359cdf0e10cSrcweir 
1360cdf0e10cSrcweir                     if ( pResData->sTitle[ sCur ].Len())
1361cdf0e10cSrcweir                         sXTitle = pResData->sTitle[ sCur ];
1362cdf0e10cSrcweir 					else {
1363cdf0e10cSrcweir 						sXTitle = pResData->sTitle[ SOURCE_LANGUAGE ];
1364cdf0e10cSrcweir 						/*if ( !sXTitle.Len())
1365cdf0e10cSrcweir 							sXTitle = pResData->sTitle[ ByteString("en") ];
1366cdf0e10cSrcweir 						if ( !sXTitle.Len())
1367cdf0e10cSrcweir 							sXTitle = pResData->sTitle[ ByteString("de") ];*/
1368cdf0e10cSrcweir 					}
1369cdf0e10cSrcweir 
1370cdf0e10cSrcweir 					if ( !sXText.Len())
1371cdf0e10cSrcweir 						sXText = "-";
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir 					if ( !sXHText.Len()) {
1374cdf0e10cSrcweir 						/*if ( pResData->sHelpText[ ByteString("de") ].Len())
1375cdf0e10cSrcweir 							sXHText = pResData->sHelpText[ ByteString("de") ];*/
1376cdf0e10cSrcweir 						if ( pResData->sHelpText[ SOURCE_LANGUAGE ].Len())
1377cdf0e10cSrcweir 							sXHText = pResData->sHelpText[ SOURCE_LANGUAGE ];
1378cdf0e10cSrcweir 						/*else if ( pResData->sHelpText[ ByteString("en") ].Len())
1379cdf0e10cSrcweir 							sXHText = pResData->sHelpText[ ByteString("en") ];*/
1380cdf0e10cSrcweir 					}
1381cdf0e10cSrcweir 				}
1382cdf0e10cSrcweir 				else
1383cdf0e10cSrcweir                     sXText = pResData->sText[ sCur ];
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir 				if ( bEnableExport ) {
1386cdf0e10cSrcweir 					ByteString sOutput( sProject ); sOutput += "\t";
1387cdf0e10cSrcweir 					if ( sRoot.Len())
1388cdf0e10cSrcweir 						sOutput += sActFileName;
1389cdf0e10cSrcweir 					sOutput += "\t0\t";
1390cdf0e10cSrcweir 					sOutput += pResData->sResTyp; sOutput += "\t";
1391cdf0e10cSrcweir 					sOutput += sGID; sOutput += "\t";
1392cdf0e10cSrcweir 					sOutput += sLID; sOutput += "\t";
1393cdf0e10cSrcweir 					sOutput += pResData->sHelpId; sOutput	+= "\t";
1394cdf0e10cSrcweir 					sOutput += pResData->sPForm; sOutput	+= "\t";
1395cdf0e10cSrcweir 					sOutput += ByteString::CreateFromInt64( pResData->nWidth ); sOutput += "\t";
1396cdf0e10cSrcweir                     sOutput += sCur; sOutput += "\t";
1397cdf0e10cSrcweir 
1398cdf0e10cSrcweir 
1399cdf0e10cSrcweir 					sOutput += sXText; sOutput	+= "\t";
1400cdf0e10cSrcweir 					sOutput += sXHText; sOutput += "\t";
1401cdf0e10cSrcweir 					sOutput += sXQHText; sOutput+= "\t";
1402cdf0e10cSrcweir 					sOutput += sXTitle; sOutput += "\t";
1403cdf0e10cSrcweir 					sOutput += sTimeStamp;
1404cdf0e10cSrcweir 
1405cdf0e10cSrcweir                  // if( !sCur.EqualsIgnoreCaseAscii("de") ||( sCur.EqualsIgnoreCaseAscii("de") && !Export::isMergingGermanAllowed( sProject ) ) )
1406cdf0e10cSrcweir 				    aOutput.WriteLine( sOutput );
1407cdf0e10cSrcweir 				}
1408cdf0e10cSrcweir 
1409cdf0e10cSrcweir 				if ( bCreateNew ) {
1410cdf0e10cSrcweir                     pResData->sText[ sCur ]			= "";
1411cdf0e10cSrcweir 					pResData->sHelpText[ sCur ]		= "";
1412cdf0e10cSrcweir 					pResData->sQuickHelpText[ sCur ]= "";
1413cdf0e10cSrcweir 					pResData->sTitle[ sCur ]		= "";
1414cdf0e10cSrcweir 				}
1415cdf0e10cSrcweir 			}
1416cdf0e10cSrcweir 	}
1417cdf0e10cSrcweir 	FillInFallbacks( pResData );
1418cdf0e10cSrcweir 	if ( pResData->pStringList ) {
1419cdf0e10cSrcweir 		ByteString sList( "stringlist" );
1420cdf0e10cSrcweir 		WriteExportList( pResData, pResData->pStringList, sList, bCreateNew );
1421cdf0e10cSrcweir 		if ( bCreateNew )
1422cdf0e10cSrcweir 			pResData->pStringList = 0;
1423cdf0e10cSrcweir 	}
1424cdf0e10cSrcweir 	if ( pResData->pFilterList ) {
1425cdf0e10cSrcweir 		ByteString sList( "filterlist" );
1426cdf0e10cSrcweir 		WriteExportList( pResData, pResData->pFilterList, sList, bCreateNew );
1427cdf0e10cSrcweir 		if ( bCreateNew )
1428cdf0e10cSrcweir 			pResData->pFilterList = 0;
1429cdf0e10cSrcweir 	}
1430cdf0e10cSrcweir 	if ( pResData->pItemList ) {
1431cdf0e10cSrcweir 		ByteString sList( "itemlist" );
1432cdf0e10cSrcweir 		WriteExportList( pResData, pResData->pItemList, sList, bCreateNew );
1433cdf0e10cSrcweir 		if ( bCreateNew )
1434cdf0e10cSrcweir 			pResData->pItemList = 0;
1435cdf0e10cSrcweir 	}
1436cdf0e10cSrcweir 	if ( pResData->pPairedList ) {
1437cdf0e10cSrcweir 		ByteString sList( "pairedlist" );
1438cdf0e10cSrcweir 		WriteExportList( pResData, pResData->pPairedList, sList, bCreateNew );
1439cdf0e10cSrcweir 		if ( bCreateNew )
1440cdf0e10cSrcweir 			pResData->pItemList = 0;
1441cdf0e10cSrcweir 	}
1442cdf0e10cSrcweir 	if ( pResData->pUIEntries ) {
1443cdf0e10cSrcweir 		ByteString sList( "uientries" );
1444cdf0e10cSrcweir 		WriteExportList( pResData, pResData->pUIEntries, sList, bCreateNew );
1445cdf0e10cSrcweir 		if ( bCreateNew )
1446cdf0e10cSrcweir 			pResData->pUIEntries = 0;
1447cdf0e10cSrcweir 	}
1448cdf0e10cSrcweir 	return sal_True;
1449cdf0e10cSrcweir }
GetPairedListID(const ByteString & sText)1450cdf0e10cSrcweir ByteString Export::GetPairedListID( const ByteString& sText ){
1451cdf0e10cSrcweir // < "STRING" ; IDENTIFIER ; > ;
1452cdf0e10cSrcweir     ByteString sIdent = sText.GetToken( 1, ';' );
1453cdf0e10cSrcweir     sIdent.ToUpperAscii();
1454cdf0e10cSrcweir     while( sIdent.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
1455cdf0e10cSrcweir     sIdent.EraseTrailingChars( ' ' );
1456cdf0e10cSrcweir 	sIdent.EraseLeadingChars( ' ' );
1457cdf0e10cSrcweir     return sIdent;
1458cdf0e10cSrcweir }
GetPairedListString(const ByteString & sText)1459cdf0e10cSrcweir ByteString Export::GetPairedListString( const ByteString& sText ){
1460cdf0e10cSrcweir // < "STRING" ; IDENTIFIER ; > ;
1461cdf0e10cSrcweir 	ByteString sString = sText.GetToken( 0, ';' );
1462cdf0e10cSrcweir     while( sString.SearchAndReplace( "\t", " " ) != STRING_NOTFOUND ) {};
1463cdf0e10cSrcweir     sString.EraseTrailingChars( ' ' );
1464cdf0e10cSrcweir 	ByteString s1 = sString.Copy( sString.Search( '\"' )+1 );
1465cdf0e10cSrcweir 	sString = s1.Copy( 0 , s1.SearchBackward( '\"' ) );
1466cdf0e10cSrcweir 	sString.EraseTrailingChars( ' ' );
1467cdf0e10cSrcweir 	sString.EraseLeadingChars( ' ' );
1468cdf0e10cSrcweir     return sString;
1469cdf0e10cSrcweir }
StripList(const ByteString & sText)1470cdf0e10cSrcweir ByteString Export::StripList( const ByteString& sText ){
1471cdf0e10cSrcweir 	ByteString s1 = sText.Copy( sText.Search( '\"' ) + 1 );
1472cdf0e10cSrcweir 	return s1.Copy( 0 , s1.SearchBackward( '\"' ) );
1473cdf0e10cSrcweir }
1474cdf0e10cSrcweir 
1475cdf0e10cSrcweir /*****************************************************************************/
WriteExportList(ResData * pResData,ExportList * pExportList,const ByteString & rTyp,sal_Bool bCreateNew)1476cdf0e10cSrcweir sal_Bool Export::WriteExportList( ResData *pResData, ExportList *pExportList,
1477cdf0e10cSrcweir 						const ByteString &rTyp, sal_Bool bCreateNew )
1478cdf0e10cSrcweir /*****************************************************************************/
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir 	ByteString sGID = pResData->sGId;
1481cdf0e10cSrcweir 	if ( !sGID.Len())
1482cdf0e10cSrcweir 		sGID = pResData->sId;
1483cdf0e10cSrcweir 	else {
1484cdf0e10cSrcweir 		sGID += ".";
1485cdf0e10cSrcweir 		sGID += pResData->sId;
1486cdf0e10cSrcweir 		sGID.EraseTrailingChars( '.' );
1487cdf0e10cSrcweir 	}
1488cdf0e10cSrcweir 
1489cdf0e10cSrcweir 	ByteString sTimeStamp( Export::GetTimeStamp());
1490cdf0e10cSrcweir     ByteString sCur;
1491cdf0e10cSrcweir 	for ( sal_uLong i = 0; pExportList != NULL && i < pExportList->Count(); i++ ) {
1492cdf0e10cSrcweir 		ExportListEntry *pEntry = pExportList->GetObject( i );
1493cdf0e10cSrcweir 				// mandatory for export: german and eng. and/or enus
1494cdf0e10cSrcweir 		//ByteString a("Export::WriteExportList::pEntry");
1495cdf0e10cSrcweir 		//Export::DumpMap( a,  *pEntry );
1496cdf0e10cSrcweir 
1497cdf0e10cSrcweir 		ByteString sLID( ByteString::CreateFromInt64( i + 1 ));
1498cdf0e10cSrcweir         for( unsigned int n = 0; n < aLanguages.size(); n++ ){
1499cdf0e10cSrcweir             sCur = aLanguages[ n ];
1500cdf0e10cSrcweir             if ( //1 )
1501cdf0e10cSrcweir 				  //(*pEntry)[ ByteString("de") ].Len() &&
1502cdf0e10cSrcweir 				 	(*pEntry)[ SOURCE_LANGUAGE ].Len() )
1503cdf0e10cSrcweir 					//||
1504cdf0e10cSrcweir 				 	// 	(*pEntry)[ ByteString("en") ].Len()))
1505cdf0e10cSrcweir 				{
1506cdf0e10cSrcweir 					if ( bEnableExport )
1507cdf0e10cSrcweir 					{
1508cdf0e10cSrcweir 						ByteString sText((*pEntry)[ SOURCE_LANGUAGE ] );
1509cdf0e10cSrcweir 
1510cdf0e10cSrcweir                         // Strip PairList Line String
1511cdf0e10cSrcweir 						if( rTyp.EqualsIgnoreCaseAscii("pairedlist") ){
1512cdf0e10cSrcweir                             sLID = GetPairedListID( sText );
1513cdf0e10cSrcweir 							if ((*pEntry)[ sCur ].Len())
1514cdf0e10cSrcweir 								sText = (*pEntry)[ sCur ];
1515cdf0e10cSrcweir 							sText = GetPairedListString( sText );
1516cdf0e10cSrcweir                         }
1517cdf0e10cSrcweir 						else{
1518cdf0e10cSrcweir 							//if ((*pEntry)[ sCur ].Len()){
1519cdf0e10cSrcweir 							//	if( sCur.EqualsIgnoreCaseAscii("de") ){
1520cdf0e10cSrcweir 							//		sText = StripList( (*pEntry)[ sCur ] );
1521cdf0e10cSrcweir 							//	}
1522cdf0e10cSrcweir 							//	else
1523cdf0e10cSrcweir 									sText = StripList( (*pEntry)[ sCur ] );
1524cdf0e10cSrcweir                                     if( sText == "\\\"" )
1525cdf0e10cSrcweir                                         sText = "\"";
1526cdf0e10cSrcweir 							//}
1527cdf0e10cSrcweir 						}
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir 						ByteString sOutput( sProject ); sOutput += "\t";
1530cdf0e10cSrcweir 						if ( sRoot.Len())
1531cdf0e10cSrcweir 							sOutput += sActFileName;
1532cdf0e10cSrcweir 						sOutput += "\t0\t";
1533cdf0e10cSrcweir 						sOutput += rTyp; sOutput += "\t";
1534cdf0e10cSrcweir 						sOutput += sGID; sOutput += "\t";
1535cdf0e10cSrcweir 						sOutput += sLID; sOutput += "\t\t";
1536cdf0e10cSrcweir 						sOutput += pResData->sPForm; sOutput += "\t0\t";
1537cdf0e10cSrcweir                         sOutput += sCur; sOutput += "\t";
1538cdf0e10cSrcweir 
1539cdf0e10cSrcweir 						sOutput += sText; sOutput += "\t\t\t\t";
1540cdf0e10cSrcweir 						sOutput += sTimeStamp;
1541cdf0e10cSrcweir 
1542cdf0e10cSrcweir                         //if( !sCur.EqualsIgnoreCaseAscii("de") ||( sCur.EqualsIgnoreCaseAscii("de") && !Export::isMergingGermanAllowed( sProject ) ) )
1543cdf0e10cSrcweir                         aOutput.WriteLine( sOutput );
1544cdf0e10cSrcweir 
1545cdf0e10cSrcweir 					}
1546cdf0e10cSrcweir 				}
1547cdf0e10cSrcweir 		}
1548cdf0e10cSrcweir 		if ( bCreateNew )
1549cdf0e10cSrcweir 			delete [] pEntry;
1550cdf0e10cSrcweir 	}
1551cdf0e10cSrcweir 	if ( bCreateNew )
1552cdf0e10cSrcweir 		delete pExportList;
1553cdf0e10cSrcweir 
1554cdf0e10cSrcweir 	return sal_True;
1555cdf0e10cSrcweir }
1556cdf0e10cSrcweir 
1557cdf0e10cSrcweir /*****************************************************************************/
FullId()1558cdf0e10cSrcweir ByteString Export::FullId()
1559cdf0e10cSrcweir /*****************************************************************************/
1560cdf0e10cSrcweir {
1561cdf0e10cSrcweir 	ByteString sFull;
1562cdf0e10cSrcweir 	if ( nLevel > 1 ) {
1563cdf0e10cSrcweir 		sFull = aResStack.GetObject( 0 )->sId;
1564cdf0e10cSrcweir 		for ( sal_uInt16 i = 1; i < nLevel - 1; i++ ) {
1565cdf0e10cSrcweir 			ByteString sToAdd = aResStack.GetObject( i )->sId;
1566cdf0e10cSrcweir 			if ( sToAdd.Len()) {
1567cdf0e10cSrcweir 				sFull += ".";
1568cdf0e10cSrcweir 				sFull += sToAdd;
1569cdf0e10cSrcweir 			}
1570cdf0e10cSrcweir 		}
1571cdf0e10cSrcweir 	}
1572cdf0e10cSrcweir     if ( sFull.Len() > 255 ) {
1573cdf0e10cSrcweir 		ByteString sError( "GroupId > 255 chars" );
1574cdf0e10cSrcweir 	    printf("GroupID = %s\n",sFull.GetBuffer());
1575cdf0e10cSrcweir         yyerror( sError.GetBufferAccess());
1576cdf0e10cSrcweir 		sError.ReleaseBufferAccess();
1577cdf0e10cSrcweir 	}
1578cdf0e10cSrcweir 
1579cdf0e10cSrcweir 	return sFull;
1580cdf0e10cSrcweir }
1581cdf0e10cSrcweir 
1582cdf0e10cSrcweir /*****************************************************************************/
InsertListEntry(const ByteString & rText,const ByteString & rLine)1583cdf0e10cSrcweir void Export::InsertListEntry( const ByteString &rText, const ByteString &rLine )
1584cdf0e10cSrcweir /*****************************************************************************/
1585cdf0e10cSrcweir {
1586cdf0e10cSrcweir 	ResData *pResData = aResStack.GetObject( nLevel-1 );
1587cdf0e10cSrcweir 
1588cdf0e10cSrcweir 	ExportList *pList = NULL;
1589cdf0e10cSrcweir 	if ( nList == LIST_STRING ) {
1590cdf0e10cSrcweir 		pList = pResData->pStringList;
1591cdf0e10cSrcweir 		if ( !pList ) {
1592cdf0e10cSrcweir 			pResData->pStringList = new ExportList();
1593cdf0e10cSrcweir 			pList = pResData->pStringList;
1594cdf0e10cSrcweir 			nListIndex = 0;
1595cdf0e10cSrcweir 		}
1596cdf0e10cSrcweir 	}
1597cdf0e10cSrcweir 	else if ( nList == LIST_FILTER ) {
1598cdf0e10cSrcweir 		pList = pResData->pFilterList;
1599cdf0e10cSrcweir 		if ( !pList ) {
1600cdf0e10cSrcweir 			pResData->pFilterList = new ExportList();
1601cdf0e10cSrcweir 			pList = pResData->pFilterList;
1602cdf0e10cSrcweir 			nListIndex = 0;
1603cdf0e10cSrcweir 		}
1604cdf0e10cSrcweir 	}
1605cdf0e10cSrcweir 	else if ( nList == LIST_ITEM ) {
1606cdf0e10cSrcweir 		pList = pResData->pItemList;
1607cdf0e10cSrcweir 		if ( !pList ) {
1608cdf0e10cSrcweir 			pResData->pItemList = new ExportList();
1609cdf0e10cSrcweir 			pList = pResData->pItemList;
1610cdf0e10cSrcweir 			nListIndex = 0;
1611cdf0e10cSrcweir 		}
1612cdf0e10cSrcweir 	}
1613cdf0e10cSrcweir 	else if ( nList == LIST_PAIRED ) {
1614cdf0e10cSrcweir 		pList = pResData->pPairedList;
1615cdf0e10cSrcweir 		if ( !pList ) {
1616cdf0e10cSrcweir 			pResData->pPairedList = new ExportList();
1617cdf0e10cSrcweir 			pList = pResData->pPairedList;
1618cdf0e10cSrcweir 			nListIndex = 0;
1619cdf0e10cSrcweir 		}
1620cdf0e10cSrcweir 	}
1621cdf0e10cSrcweir     else if ( nList == LIST_UIENTRIES ) {
1622cdf0e10cSrcweir 		pList = pResData->pUIEntries;
1623cdf0e10cSrcweir 		if ( !pList ) {
1624cdf0e10cSrcweir 			pResData->pUIEntries = new ExportList();
1625cdf0e10cSrcweir 			pList = pResData->pUIEntries;
1626cdf0e10cSrcweir 			nListIndex = 0;
1627cdf0e10cSrcweir 		}
1628cdf0e10cSrcweir 	}
1629cdf0e10cSrcweir 	else
1630cdf0e10cSrcweir 		return;
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir 	if ( nListIndex + 1 > pList->Count()) {
1633cdf0e10cSrcweir         ExportListEntry *pNew = new ExportListEntry();
1634cdf0e10cSrcweir 		(*pNew)[ LIST_REFID ] = ByteString::CreateFromInt32( REFID_NONE );
1635cdf0e10cSrcweir 		pList->Insert( pNew, LIST_APPEND );
1636cdf0e10cSrcweir 	}
1637cdf0e10cSrcweir 	ExportListEntry *pCurEntry = pList->GetObject( nListIndex );
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir 	// For paired list use the line to set proper lid
1640cdf0e10cSrcweir 	if( nList == LIST_PAIRED ){
1641cdf0e10cSrcweir 		(*pCurEntry)[ nListLang ] = rLine;
1642cdf0e10cSrcweir 	}else
1643cdf0e10cSrcweir 		(*pCurEntry)[ nListLang ] = rText;
1644cdf0e10cSrcweir 
1645cdf0e10cSrcweir 	// Remember en-US fallback string, so each list has the same amount of elements
1646cdf0e10cSrcweir 	//if ( nListLang.EqualsIgnoreCaseAscii("en-US")  ) {
1647cdf0e10cSrcweir 	if ( Export::isSourceLanguage( nListLang ) ) {
1648cdf0e10cSrcweir 		if( nList == LIST_PAIRED ){
1649cdf0e10cSrcweir 			const ByteString sPlist("pairedlist");
1650cdf0e10cSrcweir 			ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sId , GetPairedListID( rLine ) , sFilename );
1651cdf0e10cSrcweir 			pResData->addFallbackData( sKey , rText );
1652cdf0e10cSrcweir 		}
1653cdf0e10cSrcweir 		// new fallback
1654cdf0e10cSrcweir 		else{
1655cdf0e10cSrcweir 			const ByteString sPlist("list");
1656cdf0e10cSrcweir 			ByteString a( pResData->sGId );
1657cdf0e10cSrcweir 			a.Append( "." );
1658cdf0e10cSrcweir 			a.Append( pResData->sId );
1659cdf0e10cSrcweir 			sal_Int64 x = nListIndex+1;
1660cdf0e10cSrcweir 			ByteString b( ByteString::CreateFromInt64( x ) );
1661cdf0e10cSrcweir 			ByteString sKey = MergeDataFile::CreateKey( sPlist , a , b  , sFilename );
1662cdf0e10cSrcweir 			pResData->addFallbackData( sKey , rText );
1663cdf0e10cSrcweir 		}
1664cdf0e10cSrcweir 		// new fallback
1665cdf0e10cSrcweir 	}
1666cdf0e10cSrcweir 
1667cdf0e10cSrcweir 	//if ( nListLang.EqualsIgnoreCaseAscii("en-US")  ) {
1668cdf0e10cSrcweir 	if ( Export::isSourceLanguage( nListLang ) ) {
1669cdf0e10cSrcweir 		if( nList == LIST_PAIRED ){
1670cdf0e10cSrcweir 			(*pCurEntry)[ SOURCE_LANGUAGE ] = rLine;
1671cdf0e10cSrcweir 		}
1672cdf0e10cSrcweir 		else
1673cdf0e10cSrcweir 			(*pCurEntry)[ SOURCE_LANGUAGE ] = rLine;
1674cdf0e10cSrcweir 
1675cdf0e10cSrcweir         pList->NewSourceLanguageListEntry();
1676cdf0e10cSrcweir 	}
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir 	//printf("Export::InsertListEntry ResData.id = %s ResData.ListData = %s\n",pResData->sId.GetBuffer() ,(*pCurEntry)[ nListLang ].GetBuffer());
1679cdf0e10cSrcweir 	nListIndex++;
1680cdf0e10cSrcweir }
1681cdf0e10cSrcweir 
1682cdf0e10cSrcweir /*****************************************************************************/
CleanValue(ByteString & rValue)1683cdf0e10cSrcweir void Export::CleanValue( ByteString &rValue )
1684cdf0e10cSrcweir /*****************************************************************************/
1685cdf0e10cSrcweir {
1686cdf0e10cSrcweir 	while ( rValue.Len()) {
1687cdf0e10cSrcweir 		if (( rValue.GetChar( 0 ) == ' ' ) || ( rValue.GetChar( 0 ) == '\t' ))
1688cdf0e10cSrcweir 			rValue = rValue.Copy( 1 );
1689cdf0e10cSrcweir 		else
1690cdf0e10cSrcweir 			break;
1691cdf0e10cSrcweir 	}
1692cdf0e10cSrcweir 
1693cdf0e10cSrcweir 	if ( rValue.Len()) {
1694cdf0e10cSrcweir 		for ( sal_uInt16 i = rValue.Len() - 1; i > 0; i-- ) {
1695cdf0e10cSrcweir 			if (( rValue.GetChar( i ) == ' ' ) || ( rValue.GetChar( i ) == '\t' ) ||
1696cdf0e10cSrcweir 				( rValue.GetChar( i ) == '\n' ) || ( rValue.GetChar( i ) == ';' ) ||
1697cdf0e10cSrcweir 				( rValue.GetChar( i ) == '{' ) || ( rValue.GetChar( i ) == '\\' ) ||
1698cdf0e10cSrcweir 				( rValue.GetChar( i ) == '\r' ))
1699cdf0e10cSrcweir 				rValue.Erase( i );
1700cdf0e10cSrcweir 			else
1701cdf0e10cSrcweir 				break;
1702cdf0e10cSrcweir 		}
1703cdf0e10cSrcweir 	}
1704cdf0e10cSrcweir }
1705cdf0e10cSrcweir 
1706cdf0e10cSrcweir 
1707cdf0e10cSrcweir /*****************************************************************************/
GetText(const ByteString & rSource,int nToken)1708cdf0e10cSrcweir ByteString Export::GetText( const ByteString &rSource, int nToken )
1709cdf0e10cSrcweir /*****************************************************************************/
1710cdf0e10cSrcweir #define TXT_STATE_NON  	0x000
1711cdf0e10cSrcweir #define TXT_STATE_TEXT	0x001
1712cdf0e10cSrcweir #define TXT_STATE_MACRO	0x002
1713cdf0e10cSrcweir {
1714cdf0e10cSrcweir 	ByteString sReturn;
1715cdf0e10cSrcweir 	switch ( nToken ) {
1716cdf0e10cSrcweir 		case TEXTLINE:
1717cdf0e10cSrcweir 		case LONGTEXTLINE: {
1718cdf0e10cSrcweir 			ByteString sTmp( rSource.Copy( rSource.Search( "=" )));
1719cdf0e10cSrcweir 			CleanValue( sTmp );
1720cdf0e10cSrcweir 			sTmp.EraseAllChars( '\n' );
1721cdf0e10cSrcweir 			sTmp.EraseAllChars( '\r' );
1722cdf0e10cSrcweir 
1723cdf0e10cSrcweir 			while ( sTmp.SearchAndReplace( "\\\\\"", "-=<[BSlashBSlashHKom]>=-\"" )
1724cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1725cdf0e10cSrcweir 			while ( sTmp.SearchAndReplace( "\\\"", "-=<[Hochkomma]>=-" )
1726cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1727cdf0e10cSrcweir 			while ( sTmp.SearchAndReplace( "\\", "-=<[0x7F]>=-" )
1728cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1729cdf0e10cSrcweir 			while ( sTmp.SearchAndReplace( "\\0x7F", "-=<[0x7F]>=-" )
1730cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1731cdf0e10cSrcweir 
1732cdf0e10cSrcweir 			sal_uInt16 nStart = 0;
1733cdf0e10cSrcweir 			sal_uInt16 nState = TXT_STATE_MACRO;
1734cdf0e10cSrcweir 
1735cdf0e10cSrcweir 		    nState = TXT_STATE_TEXT;
1736cdf0e10cSrcweir 			nStart = 1;
1737cdf0e10cSrcweir 
1738cdf0e10cSrcweir 
1739cdf0e10cSrcweir 			for ( sal_uInt16 i = nStart; i < sTmp.GetTokenCount( '\"' ); i++ ) {
1740cdf0e10cSrcweir 				ByteString sToken = sTmp.GetToken( i, '\"' );
1741cdf0e10cSrcweir 				if ( sToken.Len()) {
1742cdf0e10cSrcweir 					if ( nState == TXT_STATE_TEXT ) {
1743cdf0e10cSrcweir 						sReturn += sToken;
1744cdf0e10cSrcweir 						nState = TXT_STATE_MACRO;
1745cdf0e10cSrcweir 					}
1746cdf0e10cSrcweir 					else {
1747cdf0e10cSrcweir 						while( sToken.SearchAndReplace( "\t", " " ) !=
1748cdf0e10cSrcweir 							STRING_NOTFOUND ) {};
1749cdf0e10cSrcweir 						while( sToken.SearchAndReplace( "  ", " " ) !=
1750cdf0e10cSrcweir 							STRING_NOTFOUND ) {};
1751cdf0e10cSrcweir 						sToken.EraseLeadingChars( ' ' );
1752cdf0e10cSrcweir 						sToken.EraseTrailingChars( ' ' );
1753cdf0e10cSrcweir 						if ( sToken.Len()) {
1754cdf0e10cSrcweir 							sReturn += "\\\" ";
1755cdf0e10cSrcweir 							sReturn += sToken;
1756cdf0e10cSrcweir 							sReturn += " \\\"";
1757cdf0e10cSrcweir 						}
1758cdf0e10cSrcweir 						nState = TXT_STATE_TEXT;
1759cdf0e10cSrcweir 					}
1760cdf0e10cSrcweir 				}
1761cdf0e10cSrcweir 			}
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir 			while ( sReturn.SearchAndReplace( "-=<[0x7F]>=-", "" )
1764cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1765cdf0e10cSrcweir 			while ( sReturn.SearchAndReplace( "-=<[Hochkomma]>=-", "\"" )
1766cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1767cdf0e10cSrcweir 			while ( sReturn.SearchAndReplace( "-=<[BSlashBSlashHKom]>=-", "\\\\" )
1768cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1769cdf0e10cSrcweir 
1770cdf0e10cSrcweir 
1771cdf0e10cSrcweir 			while ( sReturn.SearchAndReplace( "\\\\", "-=<[BSlashBSlash]>=-" )
1772cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1773cdf0e10cSrcweir 			while ( sReturn.SearchAndReplace( "-=<[BSlashBSlash]>=-", "\\" )
1774cdf0e10cSrcweir 				!= STRING_NOTFOUND ) {};
1775cdf0e10cSrcweir 
1776cdf0e10cSrcweir 		}
1777cdf0e10cSrcweir 		break;
1778cdf0e10cSrcweir 	}
1779cdf0e10cSrcweir 	return sReturn;
1780cdf0e10cSrcweir }
1781cdf0e10cSrcweir 
1782cdf0e10cSrcweir /*****************************************************************************/
WriteToMerged(const ByteString & rText,bool bSDFContent)1783cdf0e10cSrcweir void Export::WriteToMerged( const ByteString &rText , bool bSDFContent )
1784cdf0e10cSrcweir /*****************************************************************************/
1785cdf0e10cSrcweir {
1786cdf0e10cSrcweir 	static ByteString SLASH  ('\\');
1787cdf0e10cSrcweir     static ByteString RETURN ('\n');
1788cdf0e10cSrcweir 	//printf("%s\n",rText.GetBuffer() );
1789cdf0e10cSrcweir 
1790cdf0e10cSrcweir     #if 0
1791cdf0e10cSrcweir     // statement has no effect
1792cdf0e10cSrcweir     if( pParseQueue->bMflag && !bSDFContent ) pParseQueue->bMflag;
1793cdf0e10cSrcweir     #endif
1794cdf0e10cSrcweir 
1795cdf0e10cSrcweir     if ( !bDontWriteOutput || !bUnmerge ) {
1796cdf0e10cSrcweir 		ByteString sText( rText );
1797cdf0e10cSrcweir 		while ( sText.SearchAndReplace( " \n", "\n" ) != STRING_NOTFOUND ) {};
1798cdf0e10cSrcweir         if( pParseQueue->bNextIsM && bSDFContent && sText.Len() > 2 ){
1799cdf0e10cSrcweir             for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){
1800cdf0e10cSrcweir                 if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){
1801cdf0e10cSrcweir                     sText.Insert('\\' , n++ );
1802cdf0e10cSrcweir 
1803cdf0e10cSrcweir                 }
1804cdf0e10cSrcweir             }
1805cdf0e10cSrcweir         }
1806cdf0e10cSrcweir         else if( pParseQueue->bLastWasM && sText.Len() > 2 ){
1807cdf0e10cSrcweir             for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){
1808cdf0e10cSrcweir                 if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){
1809cdf0e10cSrcweir                     sText.Insert('\\' , n++ );
1810cdf0e10cSrcweir                 }
1811cdf0e10cSrcweir                 if( sText.GetChar( n ) == '\n' )pParseQueue->bMflag=true;
1812cdf0e10cSrcweir             }
1813cdf0e10cSrcweir         }
1814cdf0e10cSrcweir         else if( pParseQueue->bCurrentIsM && bSDFContent && sText.Len() > 2 ){
1815cdf0e10cSrcweir             for( sal_uInt16 n = 0 ; n < sText.Len() ; n++ ){
1816cdf0e10cSrcweir                 if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){
1817cdf0e10cSrcweir                     sText.Insert('\\' , n++ );
1818cdf0e10cSrcweir                     pParseQueue->bMflag=true;
1819cdf0e10cSrcweir                 }
1820cdf0e10cSrcweir             }
1821cdf0e10cSrcweir         }
1822cdf0e10cSrcweir         else if( pParseQueue->bMflag ){
1823cdf0e10cSrcweir             for( sal_uInt16 n = 1 ; n < sText.Len() ; n++ ){
1824cdf0e10cSrcweir                 if( sText.GetChar( n ) == '\n' && sText.GetChar( n-1 ) != '\\'){
1825cdf0e10cSrcweir                     sText.Insert('\\' , n++ );
1826cdf0e10cSrcweir                 }
1827cdf0e10cSrcweir             }
1828cdf0e10cSrcweir         }
1829cdf0e10cSrcweir         for ( sal_uInt16 i = 0; i < sText.Len(); i++ ) {
1830cdf0e10cSrcweir 			if ( sText.GetChar( i ) != '\n' ){
1831cdf0e10cSrcweir 				aOutput.Write( ByteString( sText.GetChar( i )).GetBuffer(), 1 );
1832cdf0e10cSrcweir 
1833cdf0e10cSrcweir 			}
1834cdf0e10cSrcweir             else{
1835cdf0e10cSrcweir                 aOutput.WriteLine( ByteString());
1836cdf0e10cSrcweir             }
1837cdf0e10cSrcweir 
1838cdf0e10cSrcweir 		}
1839cdf0e10cSrcweir     }
1840cdf0e10cSrcweir }
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir /*****************************************************************************/
ConvertMergeContent(ByteString & rText)1843cdf0e10cSrcweir void Export::ConvertMergeContent( ByteString &rText )
1844cdf0e10cSrcweir /*****************************************************************************/
1845cdf0e10cSrcweir {
1846cdf0e10cSrcweir 	sal_Bool bNoOpen = ( rText.Search( "\\\"" ) != 0 );
1847cdf0e10cSrcweir 	ByteString sClose( rText.Copy( rText.Len() - 2 ));
1848cdf0e10cSrcweir 	sal_Bool bNoClose = ( sClose != "\\\"" );
1849cdf0e10cSrcweir 	ByteString sNew;
1850cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < rText.Len(); i++ ) {
1851cdf0e10cSrcweir 		ByteString sChar( rText.GetChar( i ));
1852cdf0e10cSrcweir 		if ( sChar == "\\" ) {
1853cdf0e10cSrcweir 			if (( i + 1 ) < rText.Len()) {
1854cdf0e10cSrcweir 				ByteString sNext( rText.GetChar( i + 1 ));
1855cdf0e10cSrcweir 				if ( sNext == "\"" ) {
1856cdf0e10cSrcweir 					sChar = "\"";
1857cdf0e10cSrcweir 					i++;
1858cdf0e10cSrcweir 				}
1859cdf0e10cSrcweir 				else if ( sNext == "n" ) {
1860cdf0e10cSrcweir 					sChar = "\\n";
1861cdf0e10cSrcweir 					i++;
1862cdf0e10cSrcweir 				}
1863cdf0e10cSrcweir 				else if ( sNext == "t" ) {
1864cdf0e10cSrcweir 					sChar = "\\t";
1865cdf0e10cSrcweir 					i++;
1866cdf0e10cSrcweir 				}
1867cdf0e10cSrcweir 				else if ( sNext == "\'" ) {
1868cdf0e10cSrcweir 					sChar = "\\\'";
1869cdf0e10cSrcweir 					i++;
1870cdf0e10cSrcweir 				}
1871cdf0e10cSrcweir 				else
1872cdf0e10cSrcweir 					sChar = "\\\\";
1873cdf0e10cSrcweir 			}
1874cdf0e10cSrcweir 			else {
1875cdf0e10cSrcweir 				sChar = "\\\\";
1876cdf0e10cSrcweir 			}
1877cdf0e10cSrcweir 		}
1878cdf0e10cSrcweir 		else if ( sChar == "\"" ) {
1879cdf0e10cSrcweir 			sChar = "\\\"";
1880cdf0e10cSrcweir 		}
1881cdf0e10cSrcweir 		else if ( sChar == "" ) {
1882cdf0e10cSrcweir 			sChar = "\\0x7F";
1883cdf0e10cSrcweir 		}
1884cdf0e10cSrcweir 		sNew += sChar;
1885cdf0e10cSrcweir 	}
1886cdf0e10cSrcweir 
1887cdf0e10cSrcweir 	rText = sNew;
1888cdf0e10cSrcweir 
1889cdf0e10cSrcweir 	if ( bNoOpen ) {
1890cdf0e10cSrcweir 		ByteString sTmp( rText );
1891cdf0e10cSrcweir 		rText = "\"";
1892cdf0e10cSrcweir 		rText += sTmp;
1893cdf0e10cSrcweir 	}
1894cdf0e10cSrcweir 	if ( bNoClose )
1895cdf0e10cSrcweir 		rText += "\"";
1896cdf0e10cSrcweir }
1897cdf0e10cSrcweir 
1898cdf0e10cSrcweir /*****************************************************************************/
PrepareTextToMerge(ByteString & rText,sal_uInt16 nTyp,ByteString & nLangIndex,ResData * pResData)1899cdf0e10cSrcweir sal_Bool Export::PrepareTextToMerge( ByteString &rText, sal_uInt16 nTyp,
1900cdf0e10cSrcweir                                 ByteString &nLangIndex, ResData *pResData )
1901cdf0e10cSrcweir /*****************************************************************************/
1902cdf0e10cSrcweir {
1903cdf0e10cSrcweir 	// position to merge in:
1904cdf0e10cSrcweir 	sal_uInt16 nStart = 0;
1905cdf0e10cSrcweir 	sal_uInt16 nEnd = 0;
1906cdf0e10cSrcweir 	ByteString sOldId = pResData->sId;
1907cdf0e10cSrcweir 	ByteString sOldGId = pResData->sGId;
1908cdf0e10cSrcweir 	ByteString sOldTyp = pResData->sResTyp;
1909cdf0e10cSrcweir 
1910cdf0e10cSrcweir 	ByteString sOrigText( rText );
1911cdf0e10cSrcweir 
1912cdf0e10cSrcweir 	switch ( nTyp ) {
1913cdf0e10cSrcweir 		case LIST_STRING :
1914cdf0e10cSrcweir 		case LIST_UIENTRIES :
1915cdf0e10cSrcweir 		case LIST_FILTER :
1916cdf0e10cSrcweir 		case LIST_PAIRED:
1917cdf0e10cSrcweir 		case LIST_ITEM :
1918cdf0e10cSrcweir 		{
1919cdf0e10cSrcweir 			if ( bUnmerge )
1920cdf0e10cSrcweir 				return sal_True;
1921cdf0e10cSrcweir 
1922cdf0e10cSrcweir 			ExportList *pList = NULL;
1923cdf0e10cSrcweir 			switch ( nTyp ) {
1924cdf0e10cSrcweir 				case LIST_STRING : {
1925cdf0e10cSrcweir 					pResData->sResTyp = "stringlist";
1926cdf0e10cSrcweir 					pList = pResData->pStringList;
1927cdf0e10cSrcweir 				}
1928cdf0e10cSrcweir 				break;
1929cdf0e10cSrcweir 				case LIST_UIENTRIES : {
1930cdf0e10cSrcweir 					pResData->sResTyp = "uientries";
1931cdf0e10cSrcweir 					pList = pResData->pUIEntries;
1932cdf0e10cSrcweir 				}
1933cdf0e10cSrcweir 				break;
1934cdf0e10cSrcweir 				case LIST_FILTER : {
1935cdf0e10cSrcweir 					pResData->sResTyp = "filterlist";
1936cdf0e10cSrcweir 					pList = pResData->pFilterList;
1937cdf0e10cSrcweir 				}
1938cdf0e10cSrcweir 				break;
1939cdf0e10cSrcweir 				case LIST_ITEM : {
1940cdf0e10cSrcweir 					pResData->sResTyp = "itemlist";
1941cdf0e10cSrcweir 					pList = pResData->pItemList;
1942cdf0e10cSrcweir 				}
1943cdf0e10cSrcweir 				break;
1944cdf0e10cSrcweir 				case LIST_PAIRED : {
1945cdf0e10cSrcweir 					pResData->sResTyp = "pairedlist";
1946cdf0e10cSrcweir 					pList = pResData->pPairedList;
1947cdf0e10cSrcweir 				}
1948cdf0e10cSrcweir 				break;
1949cdf0e10cSrcweir 
1950cdf0e10cSrcweir 			}
1951cdf0e10cSrcweir 			if ( pList ) {
1952cdf0e10cSrcweir 				ExportListEntry *pCurEntry = pList->GetObject( nListIndex - 1 );
1953cdf0e10cSrcweir 				if ( pCurEntry ) {
1954cdf0e10cSrcweir 					//printf("%s\n",Export::DumpMap( "pCurEntry", *pCurEntry ).GetBuffer() );
1955cdf0e10cSrcweir 					//ByteString a("pCurEntry");
1956cdf0e10cSrcweir 					//Export::DumpMap( a , *pCurEntry );
1957cdf0e10cSrcweir 					rText = (*pCurEntry)[ SOURCE_LANGUAGE ];
1958cdf0e10cSrcweir 					if( nTyp == LIST_PAIRED ){
1959cdf0e10cSrcweir 						pResData->addMergedLanguage( nLangIndex );
1960cdf0e10cSrcweir 					}
1961cdf0e10cSrcweir                 }
1962cdf0e10cSrcweir 			}
1963cdf0e10cSrcweir 
1964cdf0e10cSrcweir 			nStart = rText.Search( "\"" );
1965cdf0e10cSrcweir 			if ( nStart == STRING_NOTFOUND ) {
1966cdf0e10cSrcweir 				rText = sOrigText;
1967cdf0e10cSrcweir 				return sal_False;
1968cdf0e10cSrcweir 			}
1969cdf0e10cSrcweir 
1970cdf0e10cSrcweir 			sal_Bool bFound = sal_False;
1971cdf0e10cSrcweir 			for ( nEnd = nStart + 1; nEnd < rText.Len() && !bFound; nEnd++ ) {
1972cdf0e10cSrcweir 				if ( rText.GetChar( nEnd ) == '\"' )
1973cdf0e10cSrcweir 					bFound = sal_True;
1974cdf0e10cSrcweir 			}
1975cdf0e10cSrcweir 			if ( !bFound ) {
1976cdf0e10cSrcweir 				rText = sOrigText;
1977cdf0e10cSrcweir 				return sal_False;
1978cdf0e10cSrcweir 			}
1979cdf0e10cSrcweir 
1980cdf0e10cSrcweir 			nEnd --;
1981cdf0e10cSrcweir 			sLastListLine = rText;
1982cdf0e10cSrcweir 			if (( sLastListLine.Search( ">" ) != STRING_NOTFOUND ) &&
1983cdf0e10cSrcweir 				( sLastListLine.Search( "<" ) == STRING_NOTFOUND ))
1984cdf0e10cSrcweir 			{
1985cdf0e10cSrcweir 				ByteString sTmp = sLastListLine;
1986cdf0e10cSrcweir 				sLastListLine = "<";
1987cdf0e10cSrcweir 				sLastListLine += sTmp;
1988cdf0e10cSrcweir 			}
1989cdf0e10cSrcweir 			if ( pResData->sResTyp.EqualsIgnoreCaseAscii( "pairedlist" ) ){
1990cdf0e10cSrcweir                pResData->sId = GetPairedListID( sLastListLine );
1991cdf0e10cSrcweir             }
1992cdf0e10cSrcweir             else pResData->sId = ByteString::CreateFromInt32( nListIndex );
1993cdf0e10cSrcweir 
1994cdf0e10cSrcweir 			if ( pResData->sGId.Len())
1995cdf0e10cSrcweir 				pResData->sGId += ".";
1996cdf0e10cSrcweir 			pResData->sGId += sOldId;
1997cdf0e10cSrcweir 			nTyp = STRING_TYP_TEXT;
1998cdf0e10cSrcweir 		}
1999cdf0e10cSrcweir 		break;
2000cdf0e10cSrcweir 		case STRING_TYP_TEXT :
2001cdf0e10cSrcweir 		case STRING_TYP_HELPTEXT :
2002cdf0e10cSrcweir 		case STRING_TYP_QUICKHELPTEXT :
2003cdf0e10cSrcweir 		case STRING_TYP_TITLE :
2004cdf0e10cSrcweir 		{
2005cdf0e10cSrcweir 			/*if ( bUnmerge ) {
2006cdf0e10cSrcweir 				if (( nLangIndex != ByteString("de") ) &&
2007cdf0e10cSrcweir                     ( nLangIndex != ByteString("en-US") ))
2008cdf0e10cSrcweir 				{
2009cdf0e10cSrcweir 					bDontWriteOutput = sal_True;
2010cdf0e10cSrcweir 				}
2011cdf0e10cSrcweir 				return sal_True;
2012cdf0e10cSrcweir 			}*/
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir 			nStart = rText.Search( "=" );
2015cdf0e10cSrcweir 			if ( nStart == STRING_NOTFOUND ) {
2016cdf0e10cSrcweir 				rText = sOrigText;
2017cdf0e10cSrcweir 				return sal_False;
2018cdf0e10cSrcweir 			}
2019cdf0e10cSrcweir 
2020cdf0e10cSrcweir 			nStart++;
2021cdf0e10cSrcweir 			sal_Bool bFound = sal_False;
2022cdf0e10cSrcweir 			while(( nStart < rText.Len()) && !bFound ) {
2023cdf0e10cSrcweir 				if (( rText.GetChar( nStart ) != ' ' ) && ( rText.GetChar( nStart ) != '\t' ))
2024cdf0e10cSrcweir 					bFound = sal_True;
2025cdf0e10cSrcweir 				else
2026cdf0e10cSrcweir 					nStart ++;
2027cdf0e10cSrcweir 			}
2028cdf0e10cSrcweir 
2029cdf0e10cSrcweir 			// no start position found
2030cdf0e10cSrcweir 			if ( !bFound ) {
2031cdf0e10cSrcweir 				rText = sOrigText;
2032cdf0e10cSrcweir 				return sal_False;
2033cdf0e10cSrcweir 			}
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir 			// position to end mergeing in
2036cdf0e10cSrcweir 			nEnd = rText.Len() - 1;
2037cdf0e10cSrcweir 			bFound = sal_False;
2038cdf0e10cSrcweir 
2039cdf0e10cSrcweir 			while (( nEnd > nStart ) && !bFound ) {
2040cdf0e10cSrcweir 				if (( rText.GetChar( nEnd ) != ' ' ) && ( rText.GetChar( nEnd ) != '\t' ) &&
2041cdf0e10cSrcweir 					( rText.GetChar( nEnd ) != '\n' ) && ( rText.GetChar( nEnd ) != ';' ) &&
2042cdf0e10cSrcweir 					( rText.GetChar( nEnd ) != '{' ) && ( rText.GetChar( nEnd ) != '\\' ))
2043cdf0e10cSrcweir 				{
2044cdf0e10cSrcweir 					bFound = sal_True;
2045cdf0e10cSrcweir 				}
2046cdf0e10cSrcweir 				else
2047cdf0e10cSrcweir 					nEnd --;
2048cdf0e10cSrcweir 			}
2049cdf0e10cSrcweir 		}
2050cdf0e10cSrcweir 		break;
2051cdf0e10cSrcweir 	}
2052cdf0e10cSrcweir 
2053cdf0e10cSrcweir 	// search for merge data
2054cdf0e10cSrcweir     if ( !pMergeDataFile ){
2055cdf0e10cSrcweir         pMergeDataFile = new MergeDataFile( sMergeSrc, sFile , bErrorLog, aCharSet);//, bUTF8 );
2056cdf0e10cSrcweir 
2057cdf0e10cSrcweir         // Init Languages
2058cdf0e10cSrcweir         ByteString sTmp = Export::sLanguages;
2059cdf0e10cSrcweir         if( sTmp.ToUpperAscii().Equals("ALL") )
2060cdf0e10cSrcweir             SetLanguages( pMergeDataFile->GetLanguages() );
2061cdf0e10cSrcweir         else if( !isInitialized )InitLanguages();
2062cdf0e10cSrcweir 
2063cdf0e10cSrcweir     }
2064cdf0e10cSrcweir //	printf("*************DUMPING****************\n");
2065cdf0e10cSrcweir //	printf("%s\n",pMergeDataFile->Dump().GetBuffer());
2066cdf0e10cSrcweir //	printf("*************DUMPING****************\n");
2067cdf0e10cSrcweir 
2068cdf0e10cSrcweir //	printf("Dumping ResData\n");
2069cdf0e10cSrcweir //	pResData->Dump();
2070cdf0e10cSrcweir 	PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
2071cdf0e10cSrcweir 	//printf("Dumping pEntrys\n");
2072cdf0e10cSrcweir 	//if( pEntrys ) pEntrys->Dump();
2073cdf0e10cSrcweir 	pResData->sId = sOldId;
2074cdf0e10cSrcweir 	pResData->sGId = sOldGId;
2075cdf0e10cSrcweir 	pResData->sResTyp = sOldTyp;
2076cdf0e10cSrcweir 
2077cdf0e10cSrcweir 	if ( !pEntrys ) {
2078cdf0e10cSrcweir 		rText = sOrigText;
2079cdf0e10cSrcweir 		return sal_False; // no data found
2080cdf0e10cSrcweir 	}
2081cdf0e10cSrcweir 
2082cdf0e10cSrcweir 	ByteString sContent;
2083cdf0e10cSrcweir 	pEntrys->GetTransex3Text( sContent, nTyp, nLangIndex );
2084cdf0e10cSrcweir 	//if ( !sContent.Len() && ( ! nLangIndex.EqualsIgnoreCaseAscii("en-US") )) {
2085cdf0e10cSrcweir 	if ( !sContent.Len() && ( ! Export::isSourceLanguage( nLangIndex ) )) {
2086cdf0e10cSrcweir 		rText = sOrigText;
2087cdf0e10cSrcweir 		return sal_False; // no data found
2088cdf0e10cSrcweir 	}
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir 	//if ( nLangIndex.EqualsIgnoreCaseAscii("en-US") ) {
2091cdf0e10cSrcweir 	if ( Export::isSourceLanguage( nLangIndex ) ) {
2092cdf0e10cSrcweir 		return sal_False;
2093cdf0e10cSrcweir 	}
2094cdf0e10cSrcweir 
2095cdf0e10cSrcweir 	ByteString sPostFix( rText.Copy( ++nEnd ));
2096cdf0e10cSrcweir 	rText.Erase( nStart );
2097cdf0e10cSrcweir 
2098cdf0e10cSrcweir 	//ConvertMergeContent( sContent, nTyp );
2099cdf0e10cSrcweir     ConvertMergeContent( sContent );
2100cdf0e10cSrcweir 
2101cdf0e10cSrcweir 
2102cdf0e10cSrcweir 
2103cdf0e10cSrcweir 	//printf("Merged %s\n",nLangIndex.GetBuffer());
2104cdf0e10cSrcweir 	// merge new res. in text line
2105cdf0e10cSrcweir 	rText += sContent;
2106cdf0e10cSrcweir 	rText += sPostFix;
2107cdf0e10cSrcweir 
2108cdf0e10cSrcweir 	return sal_True;
2109cdf0e10cSrcweir }
2110cdf0e10cSrcweir 
2111cdf0e10cSrcweir /*****************************************************************************/
MergeRest(ResData * pResData,sal_uInt16 nMode)2112cdf0e10cSrcweir void Export::MergeRest( ResData *pResData, sal_uInt16 nMode )
2113cdf0e10cSrcweir /*****************************************************************************/
2114cdf0e10cSrcweir {
2115cdf0e10cSrcweir 	//if ( bUnmerge ) { return;}
2116cdf0e10cSrcweir 
2117cdf0e10cSrcweir 	//pResData->Dump();
2118cdf0e10cSrcweir 
2119cdf0e10cSrcweir     if ( !pMergeDataFile ){
2120cdf0e10cSrcweir 		pMergeDataFile = new MergeDataFile( sMergeSrc, sFile ,bErrorLog, aCharSet);//, bUTF8 );
2121cdf0e10cSrcweir 
2122cdf0e10cSrcweir         // Init Languages
2123cdf0e10cSrcweir         ByteString sTmp = Export::sLanguages;
2124cdf0e10cSrcweir         if( sTmp.ToUpperAscii().Equals("ALL") )
2125cdf0e10cSrcweir             SetLanguages( pMergeDataFile->GetLanguages() );
2126cdf0e10cSrcweir         else if( !isInitialized )InitLanguages();
2127cdf0e10cSrcweir 
2128cdf0e10cSrcweir     }
2129cdf0e10cSrcweir 	switch ( nMode ) {
2130cdf0e10cSrcweir 		case MERGE_MODE_NORMAL : {
2131cdf0e10cSrcweir 			PFormEntrys *pEntry = pMergeDataFile->GetPFormEntrys( pResData );
2132cdf0e10cSrcweir 
2133cdf0e10cSrcweir             bool bWriteNoSlash = false;
2134cdf0e10cSrcweir 			if ( pEntry && pResData->bText ) {
2135cdf0e10cSrcweir 
2136cdf0e10cSrcweir 				sal_Bool bAddSemikolon = sal_False;
2137cdf0e10cSrcweir 				sal_Bool bFirst = sal_True;
2138cdf0e10cSrcweir                 ByteString sCur;
2139cdf0e10cSrcweir                 ByteString sTmp = Export::sLanguages;
2140cdf0e10cSrcweir 
2141cdf0e10cSrcweir                 for( unsigned int n = 0; n < aLanguages.size(); n++ ){
2142cdf0e10cSrcweir                     sCur = aLanguages[ n ];
2143cdf0e10cSrcweir 
2144cdf0e10cSrcweir                     ByteString sText;
2145cdf0e10cSrcweir                     sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_TEXT, sCur , sal_True );
2146cdf0e10cSrcweir 					if ( bText && sText.Len() && sText != "-" ) {
2147cdf0e10cSrcweir 						ByteString sOutput;
2148cdf0e10cSrcweir 						if ( bNextMustBeDefineEOL)  {
2149cdf0e10cSrcweir 							if ( bFirst )
2150cdf0e10cSrcweir 								sOutput += "\t\\\n";
2151cdf0e10cSrcweir 							else
2152cdf0e10cSrcweir 								sOutput += ";\t\\\n";
2153cdf0e10cSrcweir 						}
2154cdf0e10cSrcweir 						bFirst=sal_False;
2155cdf0e10cSrcweir 						sOutput += "\t";
2156cdf0e10cSrcweir 						sOutput += pResData->sTextTyp;
2157cdf0e10cSrcweir                         //if ( !sCur.EqualsIgnoreCaseAscii("en-US")) {
2158cdf0e10cSrcweir 						if ( ! Export::isSourceLanguage( sCur ) ) {
2159cdf0e10cSrcweir 							sOutput += "[ ";
2160cdf0e10cSrcweir 							sOutput += sCur;
2161cdf0e10cSrcweir 							sOutput += " ] ";
2162cdf0e10cSrcweir 						}
2163cdf0e10cSrcweir 						sOutput += "= ";
2164cdf0e10cSrcweir                         ConvertMergeContent( sText );
2165cdf0e10cSrcweir 						sOutput += sText;
2166cdf0e10cSrcweir 
2167cdf0e10cSrcweir                         if ( bDefine && bWriteNoSlash )
2168cdf0e10cSrcweir 						    sOutput += ";\n";
2169cdf0e10cSrcweir 
2170cdf0e10cSrcweir                         if ( bDefine )
2171cdf0e10cSrcweir 							sOutput += ";\\\n";
2172cdf0e10cSrcweir 						else if ( !bNextMustBeDefineEOL )
2173cdf0e10cSrcweir 							sOutput += ";\n";
2174cdf0e10cSrcweir 						else
2175cdf0e10cSrcweir 							bAddSemikolon = sal_True;
2176cdf0e10cSrcweir 						for ( sal_uInt16 j = 1; j < nLevel; j++ )
2177cdf0e10cSrcweir 							sOutput += "\t";
2178cdf0e10cSrcweir 						WriteToMerged( sOutput , true );
2179cdf0e10cSrcweir 					}
2180cdf0e10cSrcweir                 }
2181cdf0e10cSrcweir 
2182cdf0e10cSrcweir 
2183cdf0e10cSrcweir 				if ( bAddSemikolon ) {
2184cdf0e10cSrcweir 					ByteString sOutput( ";" );
2185cdf0e10cSrcweir 					WriteToMerged( sOutput , false );
2186cdf0e10cSrcweir 				}
2187cdf0e10cSrcweir 			}
2188cdf0e10cSrcweir 
2189cdf0e10cSrcweir 			if ( pEntry && pResData->bQuickHelpText ) {
2190cdf0e10cSrcweir 				sal_Bool bAddSemikolon = sal_False;
2191cdf0e10cSrcweir 				sal_Bool bFirst = sal_True;
2192cdf0e10cSrcweir                 ByteString sCur;
2193cdf0e10cSrcweir 
2194cdf0e10cSrcweir                 for( unsigned int n = 0; n < aLanguages.size(); n++ ){
2195cdf0e10cSrcweir                     sCur = aLanguages[ n ];
2196cdf0e10cSrcweir 
2197cdf0e10cSrcweir 					ByteString sText;
2198cdf0e10cSrcweir                     sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_QUICKHELPTEXT, sCur, sal_True );
2199cdf0e10cSrcweir 					if ( bText && sText.Len() && sText != "-" ) {
2200cdf0e10cSrcweir 						ByteString sOutput;
2201cdf0e10cSrcweir 						if ( bNextMustBeDefineEOL)  {
2202cdf0e10cSrcweir 							if ( bFirst )
2203cdf0e10cSrcweir 								sOutput += "\t\\\n";
2204cdf0e10cSrcweir 							else
2205cdf0e10cSrcweir 								sOutput += ";\t\\\n";
2206cdf0e10cSrcweir 						}
2207cdf0e10cSrcweir 						bFirst=sal_False;
2208cdf0e10cSrcweir 						sOutput += "\t";
2209cdf0e10cSrcweir 						sOutput += "QuickHelpText";
2210cdf0e10cSrcweir                         //if ( !sCur.EqualsIgnoreCaseAscii("en-US") ) {
2211cdf0e10cSrcweir 						if ( ! Export::isSourceLanguage( sCur ) ) {
2212cdf0e10cSrcweir 							sOutput += "[ ";
2213cdf0e10cSrcweir 							sOutput += sCur;
2214cdf0e10cSrcweir 							sOutput += " ] ";
2215cdf0e10cSrcweir 						}
2216cdf0e10cSrcweir 						sOutput += "= ";
2217cdf0e10cSrcweir                         ConvertMergeContent( sText );
2218cdf0e10cSrcweir 						sOutput += sText;
2219cdf0e10cSrcweir 						if ( bDefine )
2220cdf0e10cSrcweir 							sOutput += ";\\\n";
2221cdf0e10cSrcweir 						else if ( !bNextMustBeDefineEOL )
2222cdf0e10cSrcweir 							sOutput += ";\n";
2223cdf0e10cSrcweir 						else
2224cdf0e10cSrcweir 							bAddSemikolon = sal_True;
2225cdf0e10cSrcweir 						for ( sal_uInt16 j = 1; j < nLevel; j++ )
2226cdf0e10cSrcweir 							sOutput += "\t";
2227cdf0e10cSrcweir 						WriteToMerged( sOutput ,true );
2228cdf0e10cSrcweir 					}
2229cdf0e10cSrcweir 				}
2230cdf0e10cSrcweir 				if ( bAddSemikolon ) {
2231cdf0e10cSrcweir 					ByteString sOutput( ";" );
2232cdf0e10cSrcweir 					WriteToMerged( sOutput , false );
2233cdf0e10cSrcweir 				}
2234cdf0e10cSrcweir 			}
2235cdf0e10cSrcweir 
2236cdf0e10cSrcweir 			if ( pEntry && pResData->bTitle ) {
2237cdf0e10cSrcweir 				sal_Bool bAddSemikolon = sal_False;
2238cdf0e10cSrcweir 				sal_Bool bFirst = sal_True;
2239cdf0e10cSrcweir                 ByteString sCur;
2240cdf0e10cSrcweir 
2241cdf0e10cSrcweir                 for( unsigned int n = 0; n < aLanguages.size(); n++ ){
2242cdf0e10cSrcweir                     sCur = aLanguages[ n ];
2243cdf0e10cSrcweir 
2244cdf0e10cSrcweir                 ByteString sText;
2245cdf0e10cSrcweir                     sal_Bool bText = pEntry->GetTransex3Text( sText, STRING_TYP_TITLE, sCur, sal_True );
2246cdf0e10cSrcweir 					if ( bText && sText.Len() && sText != "-" ) {
2247cdf0e10cSrcweir 						ByteString sOutput;
2248cdf0e10cSrcweir 						if ( bNextMustBeDefineEOL)  {
2249cdf0e10cSrcweir 							if ( bFirst )
2250cdf0e10cSrcweir 								sOutput += "\t\\\n";
2251cdf0e10cSrcweir 							else
2252cdf0e10cSrcweir 								sOutput += ";\t\\\n";
2253cdf0e10cSrcweir 						}
2254cdf0e10cSrcweir 						bFirst=sal_False;
2255cdf0e10cSrcweir 						sOutput += "\t";
2256cdf0e10cSrcweir 						sOutput += "Title";
2257cdf0e10cSrcweir                         //if ( !sCur.EqualsIgnoreCaseAscii("en-US") ) {
2258cdf0e10cSrcweir 						if ( ! Export::isSourceLanguage( sCur ) ) {
2259cdf0e10cSrcweir 							sOutput += "[ ";
2260cdf0e10cSrcweir 							sOutput += sCur;
2261cdf0e10cSrcweir 							sOutput += " ] ";
2262cdf0e10cSrcweir 						}
2263cdf0e10cSrcweir 						sOutput += "= ";
2264cdf0e10cSrcweir                         ConvertMergeContent( sText );
2265cdf0e10cSrcweir 						sOutput += sText;
2266cdf0e10cSrcweir 						if ( bDefine )
2267cdf0e10cSrcweir 							sOutput += ";\\\n";
2268cdf0e10cSrcweir 						else if ( !bNextMustBeDefineEOL )
2269cdf0e10cSrcweir 							sOutput += ";\n";
2270cdf0e10cSrcweir 						else
2271cdf0e10cSrcweir 							bAddSemikolon = sal_True;
2272cdf0e10cSrcweir 						for ( sal_uInt16 j = 1; j < nLevel; j++ )
2273cdf0e10cSrcweir 							sOutput += "\t";
2274cdf0e10cSrcweir 						WriteToMerged( sOutput ,true );
2275cdf0e10cSrcweir 					}
2276cdf0e10cSrcweir 				}
2277cdf0e10cSrcweir 				if ( bAddSemikolon ) {
2278cdf0e10cSrcweir 					ByteString sOutput( ";" );
2279cdf0e10cSrcweir 					WriteToMerged( sOutput ,false);
2280cdf0e10cSrcweir 				}
2281cdf0e10cSrcweir 			}
2282cdf0e10cSrcweir 			// Merge Lists
2283cdf0e10cSrcweir 
2284cdf0e10cSrcweir 			if ( pResData->bList ) {
2285cdf0e10cSrcweir 				//printf("Dumping ResData\n");
2286cdf0e10cSrcweir 				//pResData->Dump();
2287cdf0e10cSrcweir 
2288cdf0e10cSrcweir 				bool bPairedList = false;
2289cdf0e10cSrcweir 				ByteString sOldId = pResData->sId;
2290cdf0e10cSrcweir 				ByteString sOldGId = pResData->sGId;
2291cdf0e10cSrcweir 				ByteString sOldTyp = pResData->sResTyp;
2292cdf0e10cSrcweir 				if ( pResData->sGId.Len())
2293cdf0e10cSrcweir 					pResData->sGId += ".";
2294cdf0e10cSrcweir 				pResData->sGId += sOldId;
2295cdf0e10cSrcweir 				ByteString sSpace;
2296cdf0e10cSrcweir 				for ( sal_uInt16 i = 1; i < nLevel-1; i++ )
2297cdf0e10cSrcweir 					sSpace += "\t";
2298cdf0e10cSrcweir 				for ( sal_uInt16 nT = LIST_STRING; nT <= LIST_UIENTRIES; nT++ ) {
2299cdf0e10cSrcweir 					ExportList *pList = NULL;
2300cdf0e10cSrcweir 					switch ( nT ) {
2301cdf0e10cSrcweir                         case LIST_STRING : pResData->sResTyp = "stringlist"; pList = pResData->pStringList; bPairedList = false; break;
2302cdf0e10cSrcweir 						case LIST_FILTER : pResData->sResTyp = "filterlist"; pList = pResData->pFilterList; bPairedList = false; break;
2303cdf0e10cSrcweir 						case LIST_UIENTRIES : pResData->sResTyp = "uientries"; pList = pResData->pUIEntries;bPairedList = false; break;
2304cdf0e10cSrcweir 						case LIST_ITEM : pResData->sResTyp = "itemlist"; pList = pResData->pItemList;       bPairedList = false; break;
2305cdf0e10cSrcweir                         case LIST_PAIRED : pResData->sResTyp = "pairedlist"; pList = pResData->pPairedList; bPairedList = true;  break;
2306cdf0e10cSrcweir 					}
2307cdf0e10cSrcweir                     ByteString sCur;
2308cdf0e10cSrcweir                     for( unsigned int n = 0; n < aLanguages.size(); n++ ){
2309cdf0e10cSrcweir                         sCur = aLanguages[ n ];
2310cdf0e10cSrcweir 						sal_uInt16 nIdx = 1;
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir 						// Set matching pairedlist identifier
2313cdf0e10cSrcweir 						if( bPairedList && pResData->pPairedList && ( nIdx == 1 ) ){
2314cdf0e10cSrcweir 							ExportListEntry* pListE = ( ExportListEntry* ) pResData->pPairedList->GetObject( nIdx-1 );
2315cdf0e10cSrcweir 							pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] );
2316cdf0e10cSrcweir 						}
2317cdf0e10cSrcweir 						else
2318cdf0e10cSrcweir 							pResData->sId = ByteString("1");
2319cdf0e10cSrcweir 
2320cdf0e10cSrcweir 						PFormEntrys *pEntrys;
2321cdf0e10cSrcweir 						sal_uLong nLIndex = 0;
2322cdf0e10cSrcweir 						sal_uLong nMaxIndex = 0;
2323cdf0e10cSrcweir 						if ( pList )
2324cdf0e10cSrcweir 							nMaxIndex = pList->GetSourceLanguageListEntryCount();
2325cdf0e10cSrcweir 						pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
2326cdf0e10cSrcweir                         while( pEntrys  && ( nLIndex < nMaxIndex )) {
2327cdf0e10cSrcweir 						    //printf("Lang %s, List Index %d\n",sCur.GetBuffer(),(int)nLIndex);
2328cdf0e10cSrcweir 							ByteString sText;
2329cdf0e10cSrcweir                             sal_Bool bText;
2330cdf0e10cSrcweir 							bText = pEntrys->GetTransex3Text( sText, STRING_TYP_TEXT, sCur, sal_True );
2331cdf0e10cSrcweir 							if( !bText )
2332cdf0e10cSrcweir 								bText = pEntrys->GetTransex3Text( sText , STRING_TYP_TEXT, SOURCE_LANGUAGE , sal_False );
2333cdf0e10cSrcweir 
2334cdf0e10cSrcweir 							// Use fallback, if data is missing in sdf file
2335cdf0e10cSrcweir 							//if( !bText && pResData->sResTyp.Equals( "pairedlist" ) ){
2336cdf0e10cSrcweir 							if( !bText && bPairedList ){
2337cdf0e10cSrcweir 								if( pResData->isMerged( sCur ) ) break;
2338cdf0e10cSrcweir 								const ByteString sPlist("pairedlist");
2339cdf0e10cSrcweir 								ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sGId , pResData->sId , sFilename );
2340cdf0e10cSrcweir 								bText = pResData->getFallbackData( sKey , sText );
2341cdf0e10cSrcweir 							}else if ( !bText ){// new fallback
2342cdf0e10cSrcweir 								if( pResData->isMerged( sCur ) ) break;
2343cdf0e10cSrcweir 								const ByteString sPlist("list");
2344cdf0e10cSrcweir 								ByteString sKey = MergeDataFile::CreateKey( sPlist , pResData->sGId , pResData->sId , sFilename );
2345cdf0e10cSrcweir 								bText = pResData->getFallbackData( sKey , sText );
2346cdf0e10cSrcweir 							} // new fallback
2347cdf0e10cSrcweir 
2348cdf0e10cSrcweir 							if ( bText && sText.Len()) {
2349cdf0e10cSrcweir 								//if( pEntrys ) pEntrys->Dump();
2350cdf0e10cSrcweir 								if ( nIdx == 1 ) {
2351cdf0e10cSrcweir 									ByteString sHead;
2352cdf0e10cSrcweir 									if ( bNextMustBeDefineEOL )
2353cdf0e10cSrcweir 										sHead = "\\\n\t";
2354cdf0e10cSrcweir 									sHead += sSpace;
2355cdf0e10cSrcweir 									switch ( nT ) {
2356cdf0e10cSrcweir 										case LIST_STRING : sHead += "StringList "; break;
2357cdf0e10cSrcweir 										case LIST_FILTER : sHead += "FilterList "; break;
2358cdf0e10cSrcweir 										case LIST_ITEM : sHead += "ItemList "; break;
2359cdf0e10cSrcweir 										case LIST_PAIRED : sHead += "PairedList "; break;
2360cdf0e10cSrcweir 										case LIST_UIENTRIES : sHead += "UIEntries "; break;
2361cdf0e10cSrcweir 									}
2362cdf0e10cSrcweir   									sHead += "[ ";
2363cdf0e10cSrcweir                                     sHead += sCur;
2364cdf0e10cSrcweir 									sHead += " ] ";
2365cdf0e10cSrcweir 									//}
2366cdf0e10cSrcweir 									if ( bDefine || bNextMustBeDefineEOL ) {
2367cdf0e10cSrcweir 										sHead += "= \\\n";
2368cdf0e10cSrcweir 										sHead += sSpace;
2369cdf0e10cSrcweir 										sHead += "\t{\\\n\t";
2370cdf0e10cSrcweir 									}
2371cdf0e10cSrcweir 									else {
2372cdf0e10cSrcweir 										sHead += "= \n";
2373cdf0e10cSrcweir 										sHead += sSpace;
2374cdf0e10cSrcweir 										sHead += "\t{\n\t";
2375cdf0e10cSrcweir 									}
2376cdf0e10cSrcweir 									WriteToMerged( sHead , true);
2377cdf0e10cSrcweir 								}
2378cdf0e10cSrcweir 								ByteString sLine;
2379cdf0e10cSrcweir 								if ( pList && pList->GetObject( nLIndex ))
2380cdf0e10cSrcweir 									sLine = ( *pList->GetObject( nLIndex ))[ SOURCE_LANGUAGE ];
2381cdf0e10cSrcweir 								if ( !sLine.Len())
2382cdf0e10cSrcweir 									sLine = sLastListLine;
2383cdf0e10cSrcweir 
2384cdf0e10cSrcweir 								if ( sLastListLine.Search( "<" ) != STRING_NOTFOUND ) {
2385cdf0e10cSrcweir 									if (( nT != LIST_UIENTRIES ) &&
2386cdf0e10cSrcweir 										(( sLine.Search( "{" ) == STRING_NOTFOUND ) ||
2387cdf0e10cSrcweir 										( sLine.Search( "{" ) >= sLine.Search( "\"" ))) &&
2388cdf0e10cSrcweir 										(( sLine.Search( "<" ) == STRING_NOTFOUND ) ||
2389cdf0e10cSrcweir 										( sLine.Search( "<" ) >= sLine.Search( "\"" ))))
2390cdf0e10cSrcweir 									{
2391cdf0e10cSrcweir 										sLine.SearchAndReplace( "\"", "< \"" );
2392cdf0e10cSrcweir 									}
2393cdf0e10cSrcweir 								}
2394cdf0e10cSrcweir 
2395cdf0e10cSrcweir 								sal_uInt16 nStart, nEnd;
2396cdf0e10cSrcweir 								nStart = sLine.Search( "\"" );
2397cdf0e10cSrcweir 
2398cdf0e10cSrcweir 								ByteString sPostFix;
2399cdf0e10cSrcweir 								if( !bPairedList ){
2400cdf0e10cSrcweir 									nEnd = sLine.SearchBackward( '\"' );
2401cdf0e10cSrcweir 									sPostFix = ByteString( sLine.Copy( ++nEnd ));
2402cdf0e10cSrcweir 									sLine.Erase( nStart );
2403cdf0e10cSrcweir 								}
2404cdf0e10cSrcweir 
2405cdf0e10cSrcweir 
2406cdf0e10cSrcweir                             	ConvertMergeContent( sText );
2407cdf0e10cSrcweir 
2408cdf0e10cSrcweir 								// merge new res. in text line
2409cdf0e10cSrcweir 								if( bPairedList ){
2410cdf0e10cSrcweir 									sLine = MergePairedList( sLine , sText );
2411cdf0e10cSrcweir 								}
2412cdf0e10cSrcweir 								else{
2413cdf0e10cSrcweir 									sLine += sText;
2414cdf0e10cSrcweir 									sLine += sPostFix;
2415cdf0e10cSrcweir 								}
2416cdf0e10cSrcweir 
2417cdf0e10cSrcweir 								ByteString sText1( "\t" );
2418cdf0e10cSrcweir 								sText1 += sLine;
2419cdf0e10cSrcweir 								if ( bDefine || bNextMustBeDefineEOL )
2420cdf0e10cSrcweir 									sText1 += " ;\\\n";
2421cdf0e10cSrcweir 								else
2422cdf0e10cSrcweir 									sText1 += " ;\n";
2423cdf0e10cSrcweir 								sText1 += sSpace;
2424cdf0e10cSrcweir 								sText1 += "\t";
2425cdf0e10cSrcweir 								//printf("Writing '%s'\n",sText1.GetBuffer());
2426cdf0e10cSrcweir 								WriteToMerged( sText1 ,true );
2427cdf0e10cSrcweir 
2428cdf0e10cSrcweir 								// Set matching pairedlist identifier
2429cdf0e10cSrcweir 								if ( bPairedList ){
2430cdf0e10cSrcweir 									nIdx++;
2431cdf0e10cSrcweir 									ExportListEntry* pListE = ( ExportListEntry* ) pResData->pPairedList->GetObject( ( nIdx ) -1 );
2432cdf0e10cSrcweir 									if( pListE ){
2433cdf0e10cSrcweir 										pResData->sId = GetPairedListID ( (*pListE)[ SOURCE_LANGUAGE ] );
2434cdf0e10cSrcweir 									}
2435cdf0e10cSrcweir                                 }
2436cdf0e10cSrcweir                                 else
2437cdf0e10cSrcweir                                     pResData->sId = ByteString::CreateFromInt32( ++nIdx );
2438cdf0e10cSrcweir                             }
2439cdf0e10cSrcweir 							else
2440cdf0e10cSrcweir 								break;
2441cdf0e10cSrcweir 							nLIndex ++;
2442cdf0e10cSrcweir 							PFormEntrys *oldEntry = pEntrys;
2443cdf0e10cSrcweir 							pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); // <--- game over
2444cdf0e10cSrcweir 							if( !pEntrys )
2445cdf0e10cSrcweir 								pEntrys = oldEntry;
2446cdf0e10cSrcweir 						}
2447cdf0e10cSrcweir 						if ( nIdx > 1 ) {
2448cdf0e10cSrcweir 							ByteString sFooter( sSpace.Copy( 1 ));
2449cdf0e10cSrcweir 							if ( bNextMustBeDefineEOL )
2450cdf0e10cSrcweir 								sFooter += "};";
2451cdf0e10cSrcweir 							else if ( !bDefine )
2452cdf0e10cSrcweir 								sFooter += "};\n\t";
2453cdf0e10cSrcweir 							else
2454cdf0e10cSrcweir 								sFooter += "\n\n";
2455cdf0e10cSrcweir 							WriteToMerged( sFooter ,true );
2456cdf0e10cSrcweir 						}
2457cdf0e10cSrcweir 					}
2458cdf0e10cSrcweir 				}
2459cdf0e10cSrcweir 
2460cdf0e10cSrcweir 				pResData->sId = sOldId;
2461cdf0e10cSrcweir 				pResData->sGId = sOldGId;
2462cdf0e10cSrcweir 				pResData->sResTyp = sOldTyp;
2463cdf0e10cSrcweir 			}
2464cdf0e10cSrcweir 		}
2465cdf0e10cSrcweir 		break;
2466cdf0e10cSrcweir 		case MERGE_MODE_LIST : {
2467cdf0e10cSrcweir 			ExportList *pList = NULL;
2468cdf0e10cSrcweir 			switch ( nList ) {
2469cdf0e10cSrcweir 			    // PairedList
2470cdf0e10cSrcweir                 case LIST_STRING : pList = pResData->pStringList; break;
2471cdf0e10cSrcweir 				case LIST_FILTER : pList = pResData->pFilterList; break;
2472cdf0e10cSrcweir 				case LIST_UIENTRIES : pList = pResData->pUIEntries; break;
2473cdf0e10cSrcweir 				case LIST_ITEM : pList = pResData->pItemList; break;
2474cdf0e10cSrcweir 				case LIST_PAIRED : pList = pResData->pPairedList; break;
2475cdf0e10cSrcweir 
2476cdf0e10cSrcweir 			}
2477cdf0e10cSrcweir 
2478cdf0e10cSrcweir 			nListIndex++;
2479cdf0e10cSrcweir 			sal_uLong nMaxIndex = 0;
2480cdf0e10cSrcweir 			if ( pList )
2481cdf0e10cSrcweir 				nMaxIndex = pList->GetSourceLanguageListEntryCount();
2482cdf0e10cSrcweir 			ByteString sLine;
2483cdf0e10cSrcweir 			if ( pList && pList->GetObject( nListIndex ))
2484cdf0e10cSrcweir 				sLine = ( *pList->GetObject( nListIndex ))[ SOURCE_LANGUAGE ];
2485cdf0e10cSrcweir 			if ( !sLine.Len())
2486cdf0e10cSrcweir 				sLine = sLastListLine;
2487cdf0e10cSrcweir 
2488cdf0e10cSrcweir 			if ( sLastListLine.Search( "<" ) != STRING_NOTFOUND ) {
2489cdf0e10cSrcweir 				if (( nList != LIST_UIENTRIES ) &&
2490cdf0e10cSrcweir 					(( sLine.Search( "{" ) == STRING_NOTFOUND ) ||
2491cdf0e10cSrcweir 					( sLine.Search( "{" ) >= sLine.Search( "\"" ))) &&
2492cdf0e10cSrcweir 					(( sLine.Search( "<" ) == STRING_NOTFOUND ) ||
2493cdf0e10cSrcweir 					( sLine.Search( "<" ) >= sLine.Search( "\"" ))))
2494cdf0e10cSrcweir 				{
2495cdf0e10cSrcweir 					sLine.SearchAndReplace( "\"", "< \"" );
2496cdf0e10cSrcweir 				}
2497cdf0e10cSrcweir 			}
2498cdf0e10cSrcweir 
2499cdf0e10cSrcweir 			while( PrepareTextToMerge( sLine, nList, nListLang, pResData ) && ( nListIndex <= nMaxIndex )) {
2500cdf0e10cSrcweir 				ByteString sText( "\t" );
2501cdf0e10cSrcweir 				sText += sLine;
2502cdf0e10cSrcweir 				sText += " ;";
2503cdf0e10cSrcweir 				sText += "\n";
2504cdf0e10cSrcweir 				for ( sal_uInt16 i = 0; i < nLevel; i++ )
2505cdf0e10cSrcweir 					sText += "\t";
2506cdf0e10cSrcweir 				WriteToMerged( sText ,false );
2507cdf0e10cSrcweir 				nListIndex++;
2508cdf0e10cSrcweir 				if ( pList && pList->GetObject( nListIndex ))
2509cdf0e10cSrcweir 					sLine = ( *pList->GetObject( nListIndex ))[ SOURCE_LANGUAGE ];
2510cdf0e10cSrcweir 				if ( !sLine.Len())
2511cdf0e10cSrcweir 					sLine = sLastListLine;
2512cdf0e10cSrcweir 				sLine += " ;";
2513cdf0e10cSrcweir 			}
2514cdf0e10cSrcweir 		}
2515cdf0e10cSrcweir 		break;
2516cdf0e10cSrcweir 	}
2517cdf0e10cSrcweir     pParseQueue->bMflag = false;
2518cdf0e10cSrcweir }
2519cdf0e10cSrcweir 
MergePairedList(ByteString & sLine,ByteString & sText)2520cdf0e10cSrcweir ByteString Export::MergePairedList( ByteString& sLine , ByteString& sText ){
2521cdf0e10cSrcweir // < "xy" ; IDENTIFIER ; >
2522cdf0e10cSrcweir 	ByteString sPre  = sLine.Copy( 0 , sLine.Search('\"') );
2523cdf0e10cSrcweir 	ByteString sPost = sLine.Copy( sLine.SearchBackward('\"') + 1 , sLine.Len() );
2524cdf0e10cSrcweir 	sPre.Append( sText );
2525cdf0e10cSrcweir 	sPre.Append( sPost );
2526cdf0e10cSrcweir 	return sPre;
2527cdf0e10cSrcweir }
2528cdf0e10cSrcweir 
2529cdf0e10cSrcweir /*****************************************************************************/
SetChildWithText()2530cdf0e10cSrcweir void Export::SetChildWithText()
2531cdf0e10cSrcweir /*****************************************************************************/
2532cdf0e10cSrcweir {
2533cdf0e10cSrcweir 	if ( aResStack.Count() > 1 ) {
2534cdf0e10cSrcweir 		for ( sal_uLong i = 0; i < aResStack.Count() - 1; i++ ) {
2535cdf0e10cSrcweir 			aResStack.GetObject( i )->bChildWithText = sal_True;
2536cdf0e10cSrcweir 		}
2537cdf0e10cSrcweir 	}
2538cdf0e10cSrcweir }
2539cdf0e10cSrcweir 
Push(const QueueEntry & aEntry)2540cdf0e10cSrcweir void ParserQueue::Push( const QueueEntry& aEntry ){
2541cdf0e10cSrcweir //    printf("nTyp = %d ",aEntry.nTyp);
2542cdf0e10cSrcweir     sal_uInt16 nLen = aEntry.sLine.Len();
2543cdf0e10cSrcweir 
2544cdf0e10cSrcweir     if( !bStart ){
2545cdf0e10cSrcweir         aQueueCur->push( aEntry );
2546cdf0e10cSrcweir         if( nLen > 1 && aEntry.sLine.GetChar( nLen-1 ) == '\n' )
2547cdf0e10cSrcweir             bStart = true;
2548cdf0e10cSrcweir         else if ( aEntry.nTyp != IGNOREDTOKENS ){
2549cdf0e10cSrcweir             if( nLen > 1 && ( aEntry.sLine.GetChar( nLen-1 ) == '\\') ){
2550cdf0e10cSrcweir                 // Next is Macro
2551cdf0e10cSrcweir                 bCurrentIsM = true;
2552cdf0e10cSrcweir              }else{
2553cdf0e10cSrcweir                 // Next is no Macro
2554cdf0e10cSrcweir                 bCurrentIsM = false;
2555cdf0e10cSrcweir              }
2556cdf0e10cSrcweir         }
2557cdf0e10cSrcweir     }
2558cdf0e10cSrcweir     else{
2559cdf0e10cSrcweir         aQueueNext->push( aEntry );
2560cdf0e10cSrcweir         if( nLen > 1 && aEntry.sLine.GetChar( nLen-1 ) != '\n' ){
2561cdf0e10cSrcweir             if( nLen > 1 && ( aEntry.sLine.GetChar( nLen-1  ) == '\\') ){
2562cdf0e10cSrcweir                 // Next is Macro
2563cdf0e10cSrcweir                 bNextIsM = true;
2564cdf0e10cSrcweir             }
2565cdf0e10cSrcweir             else{
2566cdf0e10cSrcweir                 // Next is no Macro
2567cdf0e10cSrcweir                 bNextIsM = false;
2568cdf0e10cSrcweir             }
2569cdf0e10cSrcweir         }else if( nLen > 2 && aEntry.sLine.GetChar( nLen-1 ) == '\n' ){
2570cdf0e10cSrcweir             if( aEntry.nTyp != IGNOREDTOKENS ){
2571cdf0e10cSrcweir                 if( nLen > 2 && ( aEntry.sLine.GetChar( nLen-2  ) == '\\') ){
2572cdf0e10cSrcweir                     // Next is Macro
2573cdf0e10cSrcweir                     bNextIsM = true;
2574cdf0e10cSrcweir                 }
2575cdf0e10cSrcweir                 else{
2576cdf0e10cSrcweir                     // Next is no Macro
2577cdf0e10cSrcweir                     bNextIsM = false;
2578cdf0e10cSrcweir                 }
2579cdf0e10cSrcweir             }
2580cdf0e10cSrcweir             // Pop current
2581cdf0e10cSrcweir             Pop( *aQueueCur );
2582cdf0e10cSrcweir             bLastWasM = bCurrentIsM;
2583cdf0e10cSrcweir             // next -> current
2584cdf0e10cSrcweir             bCurrentIsM = bNextIsM;
2585cdf0e10cSrcweir             aQref = aQueueCur;
2586cdf0e10cSrcweir             aQueueCur = aQueueNext;
2587cdf0e10cSrcweir             aQueueNext = aQref;
2588cdf0e10cSrcweir 
2589cdf0e10cSrcweir         }
2590cdf0e10cSrcweir 
2591cdf0e10cSrcweir         else{
2592cdf0e10cSrcweir             // Pop current
2593cdf0e10cSrcweir             Pop( *aQueueCur );
2594cdf0e10cSrcweir             bLastWasM = bCurrentIsM;
2595cdf0e10cSrcweir             // next -> current
2596cdf0e10cSrcweir             bCurrentIsM = bNextIsM;
2597cdf0e10cSrcweir             aQref = aQueueCur;
2598cdf0e10cSrcweir             aQueueCur = aQueueNext;
2599cdf0e10cSrcweir             aQueueNext = aQref;
2600cdf0e10cSrcweir         }
2601cdf0e10cSrcweir     }
2602cdf0e10cSrcweir }
2603cdf0e10cSrcweir 
Close()2604cdf0e10cSrcweir void ParserQueue::Close(){
2605cdf0e10cSrcweir     // Pop current
2606cdf0e10cSrcweir     Pop( *aQueueCur );
2607cdf0e10cSrcweir     // next -> current
2608cdf0e10cSrcweir     bLastWasM = bCurrentIsM;
2609cdf0e10cSrcweir     bCurrentIsM = bNextIsM;
2610cdf0e10cSrcweir     aQref = aQueueCur;
2611cdf0e10cSrcweir     aQueueCur = aQueueNext;
2612cdf0e10cSrcweir     aQueueNext = aQref;
2613cdf0e10cSrcweir     bNextIsM = false;
2614cdf0e10cSrcweir     Pop( *aQueueNext );
2615cdf0e10cSrcweir };
Pop(std::queue<QueueEntry> & aQueue)2616cdf0e10cSrcweir void ParserQueue::Pop( std::queue<QueueEntry>& aQueue ){
2617cdf0e10cSrcweir     while( !aQueue.empty() ){
2618cdf0e10cSrcweir         QueueEntry aEntry = aQueue.front();
2619cdf0e10cSrcweir         aQueue.pop();
2620cdf0e10cSrcweir         aExport.Execute( aEntry.nTyp , (char*) aEntry.sLine.GetBuffer() );
2621cdf0e10cSrcweir     }
2622cdf0e10cSrcweir }
ParserQueue(Export & aExportObj)2623cdf0e10cSrcweir ParserQueue::ParserQueue( Export& aExportObj )
2624cdf0e10cSrcweir         :
2625cdf0e10cSrcweir           bCurrentIsM( false ),
2626cdf0e10cSrcweir           bNextIsM( false ) ,
2627cdf0e10cSrcweir           bLastWasM( false ),
2628cdf0e10cSrcweir           bMflag( false ) ,
2629cdf0e10cSrcweir           aExport( aExportObj ) ,
2630cdf0e10cSrcweir           bStart( false ) ,
2631cdf0e10cSrcweir           bStartNext( false )
2632cdf0e10cSrcweir {
2633cdf0e10cSrcweir           aQueueNext = new std::queue<QueueEntry>;
2634cdf0e10cSrcweir           aQueueCur  = new std::queue<QueueEntry>;
2635cdf0e10cSrcweir }
2636cdf0e10cSrcweir 
2637cdf0e10cSrcweir 
~ParserQueue()2638cdf0e10cSrcweir ParserQueue::~ParserQueue(){
2639cdf0e10cSrcweir     if( aQueueNext )    delete aQueueNext;
2640cdf0e10cSrcweir     if( aQueueCur )     delete aQueueCur;
2641cdf0e10cSrcweir }
2642