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*) );
12 osrfList* osrfNewListSize( unsigned int size ) {
13 osrfList* list = safe_malloc(sizeof(osrfList));
15 list->freeItem = NULL;
17 list->arrlist = safe_malloc( list->arrsize * sizeof(void*) );
22 int osrfListPush( osrfList* list, void* item ) {
23 if(!(list)) return -1;
24 osrfListSet( list, item, list->size );
28 int osrfListPushFirst( osrfList* list, void* item ) {
29 if(!(list && item)) return -1;
31 for( i = 0; i < list->size; i++ )
32 if(!list->arrlist[i]) break;
33 osrfListSet( list, item, i );
37 void* osrfListSet( osrfList* list, void* item, unsigned int position ) {
38 if(!list || position < 0) return NULL;
41 int newsize = list->arrsize;
44 while( position >= newsize )
45 newsize += OSRF_LIST_INC_SIZE;
47 if( newsize > list->arrsize ) { /* expand the list if necessary */
48 newarr = safe_malloc( newsize * sizeof(void*) );
49 for( i = 0; i < list->arrsize; i++ )
50 newarr[i] = list->arrlist[i];
52 list->arrlist = newarr;
53 list->arrsize = newsize;
56 void* olditem = osrfListRemove( list, position );
57 list->arrlist[position] = item;
58 if( list->size == 0 || list->size <= position )
59 list->size = position + 1;
64 void* osrfListGetIndex( osrfList* list, unsigned int position ) {
65 if(!list || position >= list->size) return NULL;
66 return list->arrlist[position];
69 void osrfListFree( osrfList* list ) {
72 if( list->freeItem ) {
74 for( i = 0; i < list->size; i++ ) {
75 if( (val = list->arrlist[i]) )
84 void* osrfListRemove( osrfList* list, int position ) {
85 if(!list || position >= list->size) return NULL;
87 void* olditem = list->arrlist[position];
88 list->arrlist[position] = NULL;
89 if( list->freeItem ) {
90 list->freeItem(olditem);
94 if( position == list->size - 1 ) list->size--;
99 int osrfListFind( osrfList* list, void* addr ) {
100 if(!(list && addr)) return -1;
102 for( index = 0; index < list->size; index++ ) {
103 if( list->arrlist[index] == addr )
110 unsigned int osrfListGetCount( osrfList* list ) {
116 void* osrfListPop( osrfList* list ) {
117 if(!list) return NULL;
118 return osrfListRemove( list, list->size - 1 );
122 osrfListIterator* osrfNewListIterator( osrfList* list ) {
123 if(!list) return NULL;
124 osrfListIterator* itr = safe_malloc(sizeof(osrfListIterator));
130 void* osrfListIteratorNext( osrfListIterator* itr ) {
131 if(!(itr && itr->list)) return NULL;
132 if(itr->current >= itr->list->size) return NULL;
133 return itr->list->arrlist[itr->current++];
136 void osrfListIteratorFree( osrfListIterator* itr ) {
142 void osrfListIteratorReset( osrfListIterator* itr ) {
148 void osrfListVanillaFree( void* item ) {
152 void osrfListSetDefaultFree( osrfList* list ) {
154 list->freeItem = osrfListVanillaFree;