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