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

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

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;
}