From 6d87370881b0b5ac2e8a054dacd1c1bf0c671253 Mon Sep 17 00:00:00 2001 From: Greg King Date: Tue, 29 May 2018 14:29:50 -0400 Subject: [PATCH] Fixed strpbrk(). Added its prototype. Documented it. --- doc/funcref.sgml | 35 ++++++++++++++++++-- include/string.h | 1 + libsrc/common/strpbrk.s | 65 +++++++++++++++++-------------------- testcode/lib/strpbrk-test.c | 26 +++++++++++++++ 4 files changed, 88 insertions(+), 39 deletions(-) create mode 100644 testcode/lib/strpbrk-test.c diff --git a/doc/funcref.sgml b/doc/funcref.sgml index 4e35ebb7e..edb510e37 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -4,7 +4,7 @@ cc65 function reference <author><url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline> <url url="mailto:greg.king5@verizon.net" name="Greg King"> -<date>2018-05-23 +<date>2018-05-29 <abstract> cc65 is a C compiler for 6502 based systems. This function reference describes @@ -717,6 +717,7 @@ communication, see also <tt>testcode/lib/ser-test.c</tt>. <item><ref id="strncmp" name="strncmp"> <item><ref id="strncpy" name="strncpy"> <item><ref id="strnicmp" name="strnicmp"> +<item><ref id="strpbrk" name="strpbrk"> <item><ref id="strqtok" name="strqtok"> <item><ref id="strrchr" name="strrchr"> <item><ref id="strspn" name="strspn"> @@ -6802,6 +6803,7 @@ be used in presence of a prototype. </itemize> <tag/Availability/ISO 9899 <tag/See also/ +<ref id="strpbrk" name="strpbrk">, <ref id="strqtok" name="strqtok">, <ref id="strspn" name="strspn">, <ref id="strstr" name="strstr">, @@ -7092,6 +7094,32 @@ be used in presence of a prototype. </quote> +<sect1>strpbrk<label id="strpbrk"><p> + +<quote> +<descrip> +<tag/Function/Find a character in a string, from a set of characters. +<tag/Header/<tt/<ref id="string.h" name="string.h">/ +<tag/Declaration/<tt/char* __fastcall__ strpbrk (const char* str, const char* set);/ +<tag/Description/<tt/strpbrk()/ searches within <tt/str/ for the first +occurance of any character from <tt/set/. It returns a pointer to that +character if found; otherwise, it returns <tt/NULL/. +<tag/Notes/<itemize> +<item>The function is available only as a fastcall function; +so, it should be used only in the presence of a prototype. +</itemize> +<tag/Availability/ISO 9899 +<tag/See also/ +<ref id="strchr" name="strchr">, +<ref id="strcspn" name="strcspn">, +<ref id="strqtok" name="strqtok">, +<ref id="strspn" name="strspn">, +<ref id="strtok" name="strtok"> +<tag/Example/None. +</descrip> +</quote> + + <sect1>strqtok<label id="strqtok"><p> <quote> @@ -7116,7 +7144,7 @@ a second <tt/s1/ string before it finishes the first one. <tag/Availability/cc65 <tag/See also/ <ref id="strcspn" name="strcspn">, -<!-- <ref id="strpbrk" name="strpbrk">, --> +<ref id="strpbrk" name="strpbrk">, <ref id="strspn" name="strspn">, <ref id="strtok" name="strtok"> <tag/Example/None. @@ -7164,6 +7192,7 @@ be used in presence of a prototype. <tag/Availability/ISO 9899 <tag/See also/ <ref id="strcspn" name="strcspn">, +<ref id="strpbrk" name="strpbrk">, <ref id="strstr" name="strstr"> <tag/Example/None. </descrip> @@ -7216,7 +7245,7 @@ a second <tt/s1/ string before it finishes the first one. <tag/Availability/ISO 9899 <tag/See also/ <ref id="strcspn" name="strcspn">, -<!-- <ref id="strpbrk" name="strpbrk">, --> +<ref id="strpbrk" name="strpbrk">, <ref id="strqtok" name="strqtok">, <ref id="strspn" name="strspn"> <tag/Example/None. diff --git a/include/string.h b/include/string.h index 46095a525..2f5953196 100644 --- a/include/string.h +++ b/include/string.h @@ -53,6 +53,7 @@ size_t __fastcall__ strlen (const char* s); 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); +char* __fastcall__ strpbrk (const char* str, const char* set); char* __fastcall__ strrchr (const char* s, int c); size_t __fastcall__ strspn (const char* s1, const char* s2); char* __fastcall__ strstr (const char* str, const char* substr); diff --git a/libsrc/common/strpbrk.s b/libsrc/common/strpbrk.s index 5d1482913..a7060415e 100644 --- a/libsrc/common/strpbrk.s +++ b/libsrc/common/strpbrk.s @@ -1,60 +1,53 @@ -; -; Ullrich von Bassewitz, 11.06.1998 ; -; char* strpbrk (const char* s1, const char* s2); +; 1998-06-11, Ullrich von Bassewitz +; 2018-05-29, Greg King +; +; char* __fastcall__ strpbrk (const char* str, const char* set); ; .export _strpbrk - .import popax, return0 - .importzp ptr1, ptr2, tmp1, tmp2, tmp3 + + .import popax + .importzp ptr1, ptr2, tmp2, tmp3 _strpbrk: - jsr popax ; get s2 - sta ptr2 + sta ptr2 ; store set stx ptr2+1 - jsr popax ; get s1 - sta ptr1 - stx ptr1+1 - ldy #$00 + jsr popax + stx ptr1+1 ; store str's high byte + ldx #<$0000 + stx ptr1 + tay ; use str's low byte as index -L1: lda (ptr1),y ; get next char from s1 +L1: lda (ptr1),y ; get next char from str beq L9 ; jump if done sta tmp2 ; save char - iny - bne L2 - inc ptr1+1 -L2: sty tmp3 ; save index into s1 + sty tmp3 ; save index into str - ldy #0 ; get index into s2 -L3: lda (ptr2),y ; + ldy #$00 +L3: lda (ptr2),y ; look at each char in set beq L4 ; jump if done cmp tmp2 - beq L6 + beq L6 ; break out of loops if something found iny bne L3 -; The character was not found in s2. Increment the counter and start over +; The character was not found in set. Increment the counter; and start over. L4: ldy tmp3 ; reload index - inx - bne L1 - inc tmp1 + iny bne L1 + inc ptr1+1 + bne L1 ; branch always -; A character was found. Calculate a pointer to this char in s1 and return it. +; A character was found. Return its str pointer. L6: ldx ptr1+1 - lda tmp3 ; get y offset - clc - adc ptr1 - bcc L7 - inx -L7: rts - -; None of the characters in s2 was found - return NULL - -L9: jmp return0 - - + lda tmp3 ; get .Y offset + rts +; None of the characters in set was found -- return NULL. +L9: ;ldx #>$0000 ; (set by prolog) + ;lda #<$0000 ; (set by '\0' at end of str) + rts diff --git a/testcode/lib/strpbrk-test.c b/testcode/lib/strpbrk-test.c new file mode 100644 index 000000000..25c2c2fbe --- /dev/null +++ b/testcode/lib/strpbrk-test.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <string.h> + +static const char fox[] = "The quick brown fox jumped over the lazy dogs."; + +void main (void) +{ + printf ("Testing strpbrk():\n"); + if (strpbrk (fox, "qwerty") != &fox[2]) { + printf ("\nThe first 'e' wasn't found.\n"); + } + if (strpbrk (fox, "QWERTY") != &fox[0]) { + printf ("The 'T' wasn't found.\n"); + } + if (strpbrk (fox, "asdfg") != &fox[16]) { + printf ("The 'f' wasn't found.\n"); + } + if (strpbrk (fox, "nxv,zmb") != &fox[10]) { + printf ("The 'b' wasn't found.\n"); + } + if (strpbrk (fox, "!@#$%^&*()-+=[];:',/?<>.") != &fox[45]) { + printf ("The '.' wasn't found.\n"); + } + + printf ("\nFinished.\n"); +}