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  | 
