]> git.sur5r.net Git - openldap/blob - libraries/libldap/charray.c
fefe1d916604a2c7362047ce8ec7047420607276
[openldap] / libraries / libldap / charray.c
1 /*
2  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /* charray.c - routines for dealing with char * arrays */
6
7 #include "portable.h"
8
9 #include <stdio.h>
10
11 #include <ac/string.h>
12 #include <ac/socket.h>
13
14 #include "ldap-int.h"
15
16 int
17 ldap_charray_add(
18     char        ***a,
19     char        *s
20 )
21 {
22         int     n;
23
24         if ( *a == NULL ) {
25                 *a = (char **) LDAP_MALLOC( 2 * sizeof(char *) );
26                 n = 0;
27         } else {
28                 for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
29                         ;       /* NULL */
30                 }
31
32                 *a = (char **) LDAP_REALLOC( (char *) *a,
33                     (n + 2) * sizeof(char *) );
34         }
35
36         if( *a == NULL ) {
37                 return -1;
38         }
39
40         (*a)[n] = LDAP_STRDUP(s);
41
42         if( (*a)[n] == NULL ) {
43                 return 1;
44         }
45
46         (*a)[++n] = NULL;
47
48         return 0;
49 }
50
51 int
52 ldap_charray_merge(
53     char        ***a,
54     char        **s
55 )
56 {
57         int     i, n, nn;
58         char **aa;
59
60         for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
61                 ;       /* NULL */
62         }
63         for ( nn = 0; s[nn] != NULL; nn++ ) {
64                 ;       /* NULL */
65         }
66
67         aa = (char **) LDAP_REALLOC( (char *) *a, (n + nn + 1) * sizeof(char *) );
68
69         if( aa == NULL )
70                 return -1;
71
72         *a = aa;
73
74         for ( i = 0; i < nn; i++ ) {
75                 (*a)[n + i] = LDAP_STRDUP(s[i]);
76
77                 if( (*a)[n + i] == NULL ) {
78                         for( --i ; i >= 0 ; i-- ) {
79                                 LDAP_FREE( (*a)[n + i] );
80                                 (*a)[n + i] = NULL;
81                         }
82                         return -1;
83                 }
84         }
85
86         (*a)[n + nn] = NULL;
87         return 0;
88 }
89
90 void
91 ldap_charray_free( char **a )
92 {
93         char    **p;
94
95         if ( a == NULL ) {
96                 return;
97         }
98
99         for ( p = a; *p != NULL; p++ ) {
100                 if ( *p != NULL ) {
101                         LDAP_FREE( *p );
102                 }
103         }
104
105         LDAP_FREE( (char *) a );
106 }
107
108 int
109 ldap_charray_inlist(
110     char        **a,
111     char        *s
112 )
113 {
114         int     i;
115
116         for ( i = 0; a[i] != NULL; i++ ) {
117                 if ( strcasecmp( s, a[i] ) == 0 ) {
118                         return( 1 );
119                 }
120         }
121
122         return( 0 );
123 }
124
125 char **
126 ldap_charray_dup( char **a )
127 {
128         int     i;
129         char    **new;
130
131         for ( i = 0; a[i] != NULL; i++ )
132                 ;       /* NULL */
133
134         new = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
135
136         if( new == NULL ) {
137                 return NULL;
138         }
139
140         for ( i = 0; a[i] != NULL; i++ ) {
141                 new[i] = LDAP_STRDUP( a[i] );
142
143                 if( new[i] == NULL ) {
144                         for( --i ; i >= 0 ; i-- ) {
145                                 LDAP_FREE( new[i] );
146                         }
147                         LDAP_FREE( new );
148                         return NULL;
149                 }
150         }
151         new[i] = NULL;
152
153         return( new );
154 }
155
156 char **
157 ldap_str2charray( char *str, char *brkstr )
158 {
159         char    **res;
160         char    *s;
161         char    *lasts;
162         int     i;
163
164         /* protect the input string from strtok */
165         str = LDAP_STRDUP( str );
166         if( str == NULL ) {
167                 return NULL;
168         }
169
170         i = 1;
171         for ( s = str; *s; s++ ) {
172                 if ( strchr( brkstr, *s ) != NULL ) {
173                         i++;
174                 }
175         }
176
177         res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );
178
179         if( res == NULL ) {
180                 LDAP_FREE( str );
181                 return NULL;
182         }
183
184         i = 0;
185
186         for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
187                 s != NULL;
188                 s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
189         {
190                 res[i] = LDAP_STRDUP( s );
191
192                 if(res[i] == NULL) {
193                         for( --i ; i >= 0 ; i-- ) {
194                                 LDAP_FREE( res[i] );
195                         }
196                         LDAP_FREE( res );
197                         LDAP_FREE( str );
198                         return NULL;
199                 }
200
201                 i++;
202         }
203
204         res[i] = NULL;
205
206         LDAP_FREE( str );
207         return( res );
208 }