summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/strlen.c
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-01-04 20:04:45 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-01-04 20:04:45 +0000
commit02fec4701cee79f875c1d02b8b4aee09380dbcb8 (patch)
treef4f291aedbb2e60ee58351481858a8cd3ec80b6b /mdk-stage1/dietlibc/lib/strlen.c
parent9887fe04751edf39e8389f2c3ec3f020b5e1c17d (diff)
downloaddrakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.gz
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.bz2
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.tar.xz
drakx-backup-do-not-use-02fec4701cee79f875c1d02b8b4aee09380dbcb8.zip
integrate dietlibc/stdio per default for cdrom and disk only installs
Diffstat (limited to 'mdk-stage1/dietlibc/lib/strlen.c')
-rw-r--r--mdk-stage1/dietlibc/lib/strlen.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c
new file mode 100644
index 000000000..56c085dac
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/strlen.c
@@ -0,0 +1,47 @@
+#include <endian.h>
+#include "dietfeatures.h"
+#include <string.h>
+
+#ifdef WANT_SMALL_STRING_ROUTINES
+size_t strlen(const char *s) {
+ register int i;
+ if (!s) return 0;
+ for (i=0; *s; ++s) ++i;
+ return i;
+}
+#else
+static const unsigned long magic = 0x01010101;
+
+size_t strlen(const char *s)
+{
+ const char *t = s;
+ unsigned long word;
+
+ if (!s) return 0;
+
+ /* Byte compare up until word boundary */
+ for (; ((unsigned long) t & 3); t++)
+ if (!*t) return t - s;
+
+ /* Word compare */
+ do {
+ word = *((unsigned long *) t); t += 4;
+ word = (word - magic) &~ word;
+ word &= (magic << 7);
+ } while (word == 0);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* word & 0x80808080 == word */
+ word = (word - 1) & (magic << 10);
+ word += (word << 8) + (word << 16);
+ t += word >> 26;
+#else
+ if ((word & 0x80800000) == 0) {
+ word <<= 16;
+ t += 2;
+ }
+ if ((word & 0x80000000) == 0) t += 1;
+#endif
+ return ((const char *) t) - 4 - s;
+}
+#endif