1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00

Add standard C library function strnlen().

This commit is contained in:
Sven Michael Klose 2021-12-24 23:44:57 +01:00 committed by mrdudz
parent be594912eb
commit 88fdaeb490
2 changed files with 55 additions and 0 deletions

View File

@ -50,6 +50,7 @@ char* __fastcall__ strcpy (char* dest, const char* src);
size_t __fastcall__ strcspn (const char* s1, const char* s2);
char* __fastcall__ strerror (int errcode);
size_t __fastcall__ strlen (const char* s);
size_t __fastcall__ strnlen (const char* s, size_t maxlen);
char* __fastcall__ strncat (char* s1, const char* s2, size_t count);
int __fastcall__ strncmp (const char* s1, const char* s2, size_t count);
char* __fastcall__ strncpy (char* dest, const char* src, size_t count);

54
libsrc/common/strnlen.s Normal file
View File

@ -0,0 +1,54 @@
; size_t __fastcall__ strnlen (const char* s, size_t maxlen);
.export _strnlen
.import popax
.importzp ptr1, tmp1, tmp2, tmp3, tmp4
.proc _strnlen
; Fetch string pointer.
sta ptr1
stx ptr1+1
; Clear return value.
lda #0
sta tmp1
sta tmp2
; Get maximum length.
jsr popax
sta tmp3
inc tmp3
inx
stx tmp4
;;; Loop over string.
ldy #0
; Decrement maximum length.
next: dec tmp3
bne l2
dec tmp4
beq done
l2:
lda (ptr1),y
beq done
; Step to next character.
inc ptr1
bne l1
inc ptr1+1
l1:
; Increment return value.
inc tmp1
bne next
inc tmp2
jmp next
done: lda tmp1
ldx tmp2
rts
.endproc