2010-03-03 15:27:30 +01:00
|
|
|
/* _strnlen() Author: Kees J. Bot */
|
|
|
|
/* 1 Jan 1994 */
|
|
|
|
|
|
|
|
/* size_t _strnlen(const char *s, size_t ecx) */
|
|
|
|
/* Return the length of a string. */
|
|
|
|
/* */
|
2010-08-17 18:44:07 +02:00
|
|
|
#include <machine/asm.h>
|
|
|
|
|
|
|
|
ENTRY(_strnlen)
|
2010-03-03 15:27:30 +01:00
|
|
|
push %ebp
|
|
|
|
movl %esp, %ebp
|
|
|
|
push %edi
|
|
|
|
movl 8(%ebp), %edi /* edi = string */
|
|
|
|
xorb %al, %al /* Look for a zero byte */
|
|
|
|
movl %ecx, %edx /* Save maximum count */
|
|
|
|
cmpb $1, %cl /* 'Z' bit must be clear if ecx = 0 */
|
|
|
|
cld
|
|
|
|
|
|
|
|
repne scasb /* Look for zero */
|
|
|
|
jne no0
|
|
|
|
incl %ecx /* Don't count zero byte */
|
|
|
|
no0:
|
|
|
|
movl %edx, %eax
|
|
|
|
subl %ecx, %eax /* Compute bytes scanned */
|
|
|
|
pop %edi
|
|
|
|
pop %ebp
|
|
|
|
ret
|