]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/mini-os.git/commitdiff
minios: implement ffs, ffsl and ffsll.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 28 May 2009 08:41:59 +0000 (09:41 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 28 May 2009 08:41:59 +0000 (09:41 +0100)
The first function is compiled only in case minios is compiled without
newlib, since newlib already provides an implementation for ffs.
On the other hand ffsl and ffsll are always compiled because newlib
misses those functions.
This patch also provides an implementation for __ffsti2 and __ffsdi2
because they are needed by gcc in order to successfully link ffsll.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
include/posix/strings.h
lib/string.c

index 8619ba28656af01c9489a5fd3b97d125da13cd11..4957c41ff71d9359276318aff5ca978e6fa7496c 100644 (file)
@@ -5,4 +5,8 @@
 
 #define bzero(ptr, size) (memset((ptr), '\0', (size)), (void) 0)
 
+int ffs (int i);
+int ffsl (long int li);
+int ffsll (long long int lli);
+
 #endif /* _POSIX_STRINGS_H */
index f6dfa609d0a2a13a87c1a9fbf832601394cc0644..a6f2abe0b0906cc3497ca522a901abe99ef71b69 100644 (file)
  ****************************************************************************
  */
 
+#include <strings.h>
+
+/* newlib defines ffs but not ffsll or ffsl */
+int __ffsti2 (long long int lli)
+{
+    int i, num, t, tmpint, len;
+
+    num = sizeof(long long int) / sizeof(int);
+    if (num == 1) return (ffs((int) lli));
+    len = sizeof(int) * 8;
+
+    for (i = 0; i < num; i++) {
+        tmpint = (int) (((lli >> len) << len) ^ lli);
+
+        t = ffs(tmpint);
+        if (t)
+            return (t + i * len);
+        lli = lli >> len;
+    }
+    return 0;
+}
+
+int __ffsdi2 (long int li)
+{
+    return __ffsti2 ((long long int) li);
+}
+
+int ffsl (long int li)
+{
+    return __ffsti2 ((long long int) li);
+}
+
+int ffsll (long long int lli)
+{
+    return __ffsti2 (lli);
+}
+
 #if !defined HAVE_LIBC
 
 #include <os.h>
@@ -175,4 +212,17 @@ char *strdup(const char *x)
     return res;
 }
 
+int ffs(int i)
+{
+   int c = 1;
+
+   do {
+      if (i & 1)
+         return (c);
+      i = i >> 1;
+      c++;
+   } while (i);
+   return 0;
+}
+
 #endif