blob: 496466f80f3657d166250cf95025ca6d20fe2399 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_rsc.hxx"
/****************** I N C L U D E S **************************************/
// C and C++ Includes.
#include <stdlib.h>
#include <stdio.h>
#if defined (WNT )
#include <direct.h>
#endif
#if defined ( OS2 ) && !defined ( GCC )
#include <direct.h>
#endif
#include <string.h>
#include <ctype.h>
#include <tools/fsys.hxx>
// Include
#include <rscdef.hxx>
#include <rsctools.hxx>
#include <osl/file.h>
#include <rtl/alloc.h>
#include <rtl/memory.h>
using namespace rtl;
/****************** C o d e **********************************************/
/*************************************************************************
|*
|* rsc_strnicmp()
|*
|* Beschreibung Vergleicht zwei Strings Case-Unabhaengig bis zu
|* einer bestimmten Laenge
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
int rsc_strnicmp( const char *string1, const char *string2, size_t count )
{
size_t i;
for( i = 0; ( i < count ) && string1[ i ] && string2[ i ] ; i++ )
{
if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
return( -1 );
else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
return( 1 );
}
if( i == count )
return( 0 );
else if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
return( -1 );
else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
return( 1 );
return( 0 );
}
/*************************************************************************
|*
|* rsc_strnicmp()
|*
|* Beschreibung Vergleicht zwei Strings Case-Unabhaengig
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
int rsc_stricmp( const char *string1, const char *string2 ){
int i;
for( i = 0; string1[ i ] && string2[ i ]; i++ ){
if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
return( -1 );
else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
return( 1 );
}
if( tolower( string1[ i ] ) < tolower( string2[ i ] ) )
return( -1 );
else if( tolower( string1[ i ] ) > tolower( string2[ i ] ) )
return( 1 );
return( 0 );
}
char* rsc_strdup( const char* pStr )
{
int nLen = strlen( pStr );
char* pBuffer = (char*)rtl_allocateMemory( nLen+1 );
rtl_copyMemory( pBuffer, pStr, nLen+1 );
return pBuffer;
}
/*************************************************************************
|*
|* GetTmpFileName()
|*
|* Beschreibung Gibt einen String eines eindeutigen Dateinamens
|* zurueck. Der Speicher fuer den String wird mit
|* malloc allokiert
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MH 13.10.97
|*
*************************************************************************/
ByteString GetTmpFileName()
{
OUString aTmpURL, aTmpFile;
osl_createTempFile( NULL, NULL, &aTmpURL.pData );
osl_getSystemPathFromFileURL( aTmpURL.pData, &aTmpFile.pData );
return OUStringToOString( aTmpFile, RTL_TEXTENCODING_MS_1252 );
}
/********************************************************************/
/* */
/* Function : Append( ) */
/* */
/* Parameters : psw - pointer to a preprocessor switch */
/* */
/* Description : appends text files */
/********************************************************************/
sal_Bool Append( FILE * fDest, ByteString aTmpFile )
{
#define MAX_BUF 4096
char szBuf[ MAX_BUF ];
int nItems;
FILE *fSource;
fSource = fopen( aTmpFile.GetBuffer(), "rb" );
if( !fDest || !fSource ){
if( fSource )
fclose( fSource );
return sal_False;
}
else{
do{ // append
nItems = fread( szBuf, sizeof( char ), MAX_BUF, fSource );
fwrite( szBuf, sizeof( char ), nItems, fDest );
} while( MAX_BUF == nItems );
fclose( fSource );
};
return sal_True;
}
sal_Bool Append( ByteString aOutputSrs, ByteString aTmpFile )
{
FILE * fDest = fopen( aOutputSrs.GetBuffer(), "ab" );
sal_Bool bRet = Append( fDest, aTmpFile );
if( fDest )
fclose( fDest );
return bRet;
}
/*************************************************************************
|*
|* InputFile
|*
|* Beschreibung Haengt Extension an, wenn keine da ist
|* Parameter: pInput, der Input-Dateiname.
|* pExt, die Extension des Ausgabenamens
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 28.06.91
|*
*************************************************************************/
ByteString InputFile ( const char * pInput, const char * pExt )
{
UniString aUniInput( pInput, RTL_TEXTENCODING_ASCII_US );
DirEntry aFileName( aUniInput );
if ( 0 == aFileName.GetExtension().Len() )
{
UniString aExt( pExt, RTL_TEXTENCODING_ASCII_US );
aFileName.SetExtension( aExt );
}
return ByteString( aFileName.GetFull(), RTL_TEXTENCODING_ASCII_US );
}
/*************************************************************************
|*
|* OutputFile
|*
|* Beschreibung Ersetzt Extension durch eine andere
|* Parameter: input, der Input-Dateiname.
|* pExt, die Extension des Ausgabenamens
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 28.06.91
|*
*************************************************************************/
ByteString OutputFile ( ByteString aInput, const char * pExt )
{
UniString aUniInput( aInput, RTL_TEXTENCODING_ASCII_US );
DirEntry aFileName( aUniInput );
UniString aExt( pExt, RTL_TEXTENCODING_ASCII_US );
aFileName.SetExtension( aExt );
return ByteString( aFileName.GetFull(), RTL_TEXTENCODING_ASCII_US );
}
/*************************************************************************
|*
|* ::ResonseFile()
|*
|* Beschreibung Kommandozeile aufbereiten
|* Ersterstellung MM 05.09.91
|* Letzte Aenderung MM 05.09.91
|*
*************************************************************************/
char * ResponseFile( RscPtrPtr * ppCmd, char ** ppArgv, sal_uInt32 nArgc )
{
FILE *fFile;
int nItems;
char szBuffer[4096]; // file buffer
sal_uInt32 i;
bool bInQuotes = false;
// Programmname
ppCmd->Append( rsc_strdup( *ppArgv ) );
for( i = 1; i < nArgc; i++ )
{
if( '@' == **(ppArgv +i) ){ // wenn @, dann Response-Datei
if( NULL == (fFile = fopen( (*(ppArgv +i)) +1, "r" )) )
return( (*(ppArgv +i)) );
nItems = fread( &szBuffer[ 0 ], 1, sizeof( char ), fFile );
while( nItems )
{
if( !isspace( szBuffer[ 0 ] ) )
{
/*
* #i27914# double ticks '"' now have a duplicate function:
* 1. they define a string ( e.g. -DFOO="baz" )
* 2. a string can contain spaces, so -DFOO="baz zum" defines one
* argument no two !
*/
unsigned int n = 0;
while( nItems && (!isspace( szBuffer[ n ] ) || bInQuotes) &&
n +1 < sizeof( szBuffer ) )
{
n++;
nItems = fread( &szBuffer[ n ], 1,
sizeof( char ), fFile );
if( szBuffer[n] == '"' )
bInQuotes = !bInQuotes;
}
szBuffer[ n ] = '\0';
ppCmd->Append( rsc_strdup( szBuffer ) );
}
nItems = fread( &szBuffer[ 0 ], 1, sizeof( char ), fFile );
};
fclose( fFile );
}
else
ppCmd->Append( rsc_strdup( *(ppArgv +i) ) );
};
ppCmd->Append( (void *)0 );
return( NULL );
}
/*************** R s c P t r P t r **************************************/
/*************************************************************************
|*
|* RscPtrPtr :: RscPtrPtr()
|*
|* Beschreibung Eine Tabelle mit Zeigern
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
RscPtrPtr :: RscPtrPtr(){
nCount = 0;
pMem = NULL;
}
/*************************************************************************
|*
|* RscPtrPtr :: ~RscPtrPtr()
|*
|* Beschreibung Zerst�rt eine Tabelle mit Zeigern, die Zeiger werde
|* ebenfalls freigegebn
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
RscPtrPtr :: ~RscPtrPtr(){
Reset();
}
/*************************************************************************
|*
|* RscPtrPtr :: Reset()
|*
|* Beschreibung
|* Ersterstellung MM 03.05.91
|* Letzte Aenderung MM 03.05.91
|*
*************************************************************************/
void RscPtrPtr :: Reset(){
sal_uInt32 i;
if( pMem ){
for( i = 0; i < nCount; i++ ){
if( pMem[ i ] )
rtl_freeMemory( pMem[ i ] );
}
rtl_freeMemory( (void *)pMem );
};
nCount = 0;
pMem = NULL;
}
/*************************************************************************
|*
|* RscPtrPtr :: Append()
|*
|* Beschreibung Haengt einen Eintrag an.
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
sal_uInt32 RscPtrPtr :: Append( void * pBuffer ){
if( !pMem )
pMem = (void **)rtl_allocateMemory( (nCount +1) * sizeof( void * ) );
else
pMem = (void **)rtl_reallocateMemory( (void *)pMem,
((nCount +1) * sizeof( void * )
) );
pMem[ nCount ] = pBuffer;
return( nCount++ );
}
/*************************************************************************
|*
|* RscPtrPtr :: GetEntry()
|*
|* Beschreibung Liefert einen Eintrag, NULL wenn nicht vorhanden.
|* Ersterstellung MM 13.02.91
|* Letzte Aenderung MM 13.02.91
|*
*************************************************************************/
void * RscPtrPtr :: GetEntry( sal_uInt32 nEntry ){
if( nEntry < nCount )
return( pMem[ nEntry ] );
return( NULL );
}
/****************** R S C W R I T E R C **********************************/
/*************************************************************************
|*
|* RscWriteRc :: RscWriteRc()
|*
|* Beschreibung
|* Ersterstellung MM 15.04.91
|* Letzte Aenderung MM 15.04.91
|*
*************************************************************************/
RscWriteRc::RscWriteRc( RSCBYTEORDER_TYPE nOrder )
{
short nSwapTest = 1;
RSCBYTEORDER_TYPE nMachineOrder;
bSwap = sal_False;
if( nOrder != RSC_SYSTEMENDIAN )
{
if( (sal_uInt8)*(sal_uInt8 *)&nSwapTest )
nMachineOrder = RSC_LITTLEENDIAN;
else
nMachineOrder = RSC_BIGENDIAN;
bSwap = nOrder != nMachineOrder;
}
nByteOrder = nOrder;
nLen = 0;
pMem = NULL;
}
/*************************************************************************
|*
|* RscWriteRc :: ~RscWriteRc()
|*
|* Beschreibung
|* Ersterstellung MM 15.04.91
|* Letzte Aenderung MM 15.04.91
|*
*************************************************************************/
RscWriteRc :: ~RscWriteRc()
{
if( pMem )
rtl_freeMemory( pMem );
}
/*************************************************************************
|*
|* RscWriteRc :: IncSize()
|*
|* Beschreibung
|* Ersterstellung MM 15.04.91
|* Letzte Aenderung MM 15.04.91
|*
*************************************************************************/
sal_uInt32 RscWriteRc :: IncSize( sal_uInt32 nSize )
{
nLen += nSize;
if( pMem )
pMem = (char*)rtl_reallocateMemory( pMem, nLen );
return( nLen - nSize );
}
/*************************************************************************
|*
|* RscWriteRc :: GetPointer()
|*
|* Beschreibung
|* Ersterstellung MM 15.04.91
|* Letzte Aenderung MM 15.04.91
|*
*************************************************************************/
char * RscWriteRc :: GetPointer( sal_uInt32 nSize )
{
if( !pMem )
pMem = (char *)rtl_allocateMemory( nLen );
return( pMem + nSize );
}
/*************************************************************************
|*
|* RscWriteRc :: Put()
|*
|* Beschreibung
|* Ersterstellung MM 15.04.91
|* Letzte Aenderung MM 15.04.91
|*
*************************************************************************/
void RscWriteRc :: Put( sal_uInt16 nVal )
{
sal_uInt32 nOldLen;
nOldLen = IncSize( sizeof( nVal ) );
PutAt( nOldLen, nVal );
}
void RscWriteRc :: PutUTF8( char * pStr )
{
sal_uInt32 nStrLen = 0;
if( pStr )
nStrLen = strlen( pStr );
sal_uInt32 n = nStrLen +1;
if( n % 2 )
// align to 2
n++;
sal_uInt32 nOldLen = IncSize( n );
rtl_copyMemory( GetPointer( nOldLen ), pStr, nStrLen );
// 0 terminated
pMem[ nOldLen + nStrLen ] = '\0';
}