1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include <config.h>
#include "lst.h"
HLST lstOpenCursor( HLST hBase, int (*pFilterFunc)( HLST, void * ), void *pExtras )
{
HLST hLst = NULL;
if ( !hBase )
return NULL;
/*************************
* CREATE A NEW LIST
*************************/
hLst = lstOpen();
if ( !hLst )
return NULL;
hBase->nRefs++;
hLst->pFilter = pFilterFunc;
hLst->pFree = NULL; /* never free pData in a cursor */
hLst->pExtras = pExtras;
/*************************
* ADD ITEMS FROM hBase (skipping any bDelete items)
*************************/
lstFirst( hBase );
if ( pFilterFunc )
{
while ( !lstEOL( hBase ) )
{
if ( pFilterFunc( hLst, lstGet( hBase ) ) )
lstAppend( hLst, hBase->hCurrent );
lstNext( hBase );
}
}
else
{
while ( !lstEOL( hBase ) )
{
lstAppend( hLst, hBase->hCurrent );
lstNext( hBase );
}
}
/*************************
* THIS *MUST* BE DONE AFTER THE LIST IS LOADED
* OTHERWISE lstAppend() WILL APPEND INTO ROOT LIST AND MAKE A REF IN THIS LIST
*************************/
hLst->hLstBase = hBase;
return hLst;
}
|