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