]> git.sur5r.net Git - openldap/blob - libraries/libldap/charray.c
b851f002d6270cfdb663b1afb997291867ce9b9b
[openldap] / libraries / libldap / charray.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /* charray.c - routines for dealing with char * arrays */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/string.h>
13 #include <ac/socket.h>
14
15 #include "ldap-int.h"
16
17 int
18 ldap_charray_add(
19     char        ***a,
20     const char *s
21 )
22 {
23         int     n;
24
25         if ( *a == NULL ) {
26                 *a = (char **) LDAP_MALLOC( 2 * sizeof(char *) );
27                 n = 0;
28
29                 if( *a == NULL ) {
30                         return -1;
31                 }
32
33         } else {
34                 char **new;
35
36                 for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
37                         ;       /* NULL */
38                 }
39
40                 new = (char **) LDAP_REALLOC( (char *) *a,
41                     (n + 2) * sizeof(char *) );
42
43                 if( new == NULL ) {
44                         /* caller is required to call ldap_charray_free(*a) */
45                         return -1;
46                 }
47
48                 *a = new;
49         }
50
51         (*a)[n] = LDAP_STRDUP(s);
52
53         if( (*a)[n] == NULL ) {
54                 return 1;
55         }
56
57         (*a)[++n] = NULL;
58
59         return 0;
60 }
61
62 int
63 ldap_charray_merge(
64     char        ***a,
65     char        **s
66 )
67 {
68         int     i, n, nn;
69         char **aa;
70
71         for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
72                 ;       /* NULL */
73         }
74         for ( nn = 0; s[nn] != NULL; nn++ ) {
75                 ;       /* NULL */
76         }
77
78         aa = (char **) LDAP_REALLOC( (char *) *a, (n + nn + 1) * sizeof(char *) );
79
80         if( aa == NULL ) {
81                 return -1;
82         }
83
84         *a = aa;
85
86         for ( i = 0; i < nn; i++ ) {
87                 (*a)[n + i] = LDAP_STRDUP(s[i]);
88
89                 if( (*a)[n + i] == NULL ) {
90                         for( --i ; i >= 0 ; i-- ) {
91                                 LDAP_FREE( (*a)[n + i] );
92                                 (*a)[n + i] = NULL;
93                         }
94                         return -1;
95                 }
96         }
97
98         (*a)[n + nn] = NULL;
99         return 0;
100 }
101
102 void
103 ldap_charray_free( char **a )
104 {
105         char    **p;
106
107         if ( a == NULL ) {
108                 return;
109         }
110
111         for ( p = a; *p != NULL; p++ ) {
112                 if ( *p != NULL ) {
113                         LDAP_FREE( *p );
114                 }
115         }
116
117         LDAP_FREE( (char *) a );
118 }
119
120 int
121 ldap_charray_inlist(
122     char        **a,
123     const char *s
124 )
125 {
126         int     i;
127
128         if( a == NULL ) return 0;
129
130         for ( i=0; a[i] != NULL; i++ ) {
131                 if ( strcasecmp( s, a[i] ) == 0 ) {
132                         return 1;
133                 }
134         }
135
136         return 0;
137 }
138
139 char **
140 ldap_charray_dup( char **a )
141 {
142         int     i;
143         char    **new;
144
145         for ( i = 0; a[i] != NULL; i++ )
146                 ;       /* NULL */
147
148         new = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
149
150         if( new == NULL ) {
151                 return NULL;
152         }
153
154         for ( i = 0; a[i] != NULL; i++ ) {
155                 new[i] = LDAP_STRDUP( a[i] );
156
157                 if( new[i] == NULL ) {
158                         for( --i ; i >= 0 ; i-- ) {
159                                 LDAP_FREE( new[i] );
160                         }
161                         LDAP_FREE( new );
162                         return NULL;
163                 }
164         }
165         new[i] = NULL;
166
167         return( new );
168 }
169
170 char **
171 ldap_str2charray( const char *str_in, const char *brkstr )
172 {
173         char    **res;
174         char    *str, *s;
175         char    *lasts;
176         int     i;
177
178         /* protect the input string from strtok */
179         str = LDAP_STRDUP( str_in );
180         if( str == NULL ) {
181                 return NULL;
182         }
183
184         i = 1;
185         for ( s = str; *s; s++ ) {
186                 if ( ldap_utf8_strchr( brkstr, s ) != NULL ) {
187                         i++;
188                 }
189         }
190
191         res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
192
193         if( res == NULL ) {
194                 LDAP_FREE( str );
195                 return NULL;
196         }
197
198         i = 0;
199
200         for ( s = ldap_utf8_strtok( str, brkstr, &lasts );
201                 s != NULL;
202                 s = ldap_utf8_strtok( NULL, brkstr, &lasts ) )
203         {
204                 res[i] = LDAP_STRDUP( s );
205
206                 if(res[i] == NULL) {
207                         for( --i ; i >= 0 ; i-- ) {
208                                 LDAP_FREE( res[i] );
209                         }
210                         LDAP_FREE( res );
211                         LDAP_FREE( str );
212                         return NULL;
213                 }
214
215                 i++;
216         }
217
218         res[i] = NULL;
219
220         LDAP_FREE( str );
221         return( res );
222 }
223
224 char * ldap_charray2str( char **a, const char *sep )
225 {
226         char *s, **v, *p;
227         int len;
228         int slen;
229
230         if( sep == NULL ) sep = " ";
231
232         slen = strlen( sep );
233         len = 0;
234
235         for ( v = a; *v != NULL; v++ ) {
236                 len += strlen( *v ) + slen;
237         }
238
239         if ( len == 0 ) {
240                 return NULL;
241         }
242
243         /* trim extra sep len */
244         len -= slen;
245
246         s = LDAP_MALLOC ( len + 1 );
247
248         if ( s == NULL ) {
249                 return NULL;    
250         }
251
252         p = s;
253         for ( v = a; *v != NULL; v++ ) {
254                 if ( v != a ) {
255                         strncpy( p, sep, slen );
256                         p += slen;
257                 }
258
259                 len = strlen( *v );
260                 strncpy( p, *v, len );
261                 p += len;
262         }
263
264         *p = '\0';
265         return s;
266 }