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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <config.h>
#include "lst.h"
int _lstDeleteFlag( HLSTITEM hItem );
/***********************
* lstDelete
*
* Do not call unless you want to delete the item
* from the cursor (if the list is one) **AND** the
* root list. In other words; this should not be
* called from functions such as lstClose() which
* desire to simply free memory used by a specific
* the list.
*
* This is the only function to set bDelete in the root
* item (as required).
*
* lstFreeItem will decrement ref counters and do a real
* delete when refs are 0.
************************/
int lstDelete( HLST hLst )
{
HLSTITEM hItem = NULL;
HLSTITEM hItemRoot = NULL;
if ( !hLst )
return LST_ERROR;
hItem = hLst->hCurrent;
if ( !hItem )
return LST_ERROR;
/*********************
* ARE WE A CURSOR LIST
*********************/
if ( hLst->hLstBase )
{
hItemRoot = (HLSTITEM)hItem->pData;
_lstDeleteFlag( hItemRoot );
return _lstFreeItem( hItem );
}
/*********************
* WE ARE root LIST. CHECK FOR REFS BEFORE CALLING FREE
*********************/
_lstDeleteFlag( hItem );
if ( hItem->nRefs < 1 )
return _lstFreeItem( hItem );
return LST_SUCCESS;
}
/***************************
* FLAG FOR DELETE (should only be called if root list)
***************************/
int _lstDeleteFlag( HLSTITEM hItem )
{
HLST hLst;
hLst = (HLST)hItem->hLst;
if ( !hItem->bDelete )
hLst->nItems--;
hItem->bDelete = true;
if ( hLst->hCurrent == hItem )
_lstAdjustCurrent( hLst );
return true;
}
|