Merged libopensrf source directories (libtransport, libstack, and utils) into a singl...
[OpenSRF.git] / src / libopensrf / osrf_list.c
1 #include <opensrf/osrf_list.h>
2
3 osrfList* osrfNewList() {
4         osrfList* list;
5         OSRF_MALLOC(list, sizeof(osrfList));
6         list->arrsize   = OSRF_LIST_DEFAULT_SIZE;
7         OSRF_MALLOC(list->arrlist, list->arrsize * sizeof(void*));
8         return list;
9 }
10
11 osrfList* osrfNewListSize( unsigned int size ) {
12         osrfList* list;
13         OSRF_MALLOC(list, sizeof(osrfList));
14     if( size <= 0 ) size = 16;
15         list->arrsize   = size;
16         OSRF_MALLOC( list->arrlist, list->arrsize * sizeof(void*) );
17         return list;
18 }
19
20
21 int osrfListPush( osrfList* list, void* item ) {
22         if(!(list)) return -1;
23         osrfListSet( list, item, list->size );
24         return 0;
25 }
26
27 int osrfListPushFirst( osrfList* list, void* item ) {
28         if(!(list && item)) return -1;
29         int i;
30         for( i = 0; i < list->size; i++ ) 
31                 if(!list->arrlist[i]) break;
32         osrfListSet( list, item, i );
33         return list->size;
34 }
35
36 void* osrfListSet( osrfList* list, void* item, unsigned int position ) {
37         if(!list || position < 0) return NULL;
38
39         int i;
40         int newsize = list->arrsize;
41         void** newarr;
42
43         while( position >= newsize ) 
44                 newsize += OSRF_LIST_INC_SIZE;
45
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];
50                 free(list->arrlist);
51                 list->arrlist = newarr;
52                 list->arrsize = newsize;
53         }
54
55         void* olditem = osrfListRemove( list, position );
56         list->arrlist[position] = item;
57         if( list->size <= position ) list->size = position + 1;
58         return olditem;
59 }
60
61
62 void* osrfListGetIndex( const osrfList* list, unsigned int position ) {
63         if(!list || position >= list->size || position < 0) return NULL;
64         return list->arrlist[position];
65 }
66
67 void osrfListFree( osrfList* list ) {
68         if(!list) return;
69
70         if( list->freeItem ) {
71                 int i; void* val;
72                 for( i = 0; i < list->size; i++ ) {
73                         if( (val = list->arrlist[i]) ) 
74                                 list->freeItem(val);
75                 }
76         }
77
78         free(list->arrlist);
79         free(list);
80 }
81
82 void* osrfListRemove( osrfList* list, unsigned int position ) {
83         if(!list || position >= list->size || position < 0) return NULL;
84
85         void* olditem = list->arrlist[position];
86         list->arrlist[position] = NULL;
87         if( list->freeItem ) {
88                 list->freeItem(olditem);
89                 olditem = NULL;
90         }
91
92         if( position == list->size - 1 ) list->size--;
93         return olditem;
94 }
95
96
97 int osrfListFind( const osrfList* list, void* addr ) {
98         if(!(list && addr)) return -1;
99         int index;
100         for( index = 0; index < list->size; index++ ) {
101                 if( list->arrlist[index] == addr ) 
102                         return index;
103         }
104         return -1;
105 }
106
107
108 unsigned int osrfListGetCount( const osrfList* list ) {
109         if(!list) return -1;
110         return list->size;
111 }
112
113
114 void* osrfListPop( osrfList* list ) {
115         if(!list) return NULL;
116         return osrfListRemove( list, list->size - 1 );
117 }
118
119
120 osrfListIterator* osrfNewListIterator( const osrfList* list ) {
121         if(!list) return NULL;
122         osrfListIterator* itr;
123         OSRF_MALLOC(itr, sizeof(osrfListIterator));
124         itr->list = list;
125         itr->current = 0;
126         return itr;
127 }
128
129 void* osrfListIteratorNext( osrfListIterator* itr ) {
130         if(!(itr && itr->list)) return NULL;
131         if(itr->current >= itr->list->size) return NULL;
132         return itr->list->arrlist[itr->current++];
133 }
134
135 void osrfListIteratorFree( osrfListIterator* itr ) {
136         if(!itr) return;
137         free(itr);
138 }
139
140
141 void osrfListIteratorReset( osrfListIterator* itr ) {
142         if(!itr) return;
143         itr->current = 0;
144 }
145
146
147 void osrfListVanillaFree( void* item ) {
148         free(item);
149 }
150
151 void osrfListSetDefaultFree( osrfList* list ) {
152         if(!list) return;
153         list->freeItem = osrfListVanillaFree;
154 }