Updates, etc.

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@357 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
ahodgkinson
2006-04-27 15:59:33 +00:00
parent ba23819e9b
commit eb0f9e82cc
23 changed files with 7737 additions and 8308 deletions

View File

@@ -28,6 +28,15 @@
#define MAX_ELEMENTS_TO_LOAD 0xFFFF
#define MAX_ATTRIBUTES_TO_LOAD 0xFFFF
typedef struct
{
FLMUINT uiType;
FLMUNICODE * puzTagName;
FLMUINT uiTagNum;
FLMUINT uiDataType;
FLMUNICODE * puzNamespace;
} FLM_TAG_INFO;
typedef FLMINT (* TAG_COMPARE_FUNC)(
FLM_TAG_INFO * pTagInfo1,
FLM_TAG_INFO * pTagInfo2);
@@ -51,12 +60,159 @@ FSTATIC void sortTagTbl(
FLMUINT uiUpperBounds,
TAG_COMPARE_FUNC fnTagCompare);
/****************************************************************************
Desc: Class for name/number lookup.
****************************************************************************/
class F_NameTable : public IF_NameTable, public F_Base
{
public:
F_NameTable();
virtual ~F_NameTable();
RCODE FLMAPI setupNameTable( void);
void FLMAPI clearTable(
FLMUINT uiPoolBlkSize);
RCODE FLMAPI getNextTagTypeAndNumOrder(
FLMUINT uiType,
FLMUINT * puiNextPos,
FLMUNICODE * puzTagName = NULL,
char * pszTagName = NULL,
FLMUINT uiNameBufSize = 0,
FLMUINT * puiTagNum = NULL,
FLMUINT * puiDataType = NULL,
FLMUNICODE * puzNamespace = NULL,
FLMUINT uiNamespaceBufSize = 0,
FLMBOOL bTruncatedNamesOk = TRUE);
RCODE FLMAPI getNextTagTypeAndNameOrder(
FLMUINT uiType,
FLMUINT * puiNextPos,
FLMUNICODE * puzTagName = NULL,
char * pszTagName = NULL,
FLMUINT uiNameBufSize = 0,
FLMUINT * puiTagNum = NULL,
FLMUINT * puiDataType = NULL,
FLMUNICODE * puzNamespace = NULL,
FLMUINT uiNamespaceBufSize = 0,
FLMBOOL bTruncatedNamesOk = TRUE);
RCODE FLMAPI getFromTagTypeAndName(
FLMUINT uiType,
const FLMUNICODE * puzTagName,
const char * pszTagName,
FLMBOOL bMatchNamespace,
const FLMUNICODE * puzNamespace = NULL,
FLMUINT * puiTagNum = NULL,
FLMUINT * puiDataType = NULL);
RCODE FLMAPI getFromTagTypeAndNum(
FLMUINT uiType,
FLMUINT uiTagNum,
FLMUNICODE * puzTagName = NULL,
char * pszTagName = NULL,
FLMUINT * puiNameBufSize = NULL,
FLMUINT * puiDataType = NULL,
FLMUNICODE * puzNamespace = NULL,
char * pszNamespace = NULL,
FLMUINT * puiNamespaceBufSize = NULL,
FLMBOOL bTruncatedNamesOk = TRUE);
RCODE FLMAPI addTag(
FLMUINT uiType,
FLMUNICODE * puzTagName,
const char * pszTagName,
FLMUINT uiTagNum,
FLMUINT uiDataType = 0,
FLMUNICODE * puzNamespace = NULL,
FLMBOOL bCheckDuplicates = TRUE);
void FLMAPI removeTag(
FLMUINT uiType,
FLMUINT uiTagNum);
RCODE FLMAPI cloneNameTable(
IF_NameTable * pSrcNameTable);
RCODE FLMAPI importFromNameTable(
IF_NameTable * pSrcNameTable);
FLMINT FLMAPI AddRef( void);
FLMINT FLMAPI Release( void);
private:
void sortTags( void);
RCODE allocTag(
FLMUINT uiType,
FLMUNICODE * puzTagName,
const char * pszTagName,
FLMUINT uiTagNum,
FLMUINT uiDataType,
FLMUNICODE * puzNamespace,
FLM_TAG_INFO ** ppTagInfo);
RCODE reallocSortTables(
FLMUINT uiNewTblSize);
RCODE copyTagName(
FLMUNICODE * puzDestTagName,
char * pszDestTagName,
FLMUINT * puiDestBufSize,
FLMUNICODE * puzSrcTagName,
FLMBOOL bTruncatedNamesOk);
FLM_TAG_INFO * findTagByTypeAndNum(
FLMUINT uiType,
FLMUINT uiTagNum,
FLMUINT * puiInsertPos = NULL);
FLM_TAG_INFO * findTagByTypeAndName(
FLMUINT uiType,
const FLMUNICODE * puzTagName,
const char * pszTagName,
FLMBOOL bMatchNamespace,
const FLMUNICODE * puzNamespace,
FLMBOOL * pbAmbiguous,
FLMUINT * puiInsertPos = NULL);
RCODE insertTagInTables(
FLM_TAG_INFO * pTagInfo,
FLMUINT uiTagTypeAndNameTblInsertPos,
FLMUINT uiTagTypeAndNumTblInsertPos);
FLMUNICODE * findNamespace(
FLMUNICODE * puzNamespace,
FLMUINT * puiInsertPos);
RCODE insertNamespace(
FLMUNICODE * puzNamespace,
FLMUINT uiInsertPos);
IF_Pool * m_pPool;
FLMUINT m_uiMemoryAllocated;
FLM_TAG_INFO ** m_ppSortedByTagTypeAndName;
FLM_TAG_INFO ** m_ppSortedByTagTypeAndNum;
FLMUINT m_uiTblSize;
FLMUINT m_uiNumTags;
FLMBOOL m_bTablesSorted;
FLMUNICODE ** m_ppuzNamespaces;
FLMUINT m_uiNamespaceTblSize;
FLMUINT m_uiNumNamespaces;
F_MUTEX m_hRefMutex;
};
/****************************************************************************
Desc:
****************************************************************************/
F_NameTable::F_NameTable()
{
m_pool.poolInit( 1024);
m_pPool = NULL;
m_uiMemoryAllocated = 0;
m_ppSortedByTagTypeAndName = NULL;
m_ppSortedByTagTypeAndNum = NULL;
@@ -76,6 +232,11 @@ F_NameTable::~F_NameTable()
{
clearTable( 0);
if( m_pPool)
{
m_pPool->Release();
}
if( m_hRefMutex)
{
f_mutexDestroy( &m_hRefMutex);
@@ -88,20 +249,18 @@ Desc: Setup name table. This routine should be called immediately after
****************************************************************************/
RCODE FLMAPI F_NameTable::setupNameTable( void)
{
#ifndef FLM_HAVE_ATOMICS
RCODE rc = NE_FLM_OK;
if( RC_BAD( rc = f_mutexCreate( &m_hRefMutex)))
if( RC_BAD( rc = FlmAllocPool( &m_pPool)))
{
goto Exit;
}
m_pPool->poolInit( 1024);
Exit:
return( rc);
#else
return( NE_FLM_OK);
#endif
}
/****************************************************************************
@@ -110,11 +269,11 @@ Desc: Free everything in the table
void FLMAPI F_NameTable::clearTable(
FLMUINT uiPoolBlkSize)
{
m_pool.poolFree();
m_pPool->poolFree();
if (uiPoolBlkSize)
{
m_pool.poolInit( uiPoolBlkSize);
m_pPool->poolInit( uiPoolBlkSize);
}
m_uiMemoryAllocated = 0;
@@ -996,9 +1155,9 @@ RCODE F_NameTable::allocTag(
// Create a new tag info structure.
pvMark = m_pool.poolMark();
pvMark = m_pPool->poolMark();
uiSaveMemoryAllocated = m_uiMemoryAllocated;
if (RC_BAD( rc = m_pool.poolCalloc( sizeof( FLM_TAG_INFO),
if (RC_BAD( rc = m_pPool->poolCalloc( sizeof( FLM_TAG_INFO),
(void **)&pTagInfo)))
{
goto Exit;
@@ -1010,7 +1169,7 @@ RCODE F_NameTable::allocTag(
if (puzTagName)
{
uiNameSize = (f_unilen( puzTagName) + 1) * sizeof( FLMUNICODE);
if (RC_BAD( rc = m_pool.poolAlloc( uiNameSize,
if (RC_BAD( rc = m_pPool->poolAlloc( uiNameSize,
(void **)&pTagInfo->puzTagName)))
{
goto Exit;
@@ -1021,7 +1180,7 @@ RCODE F_NameTable::allocTag(
else
{
uiNameSize = (f_strlen( pszTagName) + 1) * sizeof( FLMUNICODE);
if (RC_BAD( rc = m_pool.poolAlloc( uiNameSize,
if (RC_BAD( rc = m_pPool->poolAlloc( uiNameSize,
(void **)&pTagInfo->puzTagName)))
{
goto Exit;
@@ -1050,7 +1209,7 @@ RCODE F_NameTable::allocTag(
&uiNamespaceInsertPos)) == NULL)
{
uiNameSize = (f_unilen( puzNamespace) + 1) * sizeof( FLMUNICODE);
if (RC_BAD( rc = m_pool.poolAlloc( uiNameSize,
if (RC_BAD( rc = m_pPool->poolAlloc( uiNameSize,
(void **)&puzTblNamespace)))
{
goto Exit;
@@ -1068,7 +1227,7 @@ RCODE F_NameTable::allocTag(
// allocated if the pool is reset at Exit due to a later
// error.
pvMark = m_pool.poolMark();
pvMark = m_pPool->poolMark();
uiSaveMemoryAllocated = m_uiMemoryAllocated;
}
@@ -1079,7 +1238,7 @@ Exit:
if (RC_BAD( rc))
{
m_pool.poolReset( pvMark);
m_pPool->poolReset( pvMark);
m_uiMemoryAllocated = uiSaveMemoryAllocated;
pTagInfo = NULL;
}