aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/lib
diff options
context:
space:
mode:
Diffstat (limited to 'extras/mini-os/lib')
-rw-r--r--extras/mini-os/lib/string.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/extras/mini-os/lib/string.c b/extras/mini-os/lib/string.c
index f6dfa609d0..a6f2abe0b0 100644
--- a/extras/mini-os/lib/string.c
+++ b/extras/mini-os/lib/string.c
@@ -18,6 +18,43 @@
****************************************************************************
*/
+#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