openldap/servers/slapd/charray.c
Kurt Zeilenga 73276e84ae Import experimental referral implementation from OPENLDAP_DEVEL_REFERRALS.
Includes support for update referral for each replicated backend.
	Reworked replication test to use update referral.
Includes major rewrite of response encoding codes (result.c).
Includes reworked alias support and eliminates old suffix alias codes
(can be emulated using named alias).
Includes (untested) support for the Manage DSA IT control.
Works in LDAPv2 world.  Still testing in LDAPv3 world.
Added default referral (test009) test.
1999-07-16 02:45:46 +00:00

174 lines
2.4 KiB
C

/* charray.c - routines for dealing with char * arrays */
#include "portable.h"
#include <stdio.h>
#include <ac/string.h>
#include <ac/socket.h>
#include "slap.h"
void
charray_add(
char ***a,
char *s
)
{
int n;
if ( *a == NULL ) {
*a = (char **) ch_malloc( 2 * sizeof(char *) );
n = 0;
} else {
for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
; /* NULL */
}
*a = (char **) ch_realloc( (char *) *a,
(n + 2) * sizeof(char *) );
}
(*a)[n++] = ch_strdup(s);
(*a)[n] = NULL;
}
void
charray_merge(
char ***a,
char **s
)
{
int i, n, nn;
for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
; /* NULL */
}
for ( nn = 0; s[nn] != NULL; nn++ ) {
; /* NULL */
}
*a = (char **) ch_realloc( (char *) *a, (n + nn + 1) * sizeof(char *) );
for ( i = 0; i < nn; i++ ) {
(*a)[n + i] = ch_strdup(s[i]);
}
(*a)[n + nn] = NULL;
}
void
charray_free( char **array )
{
char **a;
if ( array == NULL ) {
return;
}
for ( a = array; *a != NULL; a++ ) {
if ( *a != NULL ) {
free( *a );
}
}
free( (char *) array );
}
int
charray_inlist(
char **a,
char *s
)
{
int i;
for ( i = 0; a[i] != NULL; i++ ) {
if ( strcasecmp( s, a[i] ) == 0 ) {
return( 1 );
}
}
return( 0 );
}
char **
charray_dup( char **a )
{
int i;
char **new;
for ( i = 0; a[i] != NULL; i++ )
; /* NULL */
new = (char **) ch_malloc( (i + 1) * sizeof(char *) );
for ( i = 0; a[i] != NULL; i++ ) {
new[i] = ch_strdup( a[i] );
}
new[i] = NULL;
return( new );
}
char *
charray2str( char **a )
{
char *s;
int i;
size_t cur, len = 0;
if( a == NULL ) return NULL;
for( i=0 ; a[i] != NULL ; i++ ) {
len += strlen( a[i] );
}
if( len == 0 ) return NULL;
s = ch_malloc( len + 1 );
cur = 0;
for( i=0 ; a[i] != NULL ; i++ ) {
len = strlen( a[i] );
strncpy( &s[cur], a[i], len );
cur += len;
}
s[len] = '\0';
return s;
}
char **
str2charray( char *str, char *brkstr )
{
char **res;
char *s;
char *lasts;
int i;
/* protect the input string from strtok */
str = ch_strdup( str );
i = 1;
for ( s = str; *s; s++ ) {
if ( strchr( brkstr, *s ) != NULL ) {
i++;
}
}
res = (char **) ch_malloc( (i + 1) * sizeof(char *) );
i = 0;
for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
s != NULL;
s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
{
res[i++] = ch_strdup( s );
}
res[i] = NULL;
free( str );
return( res );
}