blob: e31f6fc418f271d1c4689c05dc5f88096ea71cb1 [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 **************************************/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <rscall.h>
#include <rsctools.hxx>
#include <rschash.hxx>
#include <rsckey.hxx>
#if defined(_MSC_VER) && (_MSC_VER >= 1200 )
#define _cdecl __cdecl
#endif
/****************** C o d e **********************************************/
/****************** keyword sort function ********************************/
extern "C" {
#if defined( ZTC ) && defined( PM2 )
int __CLIB KeyCompare( const void * pFirst, const void * pSecond );
#else
#if defined( WNT ) && !defined( WTC ) && !defined (ICC)
int _cdecl KeyCompare( const void * pFirst, const void * pSecond );
#else
int KeyCompare( const void * pFirst, const void * pSecond );
#endif
#endif
}
#if defined( WNT ) && !defined( WTC ) && !defined(ICC)
int _cdecl KeyCompare( const void * pFirst, const void * pSecond ){
#else
int KeyCompare( const void * pFirst, const void * pSecond ){
#endif
if( ((KEY_STRUCT *)pFirst)->nName > ((KEY_STRUCT *)pSecond)->nName )
return( 1 );
else if( ((KEY_STRUCT *)pFirst)->nName < ((KEY_STRUCT *)pSecond)->nName )
return( -1 );
else
return( 0 );
}
/*************************************************************************
|*
|* RscNameTable::RscNameTable()
|*
|* Beschreibung RES.DOC
|* Ersterstellung MM 28.02.91
|* Letzte Aenderung MM 28.02.91
|*
*************************************************************************/
RscNameTable::RscNameTable() {
bSort = sal_True;
nEntries = 0;
pTable = NULL;
};
/*************************************************************************
|*
|* RscNameTable::~RscNameTable()
|*
|* Beschreibung
|* Ersterstellung MM 15.05.91
|* Letzte Aenderung MM 15.05.91
|*
*************************************************************************/
RscNameTable::~RscNameTable() {
if( pTable )
rtl_freeMemory( pTable );
};
/*************************************************************************
|*
|* RscNameTable::SetSort()
|*
|* Beschreibung RES.DOC
|* Ersterstellung MM 28.02.91
|* Letzte Aenderung MM 28.02.91
|*
*************************************************************************/
void RscNameTable::SetSort( sal_Bool bSorted ){
bSort = bSorted;
if( bSort && pTable){
// Schluesselwort Feld sortieren
qsort( (void *)pTable, nEntries,
sizeof( KEY_STRUCT ), KeyCompare );
};
};
/*************************************************************************
|*
|* RscNameTable::Put()
|*
|* Beschreibung RES.DOC
|* Ersterstellung MM 28.02.91
|* Letzte Aenderung MM 28.02.91
|*
*************************************************************************/
Atom RscNameTable::Put( Atom nName, sal_uInt32 nTyp, long nValue ){
if( pTable )
pTable = (KEY_STRUCT *)
rtl_reallocateMemory( (void *)pTable,
((nEntries +1) * sizeof( KEY_STRUCT )) );
else
pTable = (KEY_STRUCT *)
rtl_allocateMemory( ((nEntries +1)
* sizeof( KEY_STRUCT )) );
pTable[ nEntries ].nName = nName;
pTable[ nEntries ].nTyp = nTyp;
pTable[ nEntries ].yylval = nValue;
nEntries++;
if( bSort )
SetSort();
return( nName );
};
Atom RscNameTable::Put( const char * pName, sal_uInt32 nTyp, long nValue )
{
return( Put( pHS->getID( pName ), nTyp, nValue ) );
};
Atom RscNameTable::Put( Atom nName, sal_uInt32 nTyp )
{
return( Put( nName, nTyp, (long)nName ) );
};
Atom RscNameTable::Put( const char * pName, sal_uInt32 nTyp )
{
Atom nId;
nId = pHS->getID( pName );
return( Put( nId, nTyp, (long)nId ) );
};
Atom RscNameTable::Put( Atom nName, sal_uInt32 nTyp, RscTop * pClass )
{
return( Put( nName, nTyp, (long)pClass ) );
};
Atom RscNameTable::Put( const char * pName, sal_uInt32 nTyp, RscTop * pClass )
{
return( Put( pHS->getID( pName ), nTyp, (long)pClass ) );
};
/*************************************************************************
|*
|* RscNameTable::Get()
|*
|* Beschreibung RES.DOC
|* Ersterstellung MM 28.02.91
|* Letzte Aenderung MM 28.02.91
|*
*************************************************************************/
sal_Bool RscNameTable::Get( Atom nName, KEY_STRUCT * pEle ){
KEY_STRUCT * pKey = NULL;
KEY_STRUCT aSearchName;
sal_uInt32 i;
if( bSort ){
// Suche nach dem Schluesselwort
aSearchName.nName = nName;
pKey = (KEY_STRUCT *)bsearch(
#ifdef UNX
(const char *) &aSearchName, (char *)pTable,
#else
(const void *) &aSearchName, (const void *)pTable,
#endif
nEntries, sizeof( KEY_STRUCT ), KeyCompare );
}
else{
i = 0;
while( i < nEntries && !pKey ){
if( pTable[ i ].nName == nName )
pKey = &pTable[ i ];
i++;
};
};
if( pKey ){ // Schluesselwort gefunden
*pEle = *pKey;
return( sal_True );
};
return( sal_False );
};