diff options
-rw-r--r-- | include/string.h | 10 | ||||
-rw-r--r-- | libc/inet/rpc/svc.c | 2 | ||||
-rw-r--r-- | libc/string/ffs.c | 16 | ||||
-rw-r--r-- | libc/string/ffsll.c | 40 |
4 files changed, 59 insertions, 9 deletions
diff --git a/include/string.h b/include/string.h index ca22055ed..66f64e7d1 100644 --- a/include/string.h +++ b/include/string.h @@ -374,11 +374,10 @@ extern char *rindex (__const char *__s, int __c) /* Return the position of the first bit set in I, or 0 if none are set. The least-significant bit is position 1, the most-significant 32. */ extern int ffs (int __i) __THROW __attribute__ ((__const__)); -libc_hidden_proto(ffs) /* The following two functions are non-standard but necessary for non-32 bit platforms. */ -# if 0 /*#ifdef __USE_GNU*/ +#ifdef __USE_GNU extern int ffsl (long int __l) __THROW __attribute__ ((__const__)); # ifdef __GNUC__ __extension__ extern int ffsll (long long int __ll) @@ -386,6 +385,13 @@ __extension__ extern int ffsll (long long int __ll) # endif # endif +#ifdef _LIBC +extern __typeof(ffs) __libc_ffs; +libc_hidden_proto(__libc_ffs); +extern __typeof(ffsll) __libc_ffsll; +libc_hidden_proto(__libc_ffsll) +#endif + /* Compare S1 and S2, ignoring case. */ extern int strcasecmp (__const char *__s1, __const char *__s2) __THROW __attribute_pure__ __nonnull ((1, 2)); diff --git a/libc/inet/rpc/svc.c b/libc/inet/rpc/svc.c index 0f5300c8b..03b406200 100644 --- a/libc/inet/rpc/svc.c +++ b/libc/inet/rpc/svc.c @@ -452,7 +452,7 @@ svc_getreqset (fd_set *readfds) setsize = _rpc_dtablesize (); maskp = (u_int32_t *) readfds->fds_bits; for (sock = 0; sock < setsize; sock += 32) - for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1))) + for (mask = *maskp++; (bit = __libc_ffs (mask)); mask ^= (1 << (bit - 1))) svc_getreq_common (sock + bit - 1); } libc_hidden_def(svc_getreqset) diff --git a/libc/string/ffs.c b/libc/string/ffs.c index 22efe4a1e..4a5336d47 100644 --- a/libc/string/ffs.c +++ b/libc/string/ffs.c @@ -5,12 +5,12 @@ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ -/* ffsl,ffsll */ - +#include <limits.h> +#define ffsl __something_else #include "_string.h" - - -int ffs(int i) +#undef ffsl + +int __libc_ffs(int i) { #if 1 /* inlined binary search method */ @@ -51,4 +51,8 @@ int ffs(int i) return n; #endif } -libc_hidden_def(ffs) +libc_hidden_def(__libc_ffs) +weak_alias(__libc_ffs,ffs) +#if ULONG_MAX == UINT_MAX +weak_alias (__libc_ffs, ffsl) +#endif diff --git a/libc/string/ffsll.c b/libc/string/ffsll.c new file mode 100644 index 000000000..29e9ba9d9 --- /dev/null +++ b/libc/string/ffsll.c @@ -0,0 +1,40 @@ +/* Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Torbjorn Granlund (tege@sics.se). + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <limits.h> +#define ffsl __something_else +#include "_string.h" +#undef ffsl + +/* Find the first bit set in I. */ +int __libc_ffsll (long long int i) +{ + unsigned long long int x = i & -i; + + if (x <= 0xffffffff) + return __libc_ffs (i); + else + return 32 + __libc_ffs (i >> 32); +} +libc_hidden_def(__libc_ffsll) + +weak_alias (__libc_ffsll, ffsll) +#if ULONG_MAX != UINT_MAX +weak_alias (__libc_ffsll, ffsl) +#endif |