]> git.sur5r.net Git - openldap/blob - libraries/libldap/charray.c
Add OpenLDAP RCSid to *.[ch] in clients, libraries, and servers.
[openldap] / libraries / libldap / charray.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-1999 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     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         *a = aa;
84
85         for ( i = 0; i < nn; i++ ) {
86                 (*a)[n + i] = LDAP_STRDUP(s[i]);
87
88                 if( (*a)[n + i] == NULL ) {
89                         for( --i ; i >= 0 ; i-- ) {
90                                 LDAP_FREE( (*a)[n + i] );
91                                 (*a)[n + i] = NULL;
92                         }
93                         return -1;
94                 }
95         }
96
97         (*a)[n + nn] = NULL;
98         return 0;
99 }
100
101 void
102 ldap_charray_free( char **a )
103 {
104         char    **p;
105
106         if ( a == NULL ) {
107                 return;
108         }
109
110         for ( p = a; *p != NULL; p++ ) {
111                 if ( *p != NULL ) {
112                         LDAP_FREE( *p );
113                 }
114         }
115
116         LDAP_FREE( (char *) a );
117 }
118
119 int
120 ldap_charray_inlist(
121     char        **a,
122     char        *s
123 )
124 {
125         int     i;
126
127         for ( i = 0; a[i] != NULL; i++ ) {
128                 if ( strcasecmp( s, a[i] ) == 0 ) {
129                         return( 1 );
130                 }
131         }
132
133         return( 0 );
134 }
135
136 char **
137 ldap_charray_dup( char **a )
138 {
139         int     i;
140         char    **new;
141
142         for ( i = 0; a[i] != NULL; i++ )
143                 ;       /* NULL */
144
145         new = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
146
147         if( new == NULL ) {
148                 return NULL;
149         }
150
151         for ( i = 0; a[i] != NULL; i++ ) {
152                 new[i] = LDAP_STRDUP( a[i] );
153
154                 if( new[i] == NULL ) {
155                         for( --i ; i >= 0 ; i-- ) {
156                                 LDAP_FREE( new[i] );
157                         }
158                         LDAP_FREE( new );
159                         return NULL;
160                 }
161         }
162         new[i] = NULL;
163
164         return( new );
165 }
166
167 char **
168 ldap_str2charray( char *str, char *brkstr )
169 {
170         char    **res;
171         char    *s;
172         char    *lasts;
173         int     i;
174
175         /* protect the input string from strtok */
176         str = LDAP_STRDUP( str );
177         if( str == NULL ) {
178                 return NULL;
179         }
180
181         i = 1;
182         for ( s = str; *s; s++ ) {
183                 if ( strchr( brkstr, *s ) != NULL ) {
184                         i++;
185                 }
186         }
187
188         res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
189
190         if( res == NULL ) {
191                 LDAP_FREE( str );
192                 return NULL;
193         }
194
195         i = 0;
196
197         for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
198                 s != NULL;
199                 s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
200         {
201                 res[i] = LDAP_STRDUP( s );
202
203                 if(res[i] == NULL) {
204                         for( --i ; i >= 0 ; i-- ) {
205                                 LDAP_FREE( res[i] );
206                         }
207                         LDAP_FREE( res );
208                         LDAP_FREE( str );
209                         return NULL;
210                 }
211
212                 i++;
213         }
214
215         res[i] = NULL;
216
217         LDAP_FREE( str );
218         return( res );
219 }