aboutsummaryrefslogtreecommitdiffstats
path: root/missing
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-12 13:23:20 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-12 13:23:20 +0000
commita00247f57a1b263d6eace43f36547766566c1de1 (patch)
tree667e5163bbaf6c944987b540521a96e8e321f749 /missing
parentd80a859d98a86e201075156a2b2cc5fa91aa4e08 (diff)
downloadruby-a00247f57a1b263d6eace43f36547766566c1de1.tar.gz
* time.c (rb_big_abs_find_minbit): use ffs().
* configure.in: check ffs(). * missing/ffs.c: new file. * include/ruby/missing.h (ffs): declared. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'missing')
-rw-r--r--missing/ffs.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/missing/ffs.c b/missing/ffs.c
new file mode 100644
index 0000000000..9bbb707959
--- /dev/null
+++ b/missing/ffs.c
@@ -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;
+}