summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Bilka <neleai@seznam.cz>2013-02-11 23:18:09 +0100
committerOndrej Bilka <neleai@seznam.cz>2013-02-11 23:18:09 +0100
commit41eda41d7489a428abb46202482136a540ec23dc (patch)
treeb0adeba7c44ac543ba0085bb2f742c196e65348d
parent8ded91fb377ad48c66e8b44929af7214f40f3557 (diff)
Add inline bsearch expansion.
-rw-r--r--ChangeLog6
-rw-r--r--bits/stdlib-bsearch.h43
-rw-r--r--stdlib/bsearch.c31
-rw-r--r--stdlib/stdlib.h4
4 files changed, 56 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index e6a7fdf491..99ec09702e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/bits/stdlib-bsearch.h b/bits/stdlib-bsearch.h
new file mode 100644
index 0000000000..4cb58abe6c
--- /dev/null
+++ b/bits/stdlib-bsearch.h
@@ -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;
+}
diff --git a/stdlib/bsearch.c b/stdlib/bsearch.c
index 55b4f37527..4a357efeef 100644
--- a/stdlib/bsearch.c
+++ b/stdlib/bsearch.c
@@ -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)
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index b49a41cc5d..fa1175c028 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -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,