3 osrfList* osrfNewList() {
4 osrfList* list = safe_malloc(sizeof(osrfList));
7 list->arrsize = OSRF_LIST_DEFAULT_SIZE;
8 list->arrlist = safe_malloc( list->arrsize * sizeof(void*) );
13 int osrfListPush( osrfList* list, void* item ) {
14 if(!(list)) return -1;
15 osrfListSet( list, item, list->size );
19 void* osrfListSet( osrfList* list, void* item, unsigned int position ) {
20 if(!list || position < 0) return NULL;
23 int newsize = list->arrsize;
26 while( position >= newsize )
27 newsize += OSRF_LIST_INC_SIZE;
29 if( newsize > list->arrsize ) { /* expand the list if necessary */
30 newarr = safe_malloc( newsize * sizeof(void*) );
31 for( i = 0; i < list->arrsize; i++ )
32 newarr[i] = list->arrlist[i];
34 list->arrlist = newarr;
35 list->arrsize = newsize;
38 void* olditem = osrfListRemove( list, position );
39 list->arrlist[position] = item;
40 if( list->size == 0 || list->size <= position )
41 list->size = position + 1;
46 void* osrfListGetIndex( osrfList* list, unsigned int position ) {
47 if(!list || position >= list->size) return NULL;
48 return list->arrlist[position];
51 void osrfListFree( osrfList* list ) {
54 if( list->freeItem ) {
56 for( i = 0; i < list->size; i++ ) {
57 if( (val = list->arrlist[i]) )
66 void* osrfListRemove( osrfList* list, int position ) {
67 if(!list || position >= list->size) return NULL;
69 void* olditem = list->arrlist[position];
70 list->arrlist[position] = NULL;
71 if( list->freeItem ) {
72 list->freeItem(olditem);
76 if( position == list->size - 1 ) list->size--;
81 int osrfListFind( osrfList* list, void* addr ) {
82 if(!(list && addr)) return -1;
84 for( index = 0; index < list->size; index++ ) {
85 if( list->arrlist[index] == addr )
92 unsigned int osrfListGetCount( osrfList* list ) {
98 void* osrfListPop( osrfList* list ) {
99 if(!list) return NULL;
100 return osrfListRemove( list, list->size - 1 );
104 osrfListIterator* osrfNewListIterator( osrfList* list ) {
105 if(!list) return NULL;
106 osrfListIterator* itr = safe_malloc(sizeof(osrfListIterator));
112 void* osrfListIteratorNext( osrfListIterator* itr ) {
113 if(!(itr && itr->list)) return NULL;
114 if(itr->current >= itr->list->size) return NULL;
115 return itr->list->arrlist[itr->current++];
118 void osrfListIteratorFree( osrfListIterator* itr ) {
124 void osrfListIteratorReset( osrfListIterator* itr ) {
130 void osrfListVanillaFree( void* item ) {
134 void osrfListSetDefaultFree( osrfList* list ) {
136 list->freeItem = osrfListVanillaFree;