init ems server code
This commit is contained in:
199
plat/public/src/bisearch.c
Normal file
199
plat/public/src/bisearch.c
Normal file
@@ -0,0 +1,199 @@
|
||||
|
||||
/******************************************/
|
||||
/*Title : bisearch.h */
|
||||
/*Descr : BiSearch arithmetic implement */
|
||||
/*Author : Liu Wei */
|
||||
/*Create : 2006-12-13 */
|
||||
/*Version : R1V00_01 */
|
||||
/*Modify : 2006-12-13 */
|
||||
/******************************************/
|
||||
#include "memory.h"
|
||||
#include "malloc.h"
|
||||
#include "stdlib.h"
|
||||
#include "./include/bisearch.h"
|
||||
|
||||
/*@ignore@*/
|
||||
|
||||
int BISearchReg ( BiSearchArray *pBSA, int nTotalSize , void *GetIdleNodeFunc )
|
||||
{
|
||||
if( pBSA == NULL )
|
||||
exit(0);
|
||||
memset( pBSA , 0 , sizeof(BiSearchArray) );
|
||||
pBSA->nArrayCount = 0;
|
||||
pBSA->nArrayTotalLen = nTotalSize;
|
||||
pBSA->pBiArray = malloc( sizeof(BiSearch)*nTotalSize );
|
||||
memset ( pBSA->pBiArray, 0, BS_SIZE * nTotalSize );
|
||||
pBSA->GetIdleNodeFunc = (int (*)(int *))GetIdleNodeFunc;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int BISearchUnReg ( BiSearchArray * pBSA)
|
||||
{
|
||||
if( pBSA !=NULL && pBSA->pBiArray != NULL )
|
||||
{
|
||||
free(pBSA->pBiArray);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BSearch ( BiSearchArray * pBSA, int nStart, int nEnd, LL llKey, int * nPosResult )
|
||||
{
|
||||
BiSearch *pArray ;
|
||||
int nPos = -1;
|
||||
|
||||
if( pBSA == NULL )
|
||||
|
||||
return 0;
|
||||
if( nStart < 0 || nEnd < 0 || nStart > nEnd || pBSA->nArrayCount < nStart )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
pArray = pBSA->pBiArray;
|
||||
if( !pBSA->nArrayCount )
|
||||
return (*nPosResult = 0);
|
||||
if( nEnd > pBSA->nArrayCount-1 )
|
||||
nEnd = pBSA->nArrayCount-1;
|
||||
|
||||
for ( nPos = nStart; nStart <= nEnd; nPos = ( nStart + nEnd ) / 2 )
|
||||
{
|
||||
if( pArray[nPos].llKey == llKey )
|
||||
{
|
||||
*nPosResult = nPos;
|
||||
return 1;
|
||||
}
|
||||
if( pArray[nPos].llKey > llKey )
|
||||
{
|
||||
nEnd = nPos - 1;
|
||||
}
|
||||
if( pArray[nPos].llKey < llKey )
|
||||
{
|
||||
nStart = nPos + 1;
|
||||
}
|
||||
}
|
||||
if( nPos != -1 && pArray[nPos].llKey < llKey )
|
||||
nPos++;
|
||||
*nPosResult = nPos;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BSearchArray ( BiSearchArray * pBSA, LL llKey, int *nPosResult )
|
||||
{
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
return BSearch ( pBSA, 0, (pBSA->nArrayCount > 0 ? pBSA->nArrayCount-1 : 0), llKey, nPosResult );
|
||||
}
|
||||
|
||||
int BISInsert ( BiSearchArray * pBSA, LL llKey, int nDUPosIndex )
|
||||
{
|
||||
int nPos = -1;
|
||||
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
//memery protect: Data Unit Index exceed Data Unit Array Length
|
||||
if( nDUPosIndex > pBSA->nArrayTotalLen || nDUPosIndex < 0)
|
||||
return 0;
|
||||
|
||||
if( pBSA->nArrayCount >= pBSA->nArrayTotalLen ) //Array Full
|
||||
return 0;
|
||||
|
||||
if( !BSearchArray ( pBSA , llKey, &nPos ) && nPos != -1 )
|
||||
{
|
||||
BiSearch *pBS = pBSA->pBiArray + nPos ;
|
||||
|
||||
memmove ( pBS + 1, pBS , BS_SIZE * ( pBSA->nArrayCount - nPos ) );
|
||||
pBS->llKey = llKey;
|
||||
pBS->nDUPosIndex = nDUPosIndex;
|
||||
pBSA->nArrayCount++;
|
||||
return 1;
|
||||
|
||||
}
|
||||
//The Key is existed, insert fail.
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BISDelete ( BiSearchArray * pBSA, LL llKey )
|
||||
{
|
||||
int nPos = -1;
|
||||
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
if( pBSA->nArrayCount <= 0 )
|
||||
return 0;
|
||||
|
||||
if( BSearchArray ( pBSA ,llKey, &nPos ) )
|
||||
{
|
||||
BiSearch *pBS = pBSA->pBiArray + nPos;
|
||||
|
||||
memmove ( pBS, pBS + 1, BS_SIZE * ( pBSA->nArrayCount - nPos ) );
|
||||
memset ( pBSA->pBiArray + pBSA->nArrayCount, 0, BS_SIZE );
|
||||
pBSA->nArrayCount--;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BISSearch ( BiSearchArray * pBSA, LL llKey , int* nDUPosIndex)
|
||||
{
|
||||
int nPos = -1;
|
||||
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
if( BSearchArray ( pBSA ,llKey, &nPos ) )
|
||||
{
|
||||
*nDUPosIndex = pBSA->pBiArray[nPos].nDUPosIndex;
|
||||
if( *nDUPosIndex > pBSA->nArrayTotalLen )
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int GetBISearchCount ( BiSearchArray * pBSA)
|
||||
{
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
return pBSA->nArrayCount;
|
||||
}
|
||||
|
||||
int GetDUIndex ( BiSearchArray * pBSA, int nBIIndex)
|
||||
{
|
||||
if( pBSA == NULL )
|
||||
return 0;
|
||||
|
||||
if( nBIIndex >= pBSA->nArrayCount )
|
||||
return -1;
|
||||
else
|
||||
return pBSA->pBiArray[nBIIndex].nDUPosIndex;
|
||||
}
|
||||
|
||||
int BISSearchMng( BiSearchArray * pBSA, BIS_OP mng_type,LL llkey, int* nDUIndex )
|
||||
{
|
||||
switch( mng_type )
|
||||
{
|
||||
case BIS_INIT:
|
||||
return BISInsert( pBSA , llkey , *nDUIndex );
|
||||
case BIS_SEARCH:
|
||||
return BISSearch( pBSA , llkey , nDUIndex );
|
||||
case BIS_INSERT:
|
||||
if( pBSA->GetIdleNodeFunc != NULL && pBSA->GetIdleNodeFunc( nDUIndex ) )
|
||||
return BISInsert( pBSA , llkey , *nDUIndex );
|
||||
break;
|
||||
case BIS_DELETE:
|
||||
return BISDelete( pBSA, llkey);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*@end@*/
|
||||
|
||||
Reference in New Issue
Block a user