]> git.sur5r.net Git - openldap/blob - servers/slapd/charray.c
Per ITS#419, don't require SLAPD_RLOOKUPS when HAVE_TCPD
[openldap] / servers / slapd / charray.c
1 /* charray.c - routines for dealing with char * arrays */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/string.h>
13 #include <ac/socket.h>
14
15 #include "slap.h"
16
17 void
18 charray_add(
19     char        ***a,
20     const char  *s
21 )
22 {
23         int     n;
24
25         if ( *a == NULL ) {
26                 *a = (char **) ch_malloc( 2 * sizeof(char *) );
27                 n = 0;
28         } else {
29                 for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
30                         ;       /* NULL */
31                 }
32
33                 *a = (char **) ch_realloc( (char *) *a,
34                     (n + 2) * sizeof(char *) );
35         }
36
37         (*a)[n++] = ch_strdup(s);
38         (*a)[n] = NULL;
39 }
40
41 void
42 charray_merge(
43     char        ***a,
44     char        **s
45 )
46 {
47         int     i, n, nn;
48
49         for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
50                 ;       /* NULL */
51         }
52         for ( nn = 0; s[nn] != NULL; nn++ ) {
53                 ;       /* NULL */
54         }
55
56         *a = (char **) ch_realloc( (char *) *a, (n + nn + 1) * sizeof(char *) );
57
58         for ( i = 0; i < nn; i++ ) {
59                 (*a)[n + i] = ch_strdup(s[i]);
60         }
61         (*a)[n + nn] = NULL;
62 }
63
64 void
65 charray_free( char **array )
66 {
67         char    **a;
68
69         if ( array == NULL ) {
70                 return;
71         }
72
73         for ( a = array; *a != NULL; a++ ) {
74                 if ( *a != NULL ) {
75                         free( *a );
76                 }
77         }
78         free( (char *) array );
79 }
80
81 int
82 charray_inlist(
83     char        **a,
84     const char  *s
85 )
86 {
87         int     i;
88
89         for ( i = 0; a[i] != NULL; i++ ) {
90                 if ( strcasecmp( s, a[i] ) == 0 ) {
91                         return( 1 );
92                 }
93         }
94
95         return( 0 );
96 }
97
98 char **
99 charray_dup( char **a )
100 {
101         int     i;
102         char    **new;
103
104         for ( i = 0; a[i] != NULL; i++ )
105                 ;       /* NULL */
106
107         new = (char **) ch_malloc( (i + 1) * sizeof(char *) );
108
109         for ( i = 0; a[i] != NULL; i++ ) {
110                 new[i] = ch_strdup( a[i] );
111         }
112         new[i] = NULL;
113
114         return( new );
115 }
116
117
118 char *
119 charray2str( char **a )
120 {
121         char *s;
122         int i;
123         size_t cur, len = 0;
124
125         if( a == NULL ) return NULL;
126
127         for( i=0 ; a[i] != NULL ; i++ ) {
128                 len += strlen( a[i] );
129         }
130
131         if( len == 0 ) return NULL;
132
133         s = ch_malloc( len + 1 );
134
135         cur = 0;
136         for( i=0 ; a[i] != NULL ; i++ ) {
137                 len = strlen( a[i] );
138                 strncpy( &s[cur], a[i], len );
139                 cur += len;
140         }
141         s[len] = '\0';
142         return s;
143 }
144
145
146 char **
147 str2charray( const char *str_in, const char *brkstr )
148 {
149         char    *str;
150         char    **res;
151         char    *s;
152         char    *lasts;
153         int     i;
154
155         /* protect the input string from strtok */
156         str = ch_strdup( str_in );
157
158         i = 1;
159         for ( s = str; *s; s++ ) {
160                 if ( strchr( brkstr, *s ) != NULL ) {
161                         i++;
162                 }
163         }
164
165         res = (char **) ch_malloc( (i + 1) * sizeof(char *) );
166         i = 0;
167
168         for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
169                 s != NULL;
170                 s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
171         {
172                 res[i++] = ch_strdup( s );
173         }
174
175         res[i] = NULL;
176
177         free( str );
178         return( res );
179 }