Add inline bsearch expansion.

This commit is contained in:
Ondrej Bilka 2013-02-11 23:18:09 +01:00
parent 8ded91fb37
commit 41eda41d74
4 changed files with 56 additions and 28 deletions

View File

@ -1,3 +1,9 @@
2013-02-09 Ondřej Bílka <neleai@seznam.cz>
* bits/stdlib-bsearch.h: New file.
* stdlib/bsearch.c: Include bits/stdlib-bsearch.h.
* stdlib/stdlib.h (bsearch): Add inline bsearch.
2013-02-11 Roland McGrath <roland@hack.frob.com>
* manual/conf.texi (General Limits): Fix SSIZE_MAX type to ssize_t.

43
bits/stdlib-bsearch.h Normal file
View File

@ -0,0 +1,43 @@
/* Perform binary search - inline version.
Copyright (C) 1991-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
__extern_inline void *
bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar)
{
size_t __l, __u, __idx;
const void *__p;
int __comparison;
__l = 0;
__u = __nmemb;
while (__l < __u)
{
__idx = (__l + __u) / 2;
__p = (void *) (((const char *) __base) + (__idx * __size));
__comparison = (*__compar) (__key, __p);
if (__comparison < 0)
__u = __idx;
else if (__comparison > 0)
__l = __idx + 1;
else
return (void *) __p;
}
return NULL;
}

View File

@ -17,32 +17,7 @@
#include <stdlib.h>
/* Perform a binary search for KEY in BASE which has NMEMB elements
of SIZE bytes each. The comparisons are done by (*COMPAR)(). */
void *
bsearch (const void *key, const void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *))
{
size_t l, u, idx;
const void *p;
int comparison;
l = 0;
u = nmemb;
while (l < u)
{
idx = (l + u) / 2;
p = (void *) (((const char *) base) + (idx * size));
comparison = (*compar) (key, p);
if (comparison < 0)
u = idx;
else if (comparison > 0)
l = idx + 1;
else
return (void *) p;
}
return NULL;
}
#undef __extern_inline
#define __extern_inline /* Empty, so we get a normal definition. */
#include <bits/stdlib-bsearch.h>
libc_hidden_def (bsearch)

View File

@ -756,6 +756,10 @@ extern void *bsearch (const void *__key, const void *__base,
size_t __nmemb, size_t __size, __compar_fn_t __compar)
__nonnull ((1, 2, 5)) __wur;
#ifdef __USE_EXTERN_INLINES
# include <bits/stdlib-bsearch.h>
#endif
/* Sort NMEMB elements of BASE, of SIZE bytes each,
using COMPAR to perform the comparisons. */
extern void qsort (void *__base, size_t __nmemb, size_t __size,