1/*
2** Copyright 2001, Travis Geiselbrecht. All rights reserved.
3** Distributed under the terms of the NewOS License.
4*/
5
6#include <string.h>
7#include <SupportDefs.h>
8
9
10/* From Bit twiddling hacks:
11	http://graphics.stanford.edu/~seander/bithacks.html */
12#define LACKS_ZERO_BYTE(value) \
13	(((value - 0x01010101) & ~value & 0x80808080) == 0)
14
15
16size_t
17strlen(const char* string)
18{
19	size_t length = 0;
20
21	/* Align access for four byte reads */
22	for (; (((addr_t)string + length) & 3) != 0; length++) {
23		if (string[length] == '\0')
24			return length;
25	}
26
27	/* Check four bytes for zero char */
28	uint32* valuePointer = (uint32*)(string + length);
29	for (; LACKS_ZERO_BYTE(*valuePointer); valuePointer++)
30		;
31
32	/* Find the exact length */
33	for (length = ((char*)valuePointer) - string; string[length] != '\0';
34		length++)
35		;
36
37	return length;
38}
39