Patch from Scott McKellar:
[OpenSRF.git] / src / libopensrf / string_array.c
1 #include <opensrf/string_array.h>
2
3 osrfStringArray* osrfNewStringArray(int size) {
4         if(size > STRING_ARRAY_MAX_SIZE)
5                 osrfLogError( OSRF_LOG_MARK, "osrfNewStringArray size is too large");
6
7         osrfStringArray* arr;
8         OSRF_MALLOC( arr, sizeof(osrfStringArray));
9     arr->list = osrfNewListSize(size);
10     osrfListSetDefaultFree(arr->list);
11         arr->size = 0;
12         return arr;
13 }
14
15
16 void osrfStringArrayAdd(osrfStringArray* arr, char* str) {
17         if(arr == NULL || str == NULL ) return;
18         if( arr->size > STRING_ARRAY_MAX_SIZE ) 
19                 osrfLogError( OSRF_LOG_MARK, "osrfStringArrayAdd size is too large");
20     osrfListPush(arr->list, strdup(str));
21     arr->size = arr->list->size;
22 }
23
24 char* osrfStringArrayGetString(osrfStringArray* arr, int index) {
25     if(!arr) return NULL;
26     return OSRF_LIST_GET_INDEX(arr->list, index);
27 }
28
29 void osrfStringArrayFree(osrfStringArray* arr) {
30     OSRF_STRING_ARRAY_FREE(arr);
31 }
32
33 int osrfStringArrayContains( osrfStringArray* arr, char* string ) {
34         if(!(arr && string)) return 0;
35         int i;
36         for( i = 0; i < arr->size; i++ ) {
37         char* str = OSRF_LIST_GET_INDEX(arr->list, i);
38                 if(str && !strcmp(str, string)) 
39             return 1;
40         }
41
42         return 0;
43 }
44
45 void osrfStringArrayRemove( osrfStringArray* arr, char* tstr) {
46         if(!(arr && tstr)) return;
47         int i;
48     char* str;
49
50         for( i = 0; i < arr->size; i++ ) {
51         /* find and remove the string */
52         str = OSRF_LIST_GET_INDEX(arr->list, i);
53                 if(str && !strcmp(str, tstr)) {
54             osrfListRemove(arr->list, i);
55                         break;
56                 }
57         }
58
59     /* disable automatic item freeing on delete and shift
60      * items up in the array to fill in the gap
61      */
62     arr->list->freeItem = NULL;
63         for( ; i < arr->size - 1; i++ ) 
64         osrfListSet(arr->list, OSRF_LIST_GET_INDEX(arr->list, i+1) , i);
65
66     /* remove the last item since it was shifted up */
67     osrfListRemove(arr->list, i);
68
69     /* re-enable automatic item freeing in delete */
70     osrfListSetDefaultFree(arr->list);
71         arr->size--;
72 }
73
74