]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/charray.c
need this outside for back monitor ...
[openldap] / servers / slapd / charray.c
index c8790791be00470ea8ecca4f218f5d38941d37ce..2b628d7bbb5e63b7e281bbb4b24feb0a60d455ca 100644 (file)
@@ -1,7 +1,7 @@
 /* charray.c - routines for dealing with char * arrays */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -179,7 +179,6 @@ str2charray( const char *str_in, const char *brkstr )
        return( res );
 }
 
-
 int
 charray_strcmp( const char **a1, const char **a2 )
 {
@@ -213,3 +212,64 @@ charray_strcasecmp( const char **a1, const char **a2 )
        return 0;
 }
 
+/* strcopy is like strcpy except it returns a pointer to the trailing NUL of
+ * the result string. This allows fast construction of catenated strings
+ * without the overhead of strlen/strcat.
+ */
+char *
+slap_strcopy(
+       char *a,
+       const char *b
+)
+{
+       if (!a || !b)
+               return a;
+       
+       while (*a++ = *b++) ;
+       return a-1;
+}
+
+/* Unlike charray_add, bvarray_add does not make a new copy of the
+ * source string. Typically it is used where ber_bvecadd was before,
+ * and ber_bvecadd didn't duplicate its source either.
+ */
+int
+bvarray_add(
+    struct berval **a,
+    struct berval *bv
+)
+{
+       int     n;
+
+       if ( *a == NULL ) {
+               *a = (struct berval *) ch_malloc( 2 * sizeof(struct berval) );
+               n = 0;
+       } else {
+               for ( n = 0; *a != NULL && (*a)[n].bv_val != NULL; n++ ) {
+                       ;       /* NULL */
+               }
+
+               *a = (struct berval *) ch_realloc( (char *) *a,
+                   (n + 2) * sizeof(struct berval) );
+       }
+       if ( *a == NULL ) return -1;
+
+       (*a)[n++] = *bv;
+       (*a)[n].bv_val = NULL;
+
+       return 0;
+}
+
+void
+bvarray_free(
+    struct berval *a
+)
+{
+       int i;
+
+       if (a) {
+               for (i=0; a[i].bv_val; i++)
+                       free(a[i].bv_val);
+               free(a);
+       }
+}