X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fsort.c;h=5734022c58170ece106a45094a117033a02a96b6;hb=a2eec74fc1d535fa9092f4d7b82a669b39eef539;hp=7e90d9fcd6ccd34bd7269e7afe2fa925e643b8f1;hpb=984a661277ddf23190bca787210a09c373e6561e;p=openldap diff --git a/libraries/libldap/sort.c b/libraries/libldap/sort.c index 7e90d9fcd6..5734022c58 100644 --- a/libraries/libldap/sort.c +++ b/libraries/libldap/sort.c @@ -1,4 +1,9 @@ +/* $OpenLDAP$ */ /* + * Copyright 1998-2000 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,43 +20,42 @@ #include "portable.h" #include -#include +#include #include #include #include -#include "lber.h" -#include "ldap.h" +#include "ldap-int.h" struct entrything { char **et_vals; LDAPMessage *et_msg; + int (*et_cmp_fn) LDAP_P((const char *a, const char *b)); }; -static int (*et_cmp_fn) LDAP_P(( char *a, char *b )); -static int et_cmp LDAP_P(( void *aa, void *bb)); +static int et_cmp LDAP_P(( const void *aa, const void *bb)); int ldap_sort_strcasecmp( - char **a, - char **b + LDAP_CONST void *a, + LDAP_CONST void *b ) { - return( strcasecmp( *a, *b ) ); + return( strcasecmp( *(char *const *)a, *(char *const *)b ) ); } static int et_cmp( - void *aa, - void *bb + const void *aa, + const void *bb ) { int i, rc; - struct entrything *a = (struct entrything *)aa; - struct entrything *b = (struct entrything *)bb; + const struct entrything *a = (const struct entrything *)aa; + const struct entrything *b = (const struct entrything *)bb; if ( a->et_vals == NULL && b->et_vals == NULL ) return( 0 ); @@ -61,8 +65,7 @@ et_cmp( return( 1 ); for ( i = 0; a->et_vals[i] && b->et_vals[i]; i++ ) { - if ( (rc = (*et_cmp_fn)( a->et_vals[i], b->et_vals[i] )) - != 0 ) { + if ( (rc = a->et_cmp_fn( a->et_vals[i], b->et_vals[i] )) != 0 ) { return( rc ); } } @@ -78,8 +81,8 @@ int ldap_sort_entries( LDAP *ld, LDAPMessage **chain, - char *attr, /* NULL => sort by DN */ - int (*cmp)() + LDAP_CONST char *attr, /* NULL => sort by DN */ + int (*cmp) (LDAP_CONST char *, LDAP_CONST char *) ) { int i, count; @@ -89,7 +92,19 @@ ldap_sort_entries( count = ldap_count_entries( ld, *chain ); - if ( (et = (struct entrything *) malloc( count * + + if ( count < 0 ) { + if( ld != NULL ) { + ld->ld_errno = LDAP_PARAM_ERROR; + } + 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 ); @@ -97,13 +112,14 @@ ldap_sort_entries( e = *chain; for ( i = 0; i < count; i++ ) { + et[i].et_cmp_fn = cmp; et[i].et_msg = e; if ( attr == NULL ) { char *dn; 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 ); } @@ -112,18 +128,17 @@ ldap_sort_entries( } last = e; - et_cmp_fn = cmp; - qsort( et, count, sizeof(struct entrything), (void *) et_cmp ); + qsort( et, count, sizeof(struct entrything), et_cmp ); ep = chain; for ( i = 0; i < count; i++ ) { *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 ); } @@ -132,7 +147,7 @@ int ldap_sort_values( LDAP *ld, char **vals, - int (*cmp) LDAP_P((const void *, const void *)) + int (*cmp) (LDAP_CONST void *, LDAP_CONST void *) ) { int nel; @@ -140,7 +155,7 @@ ldap_sort_values( for ( nel = 0; vals[nel] != NULL; nel++ ) ; /* NULL */ - qsort( vals, nel, sizeof(char *), (void *) cmp ); + qsort( vals, nel, sizeof(char *), cmp ); return( 0 ); }