blob: 96da5a5405e0038db8387c5fe13a0e69297bfa75 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <endian.h>
#include "dietfeatures.h"
#include <string.h>
#ifdef WANT_SMALL_STRING_ROUTINES
size_t strlen(const char *s) {
register size_t 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
|