3 osrfList* osrfNewList() {
5 OSRF_MALLOC(list, sizeof(osrfList));
6 list->arrsize = OSRF_LIST_DEFAULT_SIZE;
7 OSRF_MALLOC(list->arrlist, list->arrsize * sizeof(void*));
11 osrfList* osrfNewListSize( unsigned int size ) {
13 OSRF_MALLOC(list, sizeof(osrfList));
14 if( size <= 0 ) size = 16;
16 OSRF_MALLOC( list->arrlist, list->arrsize * sizeof(void*) );
21 int osrfListPush( osrfList* list, void* item ) {
22 if(!(list)) return -1;
23 osrfListSet( list, item, list->size );
27 int osrfListPushFirst( osrfList* list, void* item ) {
28 if(!(list && item)) return -1;
30 for( i = 0; i < list->size; i++ )
31 if(!list->arrlist[i]) break;
32 osrfListSet( list, item, i );
36 void* osrfListSet( osrfList* list, void* item, unsigned int position ) {
37 if(!list || position < 0) return NULL;
40 int newsize = list->arrsize;
43 while( position >= newsize )
44 newsize += OSRF_LIST_INC_SIZE;
46 if( newsize > list->arrsize ) { /* expand the list if necessary */
47 OSRF_MALLOC(newarr, newsize * sizeof(void*));
48 for( i = 0; i < list->arrsize; i++ )
49 newarr[i] = list->arrlist[i];
51 list->arrlist = newarr;
52 list->arrsize = newsize;
55 void* olditem = osrfListRemove( list, position );
56 list->arrlist[position] = item;
57 //if( list->size == 0 || list->size <= position )
58 if( list->size <= position ) list->size = position + 1;
63 void* osrfListGetIndex( osrfList* list, unsigned int position ) {
64 if(!list || position >= list->size) return NULL;
65 return list->arrlist[position];
68 void osrfListFree( osrfList* list ) {
71 if( list->freeItem ) {
73 for( i = 0; i < list->size; i++ ) {
74 if( (val = list->arrlist[i]) )
83 void* osrfListRemove( osrfList* list, int position ) {
84 if(!list || position >= list->size) return NULL;
86 void* olditem = list->arrlist[position];
87 list->arrlist[position] = NULL;
88 if( list->freeItem ) {
89 list->freeItem(olditem);
93 if( position == list->size - 1 ) list->size--;
98 int osrfListFind( osrfList* list, void* addr ) {
99 if(!(list && addr)) return -1;
101 for( index = 0; index < list->size; index++ ) {
102 if( list->arrlist[index] == addr )
109 unsigned int osrfListGetCount( osrfList* list ) {
115 void* osrfListPop( osrfList* list ) {
116 if(!list) return NULL;
117 return osrfListRemove( list, list->size - 1 );
121 osrfListIterator* osrfNewListIterator( osrfList* list ) {
122 if(!list) return NULL;
123 //osrfListIterator* itr = safe_malloc(sizeof(osrfListIterator));
124 osrfListIterator* itr;
125 OSRF_MALLOC(itr, sizeof(osrfListIterator));
131 void* osrfListIteratorNext( osrfListIterator* itr ) {
132 if(!(itr && itr->list)) return NULL;
133 if(itr->current >= itr->list->size) return NULL;
134 return itr->list->arrlist[itr->current++];
137 void osrfListIteratorFree( osrfListIterator* itr ) {
143 void osrfListIteratorReset( osrfListIterator* itr ) {
149 void osrfListVanillaFree( void* item ) {
153 void osrfListSetDefaultFree( osrfList* list ) {
155 list->freeItem = osrfListVanillaFree;