aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/include/posix/strings.h4
-rw-r--r--extras/mini-os/lib/string.c50
2 files changed, 54 insertions, 0 deletions
diff --git a/extras/mini-os/include/posix/strings.h b/extras/mini-os/include/posix/strings.h
index 8619ba2865..4957c41ff7 100644
--- a/extras/mini-os/include/posix/strings.h
+++ b/extras/mini-os/include/posix/strings.h
@@ -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 */
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