]> git.sur5r.net Git - openldap/blob - servers/slapd/charray.c
include portable.h
[openldap] / servers / slapd / charray.c
1 /* charray.c - routines for dealing with char * arrays */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include "slap.h"
10
11 void
12 charray_add(
13     char        ***a,
14     char        *s
15 )
16 {
17         int     n;
18
19         if ( *a == NULL ) {
20                 *a = (char **) ch_malloc( 2 * sizeof(char *) );
21                 n = 0;
22         } else {
23                 for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
24                         ;       /* NULL */
25                 }
26
27                 *a = (char **) ch_realloc( (char *) *a,
28                     (n + 2) * sizeof(char *) );
29         }
30
31         (*a)[n++] = s;
32         (*a)[n] = NULL;
33 }
34
35 void
36 charray_merge(
37     char        ***a,
38     char        **s
39 )
40 {
41         int     i, n, nn;
42
43         for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
44                 ;       /* NULL */
45         }
46         for ( nn = 0; s[nn] != NULL; nn++ ) {
47                 ;       /* NULL */
48         }
49
50         *a = (char **) ch_realloc( (char *) *a, (n + nn + 1) * sizeof(char *) );
51
52         for ( i = 0; i < nn; i++ ) {
53                 (*a)[n + i] = s[i];
54         }
55         (*a)[n + nn] = NULL;
56 }
57
58 void
59 charray_free( char **array )
60 {
61         char    **a;
62
63         if ( array == NULL ) {
64                 return;
65         }
66
67         for ( a = array; *a != NULL; a++ ) {
68                 if ( *a != NULL ) {
69                         free( *a );
70                 }
71         }
72         free( (char *) array );
73 }
74
75 int
76 charray_inlist(
77     char        **a,
78     char        *s
79 )
80 {
81         int     i;
82
83         for ( i = 0; a[i] != NULL; i++ ) {
84                 if ( strcasecmp( s, a[i] ) == 0 ) {
85                         return( 1 );
86                 }
87         }
88
89         return( 0 );
90 }
91
92 char **
93 charray_dup( char **a )
94 {
95         int     i;
96         char    **new;
97
98         for ( i = 0; a[i] != NULL; i++ )
99                 ;       /* NULL */
100
101         new = (char **) ch_malloc( (i + 1) * sizeof(char *) );
102
103         for ( i = 0; a[i] != NULL; i++ ) {
104                 new[i] = strdup( a[i] );
105         }
106         new[i] = NULL;
107
108         return( new );
109 }
110
111 char **
112 str2charray( char *str, char *brkstr )
113 {
114         char    **res;
115         char    *s;
116         int     i;
117
118         /* protect the input string from strtok */
119         str = strdup( str );
120
121         i = 1;
122         for ( s = str; *s; s++ ) {
123                 if ( strchr( brkstr, *s ) != NULL ) {
124                         i++;
125                 }
126         }
127
128         res = (char **) ch_malloc( (i + 1) * sizeof(char *) );
129         i = 0;
130         for ( s = strtok( str, brkstr ); s != NULL; s = strtok( NULL,
131             brkstr ) ) {
132                 res[i++] = strdup( s );
133         }
134         res[i] = NULL;
135
136         free( str );
137         return( res );
138 }