2 ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
7 #include <SupportDefs.h>
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)
17 strnlen(const char* string
, size_t count
)
20 /* Align access for four byte reads */
21 for (; (((addr_t
)string
+ length
) & 3) != 0; length
++) {
22 if (length
== count
|| string
[length
] == '\0')
26 /* Check four bytes for zero char */
27 const uint32
* kMaxScanPosition
= (uint32
*)(string
+ count
- 4);
28 uint32
* valuePointer
= (uint32
*)(string
+ length
);
29 for (; valuePointer
<= kMaxScanPosition
&& LACKS_ZERO_BYTE(*valuePointer
);
33 /* Find the exact length */
34 for (length
= ((char*)valuePointer
) - string
; length
< count
35 && string
[length
] != '\0'; length
++)