diff options
Diffstat (limited to 'extras')
-rw-r--r-- | extras/mini-os/include/posix/strings.h | 4 | ||||
-rw-r--r-- | extras/mini-os/lib/string.c | 50 |
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 |