size_t strlen_d(const char *str) {
const char *char_ptr;
const ulong *longword_ptr;
register ulong longword, himagic, lomagic;
for (char_ptr = str; ((ulong)char_ptr
& (sizeof(ulong) - 1)) != 0;
++char_ptr) {
if (*char_ptr == '\0')
return char_ptr - str;
}
longword_ptr = (ulong*)char_ptr;
himagic = 0x80808080L;
lomagic = 0x01010101L;
while (1) {
longword = *longword_ptr++;
if (((longword - lomagic) & himagic) != 0) {
const char *cp = (const char*)(longword_ptr - 1);
if (cp[0] == 0)
return cp - str;
if (cp[1] == 0)
return cp - str + 1;
if (cp[2] == 0)
return cp - str + 2;
if (cp[3] == 0)
return cp - str + 3;
}
}
}