Back to index

openldap  2.4.31
Functions
charray.c File Reference
#include "portable.h"
#include <stdio.h>
#include <ac/string.h>
#include <ac/socket.h>
#include "ldap-int.h"

Go to the source code of this file.

Functions

int ldap_charray_add (char ***a, const char *s)
int ldap_charray_merge (char ***a, char **s)
void ldap_charray_free (char **a)
int ldap_charray_inlist (char **a, const char *s)
char ** ldap_charray_dup (char **a)
char ** ldap_str2charray (const char *str_in, const char *brkstr)
char * ldap_charray2str (char **a, const char *sep)

Function Documentation

char* ldap_charray2str ( char **  a,
const char *  sep 
)

Definition at line 233 of file charray.c.

{
       char *s, **v, *p;
       int len;
       int slen;

       if( sep == NULL ) sep = " ";

       slen = strlen( sep );
       len = 0;

       for ( v = a; *v != NULL; v++ ) {
              len += strlen( *v ) + slen;
       }

       if ( len == 0 ) {
              return NULL;
       }

       /* trim extra sep len */
       len -= slen;

       s = LDAP_MALLOC ( len + 1 );

       if ( s == NULL ) {
              return NULL;  
       }

       p = s;
       for ( v = a; *v != NULL; v++ ) {
              if ( v != a ) {
                     strncpy( p, sep, slen );
                     p += slen;
              }

              len = strlen( *v );
              strncpy( p, *v, len );
              p += len;
       }

       *p = '\0';
       return s;
}

Here is the caller graph for this function:

int ldap_charray_add ( char ***  a,
const char *  s 
)

Definition at line 27 of file charray.c.

{
       int    n;

       if ( *a == NULL ) {
              *a = (char **) LDAP_MALLOC( 2 * sizeof(char *) );
              n = 0;

              if( *a == NULL ) {
                     return -1;
              }

       } else {
              char **new;

              for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
                     ;      /* NULL */
              }

              new = (char **) LDAP_REALLOC( (char *) *a,
                  (n + 2) * sizeof(char *) );

              if( new == NULL ) {
                     /* caller is required to call ldap_charray_free(*a) */
                     return -1;
              }

              *a = new;
       }

       (*a)[n] = LDAP_STRDUP(s);

       if( (*a)[n] == NULL ) {
              return 1;
       }

       (*a)[++n] = NULL;

       return 0;
}

Here is the caller graph for this function:

char** ldap_charray_dup ( char **  a)

Definition at line 149 of file charray.c.

{
       int    i;
       char   **new;

       for ( i = 0; a[i] != NULL; i++ )
              ;      /* NULL */

       new = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );

       if( new == NULL ) {
              return NULL;
       }

       for ( i = 0; a[i] != NULL; i++ ) {
              new[i] = LDAP_STRDUP( a[i] );

              if( new[i] == NULL ) {
                     for( --i ; i >= 0 ; i-- ) {
                            LDAP_FREE( new[i] );
                     }
                     LDAP_FREE( new );
                     return NULL;
              }
       }
       new[i] = NULL;

       return( new );
}

Here is the caller graph for this function:

void ldap_charray_free ( char **  a)

Definition at line 112 of file charray.c.

{
       char   **p;

       if ( a == NULL ) {
              return;
       }

       for ( p = a; *p != NULL; p++ ) {
              if ( *p != NULL ) {
                     LDAP_FREE( *p );
              }
       }

       LDAP_FREE( (char *) a );
}

Here is the caller graph for this function:

int ldap_charray_inlist ( char **  a,
const char *  s 
)

Definition at line 130 of file charray.c.

{
       int    i;

       if( a == NULL ) return 0;

       for ( i=0; a[i] != NULL; i++ ) {
              if ( strcasecmp( s, a[i] ) == 0 ) {
                     return 1;
              }
       }

       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int ldap_charray_merge ( char ***  a,
char **  s 
)

Definition at line 72 of file charray.c.

{
       int    i, n, nn;
       char **aa;

       for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
              ;      /* NULL */
       }
       for ( nn = 0; s[nn] != NULL; nn++ ) {
              ;      /* NULL */
       }

       aa = (char **) LDAP_REALLOC( (char *) *a, (n + nn + 1) * sizeof(char *) );

       if( aa == NULL ) {
              return -1;
       }

       *a = aa;

       for ( i = 0; i < nn; i++ ) {
              (*a)[n + i] = LDAP_STRDUP(s[i]);

              if( (*a)[n + i] == NULL ) {
                     for( --i ; i >= 0 ; i-- ) {
                            LDAP_FREE( (*a)[n + i] );
                            (*a)[n + i] = NULL;
                     }
                     return -1;
              }
       }

       (*a)[n + nn] = NULL;
       return 0;
}

Here is the caller graph for this function:

char** ldap_str2charray ( const char *  str_in,
const char *  brkstr 
)

Definition at line 180 of file charray.c.

{
       char   **res;
       char   *str, *s;
       char   *lasts;
       int    i;

       /* protect the input string from strtok */
       str = LDAP_STRDUP( str_in );
       if( str == NULL ) {
              return NULL;
       }

       i = 1;
       for ( s = str; ; LDAP_UTF8_INCR(s) ) {
              s = ldap_utf8_strpbrk( s, brkstr );
              if ( !s ) break;
              i++;
       }

       res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );

       if( res == NULL ) {
              LDAP_FREE( str );
              return NULL;
       }

       i = 0;

       for ( s = ldap_utf8_strtok( str, brkstr, &lasts );
              s != NULL;
              s = ldap_utf8_strtok( NULL, brkstr, &lasts ) )
       {
              res[i] = LDAP_STRDUP( s );

              if(res[i] == NULL) {
                     for( --i ; i >= 0 ; i-- ) {
                            LDAP_FREE( res[i] );
                     }
                     LDAP_FREE( res );
                     LDAP_FREE( str );
                     return NULL;
              }

              i++;
       }

       res[i] = NULL;

       LDAP_FREE( str );
       return( res );
}

Here is the call graph for this function:

Here is the caller graph for this function: