openldap/servers/slapd/charray.c
Kurt Zeilenga cfa450d078 Fix schema check bug... actually charray needs to dup strings on
add/merge as we now free strings agressively.  Improved debug
message to include name of missing required attribute and added
check for 'operational attributes'.  This check should be used
everywhere we need to test for operational attributes (add/modify).
Also, enabled schema checking for tests (and fixed resulting
problems by adjusting oc.conf).
1998-12-28 23:43:04 +00:00

140 lines
1.9 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 **
str2charray( char *str, char *brkstr )
{
char **res;
char *s;
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 = strtok( str, brkstr ); s != NULL; s = strtok( NULL,
brkstr ) ) {
res[i++] = ch_strdup( s );
}
res[i] = NULL;
free( str );
return( res );
}