diff options
author | Ondrej Bilka <neleai@seznam.cz> | 2013-02-11 23:18:09 +0100 |
---|---|---|
committer | Ondrej Bilka <neleai@seznam.cz> | 2013-02-11 23:18:09 +0100 |
commit | 41eda41d7489a428abb46202482136a540ec23dc (patch) | |
tree | b0adeba7c44ac543ba0085bb2f742c196e65348d /bits | |
parent | 8ded91fb377ad48c66e8b44929af7214f40f3557 (diff) | |
download | glibc-41eda41d7489a428abb46202482136a540ec23dc.zip glibc-41eda41d7489a428abb46202482136a540ec23dc.tar.gz glibc-41eda41d7489a428abb46202482136a540ec23dc.tar.bz2 |
Add inline bsearch expansion.
Diffstat (limited to 'bits')
-rw-r--r-- | bits/stdlib-bsearch.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/bits/stdlib-bsearch.h b/bits/stdlib-bsearch.h new file mode 100644 index 0000000..4cb58ab --- /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; +} |