X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libraries%2Flibldap%2Fsort.c;h=2e5c09e0211186a9f3066588a6c6d5a7d2d4d8bb;hb=4d29df5bd1fabcdc50975651c746365686b62b53;hp=3f8484c8ea326e6d9ed140f73d3128c0bea7d27f;hpb=6939c531700652491f4be4688c6a1f35a1ab8a18;p=openldap diff --git a/libraries/libldap/sort.c b/libraries/libldap/sort.c index 3f8484c8ea..2e5c09e021 100644 --- a/libraries/libldap/sort.c +++ b/libraries/libldap/sort.c @@ -1,10 +1,19 @@ +/* sort.c -- LDAP library entry and value sort routines */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* Portions - * Copyright (c) 1994 Regents of the University of Michigan. +/* Portions Copyright (c) 1994 Regents of the University of Michigan. * All rights reserved. * * Redistribution and use in source and binary forms are permitted @@ -13,8 +22,6 @@ * may not be used to endorse or promote products derived from this * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. - * - * sort.c: LDAP library entry and value sort routines */ #include "portable.h" @@ -85,20 +92,36 @@ ldap_sort_entries( int (*cmp) (LDAP_CONST char *, LDAP_CONST char *) ) { - int i, count; + int i, count = 0; struct entrything *et; - LDAPMessage *e, *last; + LDAPMessage *e, *ehead = NULL, *etail = NULL; + LDAPMessage *ohead = NULL, *otail = NULL; LDAPMessage **ep; assert( ld != NULL ); - count = ldap_count_entries( ld, *chain ); - - if ( count < 0 ) { - return -1; + /* Separate entries from non-entries */ + for ( e = *chain; e; e=e->lm_chain ) { + if ( e->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) { + count++; + if ( !ehead ) ehead = e; + if ( etail ) etail->lm_chain = e; + etail = e; + } else { + if ( !ohead ) ohead = e; + if ( otail ) otail->lm_chain = e; + otail = e; + } + } - } else if ( count < 2 ) { + if ( count < 2 ) { /* zero or one entries -- already sorted! */ + if ( ehead ) { + etail->lm_chain = ohead; + *chain = ehead; + } else { + *chain = ohead; + } return 0; } @@ -108,7 +131,7 @@ ldap_sort_entries( return( -1 ); } - e = *chain; + e = ehead; for ( i = 0; i < count; i++ ) { et[i].et_cmp_fn = cmp; et[i].et_msg = e; @@ -124,7 +147,6 @@ ldap_sort_entries( e = e->lm_chain; } - last = e; qsort( et, count, sizeof(struct entrything), et_cmp ); @@ -135,7 +157,8 @@ ldap_sort_entries( LDAP_VFREE( et[i].et_vals ); } - *ep = last; + *ep = ohead; + LDAP_FREE( (char *) et ); return( 0 );