This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Ping: [PATCH] Add inline bsearch expansion


On Fri, Feb 08, 2013 at 10:44:30AM -0800, Roland McGrath wrote:
> > 	* bits/stdlib-bsearch.h: New file.
> > 	* stdlib/bsearch.c: Include bits/stdlib-bsearch.h.
> > 	* stdlib/stdlib.h(bsearch): Add inline bsearch.
> 
> Space before that paren.
> 
> > --- /dev/null
> > +++ b/bits/stdlib-bsearch.h
> > @@ -0,0 +1,28 @@
> > +#ifdef __USE_EXTERN_INLINES
> 
> Every file needs the standard header comment (descriptive first line, then
> the standard copyright text).  Since the contents are copied from
> bsearch.c, use the same copyright year range that's already in that file.
> 
> Don't put that #ifdef inside this file.
> Instead, conditionalize its inclusion in stdlib.h.
> 
> > diff --git a/stdlib/bsearch.c b/stdlib/bsearch.c
> > index 55b4f37..04a9d9d 100644
> > --- a/stdlib/bsearch.c
> > +++ b/stdlib/bsearch.c
> > @@ -1,4 +1,4 @@
> > -/* Copyright (C) 1991-2013 Free Software Foundation, Inc.
> > +/* Copyright (C) 2013 Free Software Foundation, Inc.
> 
> Never remove old years from an existing copyright notice like this.
> 
Everything exept notice was changed so it looked like new file for me.
> 
> Thanks,
> Roland
Here is new version.

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.

---
 bits/stdlib-bsearch.h |   43 +++++++++++++++++++++++++++++++++++++++++++
 stdlib/bsearch.c      |   31 +++----------------------------
 stdlib/stdlib.h       |    4 ++++
 3 files changed, 50 insertions(+), 28 deletions(-)
 create mode 100644 bits/stdlib-bsearch.h

diff --git a/bits/stdlib-bsearch.h b/bits/stdlib-bsearch.h
new file mode 100644
index 0000000..b3ce741
--- /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 55b4f37..4a357ef 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 b49a41c..fa1175c 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,
-- 
1.7.4.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]