aboutsummaryrefslogtreecommitdiff
path: root/pk/strlen.c
blob: 12b38360381b04319d0688466c56dc0a8c742d41 (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
#include <string.h>
#include <limits.h>

#if ULONG_MAX != 18446744073709551615UL && ULONG_MAX != 4294967295UL
# error need sizeof(long) == 4 or sizeof(long) == 8
#endif

// from http://www-graphics.stanford.edu/~seander/bithacks.html
static inline long hasZeroByte(long l)
{
#if ULONG_MAX == 4294967295UL
  return (l - 0x01010101UL) & ~l & 0x80808080UL;
#else
  return (l - 0x0101010101010101UL) & ~l & 0x8080808080808080UL;
#endif
}

size_t strlen(const char* s)
{
  size_t i = 0;

  // use optimized version if string starts on a long boundary
  if(((long)s & (sizeof(long)-1)) == 0)
    while(!hasZeroByte(*(long*)(s+i)))
      i += sizeof(long);

  while(s[i])
    i++;

  return i;
}