]> git.sur5r.net Git - openldap/commitdiff
Added ber_bvarray_dup_x()
authorHoward Chu <hyc@openldap.org>
Mon, 5 Feb 2007 04:31:38 +0000 (04:31 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 5 Feb 2007 04:31:38 +0000 (04:31 +0000)
include/lber_pvt.h
libraries/liblber/memory.c

index 4fb4f28086f46a088560b0b091bd773263bb6e41..f0659a685720386e5a9179c7739ad93cdea49a7c 100644 (file)
@@ -145,6 +145,9 @@ ber_bvarray_free_x LDAP_P(( BerVarray p, void *ctx ));
 LBER_F( int )
 ber_bvarray_add_x LDAP_P(( BerVarray *p, BerValue *bv, void *ctx ));
 
+LBER_F( int )
+ber_bvarray_dup_x LDAP_P(( BerVarray *dst, BerVarray src, void *ctx ));
+
 #if 0
 #define ber_bvstrcmp(v1,v2) \
        ((v1)->bv_len < (v2)->bv_len \
index 375988bbef1e514d1524c9662a6e492c00060bed..0681869862b475253d4779aad4320a83c2741150 100644 (file)
@@ -744,6 +744,33 @@ ber_bvarray_free( BerVarray a )
        ber_bvarray_free_x(a, NULL);
 }
 
+int
+ber_bvarray_dup_x( BerVarray *dst, BerVarray src, void *ctx )
+{
+       int i, j;
+       BerVarray new;
+
+       if ( !src ) {
+               *dst = NULL;
+               return 0;
+       }
+
+       for (i=0; !BER_BVISNULL( &src[i] ); i++) ;
+       new = ber_memalloc_x(( i+1 ) * sizeof(BerValue), ctx );
+       if ( !new )
+               return -1;
+       for (j=0; j<i; j++) {
+               ber_dupbv_x( &new[j], &src[j], ctx );
+               if ( BER_BVISNULL( &new[j] )) {
+                       ber_bvarray_free_x( new, ctx );
+                       return -1;
+               }
+       }
+       BER_BVZERO( &new[j] );
+       *dst = new;
+       return 0;
+}
+
 int
 ber_bvarray_add_x( BerVarray *a, BerValue *bv, void *ctx )
 {
@@ -784,6 +811,7 @@ ber_bvarray_add_x( BerVarray *a, BerValue *bv, void *ctx )
 
        (*a)[n++] = *bv;
        (*a)[n].bv_val = NULL;
+       (*a)[n].bv_len = 0;
 
        return n;
 }