205 lines
4.9 KiB
C++
205 lines
4.9 KiB
C++
/*****************************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1999 **/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************
|
|
File : idict.hxx
|
|
Title : index based dictionary simulation
|
|
History :
|
|
04-Aug-1991 VibhasC Created
|
|
|
|
*****************************************************************************/
|
|
|
|
#pragma warning ( disable : 4514 4710 )
|
|
|
|
/****************************************************************************
|
|
local defines and includes
|
|
****************************************************************************/
|
|
#include "nulldefs.h"
|
|
extern "C" {
|
|
#include <stdio.h>
|
|
|
|
}
|
|
#include "idict.hxx"
|
|
|
|
/****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
idict class implementation
|
|
****************************************************************************/
|
|
IDICT::IDICT(
|
|
short InitialSize,
|
|
short Increment )
|
|
{
|
|
IDICTELEMENT * pNewArray = new
|
|
IDICTELEMENT [ InitialSize ];
|
|
iNextIndex = 0;
|
|
CurrentSize = InitialSize;
|
|
IDictIncrement = Increment;
|
|
SetArray( pNewArray );
|
|
}
|
|
|
|
/****************************************************************************
|
|
SetElement:
|
|
Set the element in the array to the value that is passed in
|
|
****************************************************************************/
|
|
void
|
|
IDICT::SetElement(
|
|
IDICTKEY Key,
|
|
IDICTELEMENT Element )
|
|
{
|
|
if( Key < iNextIndex )
|
|
{
|
|
pArray[ Key ] = Element;
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
SetNewElement:
|
|
Set the new element in the array to the value that is passed in
|
|
****************************************************************************/
|
|
IDICTKEY
|
|
IDICT::SetNewElement(
|
|
IDICTELEMENT Element )
|
|
{
|
|
pArray[ iNextIndex ] = Element;
|
|
return iNextIndex++;
|
|
}
|
|
|
|
/****************************************************************************
|
|
ExpandArray:
|
|
Expand the array to accomodate more elements coming in.
|
|
****************************************************************************/
|
|
void
|
|
IDICT::ExpandArray()
|
|
{
|
|
IDICTELEMENT * pOldArray = GetArray();
|
|
IDICTELEMENT * pNewArray = new
|
|
IDICTELEMENT [(CurrentSize+IDictIncrement)];
|
|
int iIndex = 0;
|
|
|
|
//.. pOldArray moves, so we need pTemp to mark the beginning
|
|
|
|
IDICTELEMENT * pTemp = pOldArray;
|
|
|
|
SetArray( pNewArray );
|
|
CurrentSize = short( CurrentSize + IDictIncrement );
|
|
|
|
if( pOldArray )
|
|
{
|
|
while( iIndex++ < iNextIndex )
|
|
{
|
|
*pNewArray++ = *pOldArray++;
|
|
}
|
|
}
|
|
|
|
delete pTemp;
|
|
}
|
|
/***************************************************************************
|
|
GetElement:
|
|
return the element pointed to by the KEY (index)
|
|
***************************************************************************/
|
|
IDICTELEMENT
|
|
IDICT::GetElement(
|
|
IDICTKEY Key )
|
|
{
|
|
IDICTELEMENT * pArray = GetArray();
|
|
|
|
if( pArray && ( Key < iNextIndex ) )
|
|
return pArray[ Key ];
|
|
return (IDICTELEMENT) 0;
|
|
}
|
|
/***************************************************************************
|
|
IsElementPresent:
|
|
return the element pointed to by the KEY (index)
|
|
***************************************************************************/
|
|
BOOL
|
|
IDICT::IsElementPresent(
|
|
IDICTELEMENT Element )
|
|
{
|
|
IDICTELEMENT * pArray = GetArray();
|
|
short iIndex;
|
|
|
|
if( pArray )
|
|
{
|
|
for( iIndex = 0; iIndex < iNextIndex; ++iIndex )
|
|
{
|
|
if( pArray[ iIndex ] == Element )
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
/***************************************************************************
|
|
AddElement:
|
|
Basically SetNewElement, with checks for needed expansion. Notice how the
|
|
array pointer is never accessed in this routine directly. This is becuase
|
|
ExpandArray can potentially change the array underneath. So after evry
|
|
expand call, must make sure that any local pointers to the array are
|
|
updated.
|
|
***************************************************************************/
|
|
IDICTKEY
|
|
IDICT::AddElement(
|
|
IDICTELEMENT pNew )
|
|
{
|
|
if( iNextIndex >= CurrentSize )
|
|
{
|
|
ExpandArray();
|
|
}
|
|
return SetNewElement( pNew );
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
ISTACK::ISTACK(
|
|
short MaxDepth )
|
|
{
|
|
InitNew( MaxDepth );
|
|
CurrentElement = 0;
|
|
}
|
|
|
|
void
|
|
ISTACK::InitNew(
|
|
short MaxDepth )
|
|
{
|
|
MaxElements = MaxDepth;
|
|
pStack = new IDICTELEMENT[ MaxElements ];
|
|
}
|
|
|
|
IDICTELEMENT
|
|
ISTACK::Push(
|
|
IDICTELEMENT Element )
|
|
{
|
|
|
|
if( CurrentElement == MaxElements )
|
|
{
|
|
int i;
|
|
IDICTELEMENT (*pStackOld);
|
|
|
|
pStackOld = pStack;
|
|
InitNew( short( MaxElements + 10 ) );
|
|
|
|
for( i = 0;
|
|
i < CurrentElement;
|
|
++i )
|
|
{
|
|
pStack[ i ] = pStackOld[ i ];
|
|
}
|
|
|
|
delete pStackOld;
|
|
|
|
}
|
|
|
|
pStack[ CurrentElement++ ] = Element;
|
|
|
|
return Element;
|
|
|
|
}
|
|
|
|
IDICTELEMENT
|
|
ISTACK::Pop()
|
|
{
|
|
MIDL_ASSERT( CurrentElement != 0 );
|
|
return pStack[ --CurrentElement ];
|
|
}
|