Added the capability to search for the terminating zero of the given string.

Don't know what the standard says about it, but the feature seems reasonable
and other compilers handle it this way.


git-svn-id: svn://svn.cc65.org/cc65/trunk@42 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2000-06-09 12:07:53 +00:00
parent 84066d5f1c
commit 4744e3602c
1 changed files with 23 additions and 16 deletions

View File

@ -4,9 +4,9 @@
; const char* strchr (const char* s, int c);
;
.export _strchr
.import popax
.importzp ptr1, tmp1
.export _strchr
.import popax
.importzp ptr1, tmp1
_strchr:
sta tmp1 ; Save c
@ -15,27 +15,34 @@ _strchr:
stx ptr1+1
ldy #0
scloop: lda (ptr1),y ; get next char
beq strz ; jump if end of string
cmp tmp1 ; found?
beq strf ; jump if yes
Loop: lda (ptr1),y ; Get next char
beq EOS ; Jump on end of string
cmp tmp1 ; Found?
beq Found ; Jump if yes
iny
bne scloop
bne Loop
inc ptr1+1
bne scloop ; jump always
bne Loop ; Branch always
; found, calculate pointer to c
; End of string. Check if we're searching for the terminating zero
strf: ldx ptr1+1 ; get high byte of pointer
tya ; low byte offset
EOS: lda tmp1 ; Get the char we're searching for
bne NotFound ; Jump if not searching for terminator
; Found. Calculate pointer to c.
Found: ldx ptr1+1 ; Load high byte of pointer
tya ; Low byte offset
clc
adc ptr1
bcc str1
bcc Found1
inx
str1: rts
Found1: rts
; not found, return zero
; Not found, return NULL
strz: tax ; return 0
NotFound:
lda #0
tax
rts