ruby-changes:15826
From: akr <ko1@a...>
Date: Wed, 12 May 2010 22:23:41 +0900 (JST)
Subject: [ruby-changes:15826] Ruby:r27759 (trunk): * time.c (rb_big_abs_find_minbit): use ffs().
akr 2010-05-12 22:23:20 +0900 (Wed, 12 May 2010) New Revision: 27759 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27759 Log: * time.c (rb_big_abs_find_minbit): use ffs(). * configure.in: check ffs(). * missing/ffs.c: new file. * include/ruby/missing.h (ffs): declared. Added files: trunk/missing/ffs.c Modified files: trunk/ChangeLog trunk/configure.in trunk/include/ruby/missing.h trunk/time.c Index: time.c =================================================================== --- time.c (revision 27758) +++ time.c (revision 27759) @@ -345,7 +345,7 @@ return Qnil; res = mul(LONG2NUM(i), INT2FIX(SIZEOF_BDIGITS * CHAR_BIT)); d = ds[i]; - res = add(res, LONG2FIX(bdigit_find_maxbit(d & (~d+1)))); + res = add(res, LONG2FIX(ffs(d)-1)); return res; } Index: include/ruby/missing.h =================================================================== --- include/ruby/missing.h (revision 27758) +++ include/ruby/missing.h (revision 27759) @@ -159,6 +159,10 @@ RUBY_EXTERN size_t strlcat(char *, const char*, size_t); #endif +#ifndef HAVE_FFS +RUBY_EXTERN int ffs(int); +#endif + #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ Index: configure.in =================================================================== --- configure.in (revision 27758) +++ configure.in (revision 27759) @@ -1117,7 +1117,7 @@ AC_REPLACE_FUNCS(dup2 memmove strerror\ strchr strstr crypt flock\ isnan finite isinf hypot acosh erf tgamma lgamma_r cbrt \ - strlcpy strlcat) + strlcpy strlcat ffs) AC_CACHE_CHECK(for signbit, rb_cv_have_signbit, [AC_TRY_LINK([ #include <math.h> Index: ChangeLog =================================================================== --- ChangeLog (revision 27758) +++ ChangeLog (revision 27759) @@ -1,3 +1,13 @@ +Wed May 12 22:22:05 2010 Tanaka Akira <akr@f...> + + * time.c (rb_big_abs_find_minbit): use ffs(). + + * configure.in: check ffs(). + + * missing/ffs.c: new file. + + * include/ruby/missing.h (ffs): declared. + Wed May 12 16:43:12 2010 Nobuyoshi Nakada <nobu@r...> * numeric.c (flo_to_s): fixed broken output including nuls. Index: missing/ffs.c =================================================================== --- missing/ffs.c (revision 0) +++ missing/ffs.c (revision 27759) @@ -0,0 +1,47 @@ +/* ffs.c - find first set bit */ +/* ffs() is defined by POSIX. */ + +#include "ruby.h" + +int ffs(int arg) +{ + unsigned int x = (unsigned int)arg; + int r = 0; + + if (x == 0) + return 0; + +#if 32 < SIZEOF_INT * CHAR_BIT + if ((x & 0xffffffff) == 0) { + x >>= 32; + r += 32; + } +#endif + + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + + if ((x & 0x3) == 0) { + x >>= 2; + r += 2; + } + + if ((x & 0x1) == 0) { + x >>= 1; + r += 1; + } + + return r; +} -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/