From 88fdaeb490863621865fb95620b5d6bb7acad188 Mon Sep 17 00:00:00 2001 From: Sven Michael Klose Date: Fri, 24 Dec 2021 23:44:57 +0100 Subject: [PATCH] Add standard C library function strnlen(). --- include/string.h | 1 + libsrc/common/strnlen.s | 54 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 libsrc/common/strnlen.s diff --git a/include/string.h b/include/string.h index 2f5953196..74442415f 100644 --- a/include/string.h +++ b/include/string.h @@ -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); diff --git a/libsrc/common/strnlen.s b/libsrc/common/strnlen.s new file mode 100644 index 000000000..e748325e2 --- /dev/null +++ b/libsrc/common/strnlen.s @@ -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