xref: /AOO41X/main/rsc/source/tools/rsctools.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_rsc.hxx"
30*cdf0e10cSrcweir /****************** I N C L U D E S **************************************/
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir // C and C++ Includes.
33*cdf0e10cSrcweir #include <stdlib.h>
34*cdf0e10cSrcweir #include <stdio.h>
35*cdf0e10cSrcweir #if defined (WNT )
36*cdf0e10cSrcweir #include <direct.h>
37*cdf0e10cSrcweir #endif
38*cdf0e10cSrcweir #if defined ( OS2 ) && !defined ( GCC )
39*cdf0e10cSrcweir #include <direct.h>
40*cdf0e10cSrcweir #endif
41*cdf0e10cSrcweir #include <string.h>
42*cdf0e10cSrcweir #include <ctype.h>
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir #include <tools/fsys.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir // Include
47*cdf0e10cSrcweir #include <rscdef.hxx>
48*cdf0e10cSrcweir #include <rsctools.hxx>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #include <osl/file.h>
51*cdf0e10cSrcweir #include <rtl/alloc.h>
52*cdf0e10cSrcweir #include <rtl/memory.h>
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir using namespace rtl;
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir /****************** C o d e **********************************************/
57*cdf0e10cSrcweir /*************************************************************************
58*cdf0e10cSrcweir |*
59*cdf0e10cSrcweir |*	  rsc_strnicmp()
60*cdf0e10cSrcweir |*
61*cdf0e10cSrcweir |*	  Beschreibung		Vergleicht zwei Strings Case-Unabhaengig bis zu
62*cdf0e10cSrcweir |*						einer bestimmten Laenge
63*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
64*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
65*cdf0e10cSrcweir |*
66*cdf0e10cSrcweir *************************************************************************/
67*cdf0e10cSrcweir int rsc_strnicmp( const char *string1, const char *string2, size_t count )
68*cdf0e10cSrcweir {
69*cdf0e10cSrcweir 	size_t i;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir 	for( i = 0; ( i < count ) && string1[ i ] && string2[ i ] ; i++ )
72*cdf0e10cSrcweir 	{
73*cdf0e10cSrcweir 		if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
74*cdf0e10cSrcweir 			return( -1 );
75*cdf0e10cSrcweir 		else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
76*cdf0e10cSrcweir 			return( 1 );
77*cdf0e10cSrcweir 	}
78*cdf0e10cSrcweir 	if( i == count )
79*cdf0e10cSrcweir 		return( 0 );
80*cdf0e10cSrcweir 	else if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
81*cdf0e10cSrcweir 		return( -1 );
82*cdf0e10cSrcweir 	else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
83*cdf0e10cSrcweir 		return( 1 );
84*cdf0e10cSrcweir 	return( 0 );
85*cdf0e10cSrcweir }
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir /*************************************************************************
88*cdf0e10cSrcweir |*
89*cdf0e10cSrcweir |*	  rsc_strnicmp()
90*cdf0e10cSrcweir |*
91*cdf0e10cSrcweir |*	  Beschreibung		Vergleicht zwei Strings Case-Unabhaengig
92*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
93*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
94*cdf0e10cSrcweir |*
95*cdf0e10cSrcweir *************************************************************************/
96*cdf0e10cSrcweir int rsc_stricmp( const char *string1, const char *string2 ){
97*cdf0e10cSrcweir 	int i;
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 	for( i = 0; string1[ i ] && string2[ i ]; i++ ){
100*cdf0e10cSrcweir 		if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
101*cdf0e10cSrcweir 			return( -1 );
102*cdf0e10cSrcweir 		else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
103*cdf0e10cSrcweir 			return( 1 );
104*cdf0e10cSrcweir 	}
105*cdf0e10cSrcweir 	if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
106*cdf0e10cSrcweir 		return( -1 );
107*cdf0e10cSrcweir 	else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
108*cdf0e10cSrcweir 		return( 1 );
109*cdf0e10cSrcweir 	return( 0 );
110*cdf0e10cSrcweir }
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir char* rsc_strdup( const char* pStr )
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir     int nLen = strlen( pStr );
115*cdf0e10cSrcweir     char* pBuffer = (char*)rtl_allocateMemory( nLen+1 );
116*cdf0e10cSrcweir     rtl_copyMemory( pBuffer, pStr, nLen+1 );
117*cdf0e10cSrcweir     return pBuffer;
118*cdf0e10cSrcweir }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir /*************************************************************************
121*cdf0e10cSrcweir |*
122*cdf0e10cSrcweir |*	  GetTmpFileName()
123*cdf0e10cSrcweir |*
124*cdf0e10cSrcweir |*	  Beschreibung		Gibt einen String eines eindeutigen Dateinamens
125*cdf0e10cSrcweir |*						zurueck. Der Speicher fuer den String wird mit
126*cdf0e10cSrcweir |*						malloc allokiert
127*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
128*cdf0e10cSrcweir |*	  Letzte Aenderung	MH 13.10.97
129*cdf0e10cSrcweir |*
130*cdf0e10cSrcweir *************************************************************************/
131*cdf0e10cSrcweir ByteString GetTmpFileName()
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir     OUString aTmpURL, aTmpFile;
134*cdf0e10cSrcweir     osl_createTempFile( NULL, NULL, &aTmpURL.pData );
135*cdf0e10cSrcweir     osl_getSystemPathFromFileURL( aTmpURL.pData, &aTmpFile.pData );
136*cdf0e10cSrcweir     return OUStringToOString( aTmpFile, RTL_TEXTENCODING_MS_1252 );
137*cdf0e10cSrcweir }
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir /********************************************************************/
140*cdf0e10cSrcweir /*																	*/
141*cdf0e10cSrcweir /*	Function	:	Append( )										*/
142*cdf0e10cSrcweir /*																	*/
143*cdf0e10cSrcweir /*	Parameters	:	psw 	- pointer to a preprocessor switch		*/
144*cdf0e10cSrcweir /*																	*/
145*cdf0e10cSrcweir /*	Description :	appends text files								*/
146*cdf0e10cSrcweir /********************************************************************/
147*cdf0e10cSrcweir sal_Bool Append( FILE * fDest, ByteString aTmpFile )
148*cdf0e10cSrcweir {
149*cdf0e10cSrcweir #define MAX_BUF 4096
150*cdf0e10cSrcweir 	char	szBuf[ MAX_BUF ];
151*cdf0e10cSrcweir 	int	    nItems;
152*cdf0e10cSrcweir 	FILE	*fSource;
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir 	fSource = fopen( aTmpFile.GetBuffer(), "rb" );
155*cdf0e10cSrcweir 	if( !fDest || !fSource ){
156*cdf0e10cSrcweir 		if( fSource )
157*cdf0e10cSrcweir 			fclose( fSource );
158*cdf0e10cSrcweir 		return sal_False;
159*cdf0e10cSrcweir 	}
160*cdf0e10cSrcweir 	else{
161*cdf0e10cSrcweir 		do{ // append
162*cdf0e10cSrcweir 			nItems = fread( szBuf, sizeof( char ), MAX_BUF, fSource );
163*cdf0e10cSrcweir 			fwrite( szBuf, sizeof( char ), nItems, fDest );
164*cdf0e10cSrcweir 		} while( MAX_BUF == nItems );
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 		fclose( fSource );
167*cdf0e10cSrcweir 	};
168*cdf0e10cSrcweir 	return sal_True;
169*cdf0e10cSrcweir }
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir sal_Bool Append( ByteString aOutputSrs, ByteString aTmpFile )
172*cdf0e10cSrcweir {
173*cdf0e10cSrcweir 	FILE * fDest   = fopen( aOutputSrs.GetBuffer(), "ab" );
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 	sal_Bool bRet = Append( fDest, aTmpFile );
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir 	if( fDest )
178*cdf0e10cSrcweir 		fclose( fDest );
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir 	return bRet;
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir /*************************************************************************
184*cdf0e10cSrcweir |*
185*cdf0e10cSrcweir |*	  InputFile
186*cdf0e10cSrcweir |*
187*cdf0e10cSrcweir |*	  Beschreibung		Haengt Extension an, wenn keine da ist
188*cdf0e10cSrcweir |*	  Parameter:		pInput, der Input-Dateiname.
189*cdf0e10cSrcweir |*						pExt, die Extension des Ausgabenamens
190*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
191*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 28.06.91
192*cdf0e10cSrcweir |*
193*cdf0e10cSrcweir *************************************************************************/
194*cdf0e10cSrcweir ByteString InputFile ( const char * pInput, const char * pExt )
195*cdf0e10cSrcweir {
196*cdf0e10cSrcweir 	UniString aUniInput( pInput, RTL_TEXTENCODING_ASCII_US );
197*cdf0e10cSrcweir 	DirEntry aFileName( aUniInput );
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir 	if ( 0 == aFileName.GetExtension().Len() )
200*cdf0e10cSrcweir 	{
201*cdf0e10cSrcweir 		UniString aExt( pExt, RTL_TEXTENCODING_ASCII_US );
202*cdf0e10cSrcweir 		aFileName.SetExtension( aExt );
203*cdf0e10cSrcweir 	}
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir 	return ByteString( aFileName.GetFull(), RTL_TEXTENCODING_ASCII_US );
206*cdf0e10cSrcweir }
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir /*************************************************************************
209*cdf0e10cSrcweir |*
210*cdf0e10cSrcweir |*	  OutputFile
211*cdf0e10cSrcweir |*
212*cdf0e10cSrcweir |*	  Beschreibung		Ersetzt Extension durch eine andere
213*cdf0e10cSrcweir |*	  Parameter:		input, der Input-Dateiname.
214*cdf0e10cSrcweir |*						pExt, die Extension des Ausgabenamens
215*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
216*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 28.06.91
217*cdf0e10cSrcweir |*
218*cdf0e10cSrcweir *************************************************************************/
219*cdf0e10cSrcweir ByteString OutputFile ( ByteString aInput, const char * pExt )
220*cdf0e10cSrcweir {
221*cdf0e10cSrcweir 	UniString	aUniInput( aInput, RTL_TEXTENCODING_ASCII_US );
222*cdf0e10cSrcweir 	DirEntry	aFileName( aUniInput );
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir 	UniString aExt( pExt, RTL_TEXTENCODING_ASCII_US );
225*cdf0e10cSrcweir 	aFileName.SetExtension( aExt );
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 	return ByteString( aFileName.GetFull(), RTL_TEXTENCODING_ASCII_US );
228*cdf0e10cSrcweir }
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir /*************************************************************************
231*cdf0e10cSrcweir |*
232*cdf0e10cSrcweir |*	  ::ResonseFile()
233*cdf0e10cSrcweir |*
234*cdf0e10cSrcweir |*	  Beschreibung		Kommandozeile aufbereiten
235*cdf0e10cSrcweir |*	  Ersterstellung	MM 05.09.91
236*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 05.09.91
237*cdf0e10cSrcweir |*
238*cdf0e10cSrcweir *************************************************************************/
239*cdf0e10cSrcweir char * ResponseFile( RscPtrPtr * ppCmd, char ** ppArgv, sal_uInt32 nArgc )
240*cdf0e10cSrcweir {
241*cdf0e10cSrcweir 	FILE	*fFile;
242*cdf0e10cSrcweir 	int 	nItems;
243*cdf0e10cSrcweir 	char	szBuffer[4096]; 	  // file buffer
244*cdf0e10cSrcweir 	sal_uInt32	i;
245*cdf0e10cSrcweir     bool bInQuotes = false;
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir 	// Programmname
248*cdf0e10cSrcweir 	ppCmd->Append( rsc_strdup( *ppArgv ) );
249*cdf0e10cSrcweir 	for( i = 1; i < nArgc; i++ )
250*cdf0e10cSrcweir 	{
251*cdf0e10cSrcweir 		if( '@' == **(ppArgv +i) ){ // wenn @, dann Response-Datei
252*cdf0e10cSrcweir 			if( NULL == (fFile = fopen( (*(ppArgv +i)) +1, "r" )) )
253*cdf0e10cSrcweir 				return( (*(ppArgv +i)) );
254*cdf0e10cSrcweir 			nItems = fread( &szBuffer[ 0 ], 1, sizeof( char ), fFile );
255*cdf0e10cSrcweir 			while( nItems )
256*cdf0e10cSrcweir 			{
257*cdf0e10cSrcweir 				if( !isspace( szBuffer[ 0 ] ) )
258*cdf0e10cSrcweir 				{
259*cdf0e10cSrcweir                     /*
260*cdf0e10cSrcweir                      *  #i27914# double ticks '"' now have a duplicate function:
261*cdf0e10cSrcweir                      *  1. they define a string ( e.g. -DFOO="baz" )
262*cdf0e10cSrcweir                      *  2. a string can contain spaces, so -DFOO="baz zum" defines one
263*cdf0e10cSrcweir                      *  argument no two !
264*cdf0e10cSrcweir                      */
265*cdf0e10cSrcweir 					unsigned int n = 0;
266*cdf0e10cSrcweir 					while( nItems && (!isspace( szBuffer[ n ] ) || bInQuotes) &&
267*cdf0e10cSrcweir 						   n +1 < sizeof( szBuffer )  )
268*cdf0e10cSrcweir 					{
269*cdf0e10cSrcweir 						n++;
270*cdf0e10cSrcweir 						nItems = fread( &szBuffer[ n ], 1,
271*cdf0e10cSrcweir 										sizeof( char ), fFile );
272*cdf0e10cSrcweir                         if( szBuffer[n] == '"' )
273*cdf0e10cSrcweir                             bInQuotes = !bInQuotes;
274*cdf0e10cSrcweir 					}
275*cdf0e10cSrcweir 					szBuffer[ n ] = '\0';
276*cdf0e10cSrcweir 					ppCmd->Append( rsc_strdup( szBuffer ) );
277*cdf0e10cSrcweir 				}
278*cdf0e10cSrcweir 				nItems = fread( &szBuffer[ 0 ], 1, sizeof( char ), fFile );
279*cdf0e10cSrcweir 			};
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 			fclose( fFile );
282*cdf0e10cSrcweir 		}
283*cdf0e10cSrcweir 		else
284*cdf0e10cSrcweir 			ppCmd->Append( rsc_strdup( *(ppArgv +i) ) );
285*cdf0e10cSrcweir 	};
286*cdf0e10cSrcweir 	ppCmd->Append( (void *)0 );
287*cdf0e10cSrcweir 	return( NULL );
288*cdf0e10cSrcweir }
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir /*************** R s c P t r P t r **************************************/
292*cdf0e10cSrcweir /*************************************************************************
293*cdf0e10cSrcweir |*
294*cdf0e10cSrcweir |*	  RscPtrPtr :: RscPtrPtr()
295*cdf0e10cSrcweir |*
296*cdf0e10cSrcweir |*	  Beschreibung		Eine Tabelle mit Zeigern
297*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
298*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
299*cdf0e10cSrcweir |*
300*cdf0e10cSrcweir *************************************************************************/
301*cdf0e10cSrcweir RscPtrPtr :: RscPtrPtr(){
302*cdf0e10cSrcweir 	nCount = 0;
303*cdf0e10cSrcweir 	pMem = NULL;
304*cdf0e10cSrcweir }
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir /*************************************************************************
307*cdf0e10cSrcweir |*
308*cdf0e10cSrcweir |*	  RscPtrPtr :: ~RscPtrPtr()
309*cdf0e10cSrcweir |*
310*cdf0e10cSrcweir |*	  Beschreibung		Zerst�rt eine Tabelle mit Zeigern, die Zeiger werde
311*cdf0e10cSrcweir |*						ebenfalls freigegebn
312*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
313*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
314*cdf0e10cSrcweir |*
315*cdf0e10cSrcweir *************************************************************************/
316*cdf0e10cSrcweir RscPtrPtr :: ~RscPtrPtr(){
317*cdf0e10cSrcweir 	Reset();
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir /*************************************************************************
321*cdf0e10cSrcweir |*
322*cdf0e10cSrcweir |*	  RscPtrPtr :: Reset()
323*cdf0e10cSrcweir |*
324*cdf0e10cSrcweir |*	  Beschreibung
325*cdf0e10cSrcweir |*	  Ersterstellung	MM 03.05.91
326*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 03.05.91
327*cdf0e10cSrcweir |*
328*cdf0e10cSrcweir *************************************************************************/
329*cdf0e10cSrcweir void RscPtrPtr :: Reset(){
330*cdf0e10cSrcweir 	sal_uInt32 i;
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir 	if( pMem ){
333*cdf0e10cSrcweir 		for( i = 0; i < nCount; i++ ){
334*cdf0e10cSrcweir 			if( pMem[ i ] )
335*cdf0e10cSrcweir 			   rtl_freeMemory( pMem[ i ] );
336*cdf0e10cSrcweir 		}
337*cdf0e10cSrcweir 		rtl_freeMemory( (void *)pMem );
338*cdf0e10cSrcweir 	};
339*cdf0e10cSrcweir 	nCount = 0;
340*cdf0e10cSrcweir 	pMem = NULL;
341*cdf0e10cSrcweir }
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir /*************************************************************************
344*cdf0e10cSrcweir |*
345*cdf0e10cSrcweir |*	  RscPtrPtr :: Append()
346*cdf0e10cSrcweir |*
347*cdf0e10cSrcweir |*	  Beschreibung		Haengt einen Eintrag an.
348*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
349*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
350*cdf0e10cSrcweir |*
351*cdf0e10cSrcweir *************************************************************************/
352*cdf0e10cSrcweir sal_uInt32 RscPtrPtr :: Append( void * pBuffer ){
353*cdf0e10cSrcweir 	if( !pMem )
354*cdf0e10cSrcweir 		pMem = (void **)rtl_allocateMemory( (nCount +1) * sizeof( void * ) );
355*cdf0e10cSrcweir 	else
356*cdf0e10cSrcweir 		pMem = (void **)rtl_reallocateMemory( (void *)pMem,
357*cdf0e10cSrcweir 						 ((nCount +1) * sizeof( void * )
358*cdf0e10cSrcweir 					   ) );
359*cdf0e10cSrcweir 	pMem[ nCount ] = pBuffer;
360*cdf0e10cSrcweir 	return( nCount++ );
361*cdf0e10cSrcweir }
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir /*************************************************************************
364*cdf0e10cSrcweir |*
365*cdf0e10cSrcweir |*	  RscPtrPtr :: GetEntry()
366*cdf0e10cSrcweir |*
367*cdf0e10cSrcweir |*	  Beschreibung		Liefert einen Eintrag, NULL wenn nicht vorhanden.
368*cdf0e10cSrcweir |*	  Ersterstellung	MM 13.02.91
369*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 13.02.91
370*cdf0e10cSrcweir |*
371*cdf0e10cSrcweir *************************************************************************/
372*cdf0e10cSrcweir void * RscPtrPtr :: GetEntry( sal_uInt32 nEntry ){
373*cdf0e10cSrcweir 	if( nEntry < nCount )
374*cdf0e10cSrcweir 		return( pMem[ nEntry ] );
375*cdf0e10cSrcweir 	return( NULL );
376*cdf0e10cSrcweir }
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir /****************** R S C W R I T E R C **********************************/
379*cdf0e10cSrcweir /*************************************************************************
380*cdf0e10cSrcweir |*
381*cdf0e10cSrcweir |*	  RscWriteRc :: RscWriteRc()
382*cdf0e10cSrcweir |*
383*cdf0e10cSrcweir |*	  Beschreibung
384*cdf0e10cSrcweir |*	  Ersterstellung	MM 15.04.91
385*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 15.04.91
386*cdf0e10cSrcweir |*
387*cdf0e10cSrcweir *************************************************************************/
388*cdf0e10cSrcweir RscWriteRc::RscWriteRc( RSCBYTEORDER_TYPE nOrder )
389*cdf0e10cSrcweir {
390*cdf0e10cSrcweir 	short				nSwapTest = 1;
391*cdf0e10cSrcweir 	RSCBYTEORDER_TYPE	nMachineOrder;
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir 	bSwap = sal_False;
394*cdf0e10cSrcweir 	if( nOrder != RSC_SYSTEMENDIAN )
395*cdf0e10cSrcweir 	{
396*cdf0e10cSrcweir 		if( (sal_uInt8)*(sal_uInt8 *)&nSwapTest )
397*cdf0e10cSrcweir 			nMachineOrder = RSC_LITTLEENDIAN;
398*cdf0e10cSrcweir 		else
399*cdf0e10cSrcweir 			nMachineOrder = RSC_BIGENDIAN;
400*cdf0e10cSrcweir 		bSwap = nOrder != nMachineOrder;
401*cdf0e10cSrcweir 	}
402*cdf0e10cSrcweir 	nByteOrder = nOrder;
403*cdf0e10cSrcweir 	nLen = 0;
404*cdf0e10cSrcweir 	pMem = NULL;
405*cdf0e10cSrcweir }
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir /*************************************************************************
408*cdf0e10cSrcweir |*
409*cdf0e10cSrcweir |*	  RscWriteRc :: ~RscWriteRc()
410*cdf0e10cSrcweir |*
411*cdf0e10cSrcweir |*	  Beschreibung
412*cdf0e10cSrcweir |*	  Ersterstellung	MM 15.04.91
413*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 15.04.91
414*cdf0e10cSrcweir |*
415*cdf0e10cSrcweir *************************************************************************/
416*cdf0e10cSrcweir RscWriteRc :: ~RscWriteRc()
417*cdf0e10cSrcweir {
418*cdf0e10cSrcweir 	if( pMem )
419*cdf0e10cSrcweir 		rtl_freeMemory( pMem );
420*cdf0e10cSrcweir }
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir /*************************************************************************
423*cdf0e10cSrcweir |*
424*cdf0e10cSrcweir |*	  RscWriteRc :: IncSize()
425*cdf0e10cSrcweir |*
426*cdf0e10cSrcweir |*	  Beschreibung
427*cdf0e10cSrcweir |*	  Ersterstellung	MM 15.04.91
428*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 15.04.91
429*cdf0e10cSrcweir |*
430*cdf0e10cSrcweir *************************************************************************/
431*cdf0e10cSrcweir sal_uInt32 RscWriteRc :: IncSize( sal_uInt32 nSize )
432*cdf0e10cSrcweir {
433*cdf0e10cSrcweir 	nLen += nSize;
434*cdf0e10cSrcweir 	if( pMem )
435*cdf0e10cSrcweir 		pMem = (char*)rtl_reallocateMemory( pMem, nLen );
436*cdf0e10cSrcweir 	return( nLen - nSize );
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir /*************************************************************************
440*cdf0e10cSrcweir |*
441*cdf0e10cSrcweir |*	  RscWriteRc :: GetPointer()
442*cdf0e10cSrcweir |*
443*cdf0e10cSrcweir |*	  Beschreibung
444*cdf0e10cSrcweir |*	  Ersterstellung	MM 15.04.91
445*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 15.04.91
446*cdf0e10cSrcweir |*
447*cdf0e10cSrcweir *************************************************************************/
448*cdf0e10cSrcweir char * RscWriteRc :: GetPointer( sal_uInt32 nSize )
449*cdf0e10cSrcweir {
450*cdf0e10cSrcweir 	if( !pMem )
451*cdf0e10cSrcweir 		pMem = (char *)rtl_allocateMemory( nLen );
452*cdf0e10cSrcweir 	return( pMem + nSize );
453*cdf0e10cSrcweir }
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir /*************************************************************************
457*cdf0e10cSrcweir |*
458*cdf0e10cSrcweir |*	  RscWriteRc :: Put()
459*cdf0e10cSrcweir |*
460*cdf0e10cSrcweir |*	  Beschreibung
461*cdf0e10cSrcweir |*	  Ersterstellung	MM 15.04.91
462*cdf0e10cSrcweir |*	  Letzte Aenderung	MM 15.04.91
463*cdf0e10cSrcweir |*
464*cdf0e10cSrcweir *************************************************************************/
465*cdf0e10cSrcweir void RscWriteRc :: Put( sal_uInt16 nVal )
466*cdf0e10cSrcweir {
467*cdf0e10cSrcweir 	sal_uInt32	nOldLen;
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir 	nOldLen = IncSize( sizeof( nVal ) );
470*cdf0e10cSrcweir 	PutAt( nOldLen, nVal );
471*cdf0e10cSrcweir }
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir void RscWriteRc :: PutUTF8( char * pStr )
474*cdf0e10cSrcweir {
475*cdf0e10cSrcweir 	sal_uInt32 nStrLen = 0;
476*cdf0e10cSrcweir 	if( pStr )
477*cdf0e10cSrcweir 		nStrLen = strlen( pStr );
478*cdf0e10cSrcweir 
479*cdf0e10cSrcweir 	sal_uInt32	n = nStrLen +1;
480*cdf0e10cSrcweir 	if( n % 2 )
481*cdf0e10cSrcweir 		// align to 2
482*cdf0e10cSrcweir 		n++;
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir 	sal_uInt32	nOldLen = IncSize( n );
485*cdf0e10cSrcweir 	rtl_copyMemory( GetPointer( nOldLen ), pStr, nStrLen );
486*cdf0e10cSrcweir 	// 0 terminated
487*cdf0e10cSrcweir 	pMem[ nOldLen + nStrLen ] = '\0';
488*cdf0e10cSrcweir }
489