]> git.sur5r.net Git - cc65/commitdiff
Fixed strpbrk(). 670/head
authorGreg King <gregdk@users.sf.net>
Tue, 29 May 2018 18:29:50 +0000 (14:29 -0400)
committerGreg King <gregdk@users.sf.net>
Tue, 29 May 2018 18:29:50 +0000 (14:29 -0400)
Added its prototype.  Documented it.

doc/funcref.sgml
include/string.h
libsrc/common/strpbrk.s
testcode/lib/strpbrk-test.c [new file with mode: 0644]

index 4e35ebb7ef95d4cf7790850d32b16abd571a3918..edb510e374c77996790c9e525eb558edc64550aa 100644 (file)
@@ -4,7 +4,7 @@
 <title>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.
index 46095a52542ab7213a71808e988152dbd20e1486..2f59531967b04560a55396b5884f2e8303a21415 100644 (file)
@@ -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);
index 5d1482913d73f0366f8707de12bb0b8e7c601b18..a7060415e19bbf13f6ec48085ec52cf51154bea1 100644 (file)
@@ -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 (file)
index 0000000..25c2c2f
--- /dev/null
@@ -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");
+}