]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/charray.c
Import latest leak fix from HEAD.
[openldap] / libraries / libldap / charray.c
index 6be31524278042e45666f77ed1dec6f84ca0ca09..82d2feeb1ba264e09413991ad54c337addb7d220 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /* charray.c - routines for dealing with char * arrays */
@@ -165,22 +165,22 @@ ldap_charray_dup( char **a )
 }
 
 char **
-ldap_str2charray( char *str, char *brkstr )
+ldap_str2charray( const char *str_in, const char *brkstr )
 {
        char    **res;
-       char    *s;
+       char    *str, *s;
        char    *lasts;
        int     i;
 
        /* protect the input string from strtok */
-       str = LDAP_STRDUP( str );
+       str = LDAP_STRDUP( str_in );
        if( str == NULL ) {
                return NULL;
        }
 
        i = 1;
        for ( s = str; *s; s++ ) {
-               if ( strchr( brkstr, *s ) != NULL ) {
+               if ( ldap_utf8_strchr( brkstr, s ) != NULL ) {
                        i++;
                }
        }
@@ -194,9 +194,9 @@ ldap_str2charray( char *str, char *brkstr )
 
        i = 0;
 
-       for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
+       for ( s = ldap_utf8_strtok( str, brkstr, &lasts );
                s != NULL;
-               s = ldap_pvt_strtok( NULL, brkstr, &lasts ) )
+               s = ldap_utf8_strtok( NULL, brkstr, &lasts ) )
        {
                res[i] = LDAP_STRDUP( s );
 
@@ -217,3 +217,48 @@ ldap_str2charray( char *str, char *brkstr )
        LDAP_FREE( str );
        return( res );
 }
+
+char * ldap_charray2str( char **a, const char *sep )
+{
+       char *s, **v, *p;
+       int len = 0;
+       int slen;
+
+       if( sep == NULL ) sep = " ";
+
+       slen = strlen( sep );
+
+       for ( v = a; *v != NULL; v++ ) {
+               len += strlen( *v ) + slen; /* for a space */
+       }
+
+       if ( len == 0 ) {
+               return NULL;
+       }
+
+       len -= slen;
+       len += 1; /* EOS */
+
+       s = LDAP_MALLOC ( len );
+
+       if ( s == NULL ) {
+               return NULL;    
+       }
+
+       p = s;
+       for ( v = a; *v != NULL; v++ ) {
+               int len;
+
+               if ( v != a ) {
+                       strncpy( p, sep, slen );
+                       p += slen;
+               }
+
+               len = strlen( *v );
+               strncpy( p, *v, len );
+               p += len;
+       }
+
+       *p = '\0';
+       return s;
+}