Merged libopensrf source directories (libtransport, libstack, and utils) into a singl...
[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         /*
12         string_array* arr = 
13                 (string_array*) safe_malloc(sizeof(string_array));
14                 */
15         string_array* arr;
16         OSRF_MALLOC( arr, sizeof(string_array));
17
18         //arr->array = (char**) safe_malloc(size * sizeof(char*));
19         OSRF_MALLOC(arr->array, size * sizeof(char*));
20
21         arr->size = 0;
22         arr->arr_size = size;
23         return arr;
24 }
25
26
27 void osrfStringArrayAdd(osrfStringArray* arr, char* string) {
28         string_array_add(arr, string);
29 }
30
31 void string_array_add(string_array* arr, char* str) {
32         if(arr == NULL || str == NULL ) return;
33         if( strlen(str) < 1 ) return;
34
35         arr->size++;
36
37         if( arr->size > STRING_ARRAY_MAX_SIZE ) 
38                 osrfLogError( OSRF_LOG_MARK, "string_array_add size is too large");
39
40         /* if necessary, double capacity */
41         if(arr->size >= arr->arr_size) {
42                 arr->arr_size *= 2;
43                 //char** tmp = (char**) safe_malloc(arr->arr_size * sizeof(char*));
44                 char** tmp;
45                 OSRF_MALLOC( tmp, arr->arr_size * sizeof(char*));
46                 int i;
47
48                 /* copy the string pointers over */
49                 for( i = 0; i!= arr->size; i++ ) 
50                         tmp[i] = arr->array[i];
51
52                 free(arr->array);
53                 arr->array = tmp;
54         }
55
56         arr->array[arr->size - 1] = strdup(str);
57 }
58
59 char* osrfStringArrayGetString(osrfStringArray* arr, int index) {
60         return string_array_get_string(arr, index);
61 }
62
63 char* string_array_get_string(string_array* arr, int index) {
64         if(!arr || index < 0 || index >= arr->size ) return NULL;
65         return arr->array[index]; 
66 }
67
68
69 void osrfStringArrayFree(osrfStringArray* arr) {
70         string_array_destroy(arr);
71 }
72
73 void string_array_destroy(string_array* arr) {
74         if(arr) {
75                 int i = 0;
76                 while( i < arr->size ) free(arr->array[i++]);
77                 free(arr->array);
78                 free(arr);
79         }
80 }
81
82
83 int osrfStringArrayContains( osrfStringArray* arr, char* string ) {
84         if(!(arr && string)) return 0;
85         
86         int i;
87         for( i = 0; i != arr->size; i++ ) {
88                 char* str = osrfStringArrayGetString(arr, i);
89                 if(str) {
90                         if(!strcmp(str, string)) return 1;
91                 }
92         }
93
94         return 0;
95 }
96
97 void osrfStringArrayRemove( osrfStringArray* arr, char* tstr) {
98         if(!(arr && tstr)) return;
99         int i;
100         for( i = 0; i != arr->size; i++ ) {
101                 char* str = osrfStringArrayGetString(arr, i);
102                 if(str) {
103                         if(!strcmp(str, tstr)) {
104                                 free(arr->array[i]);
105                                 arr->array[i] = NULL;
106                                 break;
107                         }
108                 }
109         }
110         for( ; i != arr->size; i++ ) 
111                 arr->array[i] = arr->array[i+1];
112
113         arr->size--;
114 }
115
116