]> git.sur5r.net Git - openldap/blob - servers/slapd/charray.c
Add LDAPsubentry (without OID).
[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     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     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( char *str, char *brkstr )
147 {
148         char    **res;
149         char    *s;
150         char    *lasts;
151         int     i;
152
153         /* protect the input string from strtok */
154         str = ch_strdup( str );
155
156         i = 1;
157         for ( s = str; *s; s++ ) {
158                 if ( strchr( brkstr, *s ) != NULL ) {
159                         i++;
160                 }
161         }
162
163         res = (char **) ch_malloc( (i + 1) * sizeof(char *) );
164         i = 0;
165
166         for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
167                 s != NULL;
168                 s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
169         {
170                 res[i++] = ch_strdup( s );
171         }
172
173         res[i] = NULL;
174
175         free( str );
176         return( res );
177 }