]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/sort.c
Added thread-pool getkey/setkey functions
[openldap] / libraries / libldap / sort.c
index 6738fba022c48b576fccddff005b9e2f0c544fdb..84557eb33a8d248d0ddbbdf884da9494c14c3d1d 100644 (file)
@@ -1,4 +1,9 @@
+/* $OpenLDAP$ */
 /*
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+/* Portions
  * Copyright (c) 1994 Regents of the University of Michigan.
  * All rights reserved.
  *
@@ -15,7 +20,7 @@
 #include "portable.h"
 
 #include <stdio.h>
-#include <stdlib.h>
+#include <ac/stdlib.h>
 
 #include <ac/ctype.h>
 #include <ac/string.h>
@@ -35,8 +40,8 @@ static int    et_cmp LDAP_P(( const void *aa, const void *bb));
 
 int
 ldap_sort_strcasecmp(
-       const void      *a,
-       const void      *b
+       LDAP_CONST void *a,
+       LDAP_CONST void *b
 )
 {
        return( strcasecmp( *(char *const *)a, *(char *const *)b ) );
@@ -76,8 +81,8 @@ int
 ldap_sort_entries(
     LDAP       *ld,
     LDAPMessage        **chain,
-    char       *attr,          /* NULL => sort by DN */
-    int                (*cmp) (const char *, const char *)
+    LDAP_CONST char    *attr,          /* NULL => sort by DN */
+    int                (*cmp) (LDAP_CONST  char *, LDAP_CONST char *)
 )
 {
        int                     i, count;
@@ -85,9 +90,19 @@ ldap_sort_entries(
        LDAPMessage             *e, *last;
        LDAPMessage             **ep;
 
+       assert( ld != NULL );
+
        count = ldap_count_entries( ld, *chain );
 
-       if ( (et = (struct entrything *) malloc( count *
+       if ( count < 0 ) {
+               return -1;
+
+       } else if ( count < 2 ) {
+               /* zero or one entries -- already sorted! */
+               return 0;
+       }
+
+       if ( (et = (struct entrything *) LDAP_MALLOC( count *
            sizeof(struct entrything) )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
                return( -1 );
@@ -102,7 +117,7 @@ ldap_sort_entries(
 
                        dn = ldap_get_dn( ld, e );
                        et[i].et_vals = ldap_explode_dn( dn, 1 );
-                       free( dn );
+                       LDAP_FREE( dn );
                } else {
                        et[i].et_vals = ldap_get_values( ld, e, attr );
                }
@@ -118,10 +133,10 @@ ldap_sort_entries(
                *ep = et[i].et_msg;
                ep = &(*ep)->lm_chain;
 
-               ldap_value_free( et[i].et_vals );
+               LDAP_VFREE( et[i].et_vals );
        }
        *ep = last;
-       free( (char *) et );
+       LDAP_FREE( (char *) et );
 
        return( 0 );
 }
@@ -130,7 +145,7 @@ int
 ldap_sort_values(
     LDAP       *ld,
     char       **vals,
-    int                (*cmp) (const void *, const void *)
+    int                (*cmp) (LDAP_CONST void *, LDAP_CONST void *)
 )
 {
        int     nel;