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