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