1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 23:29:39 +00:00
cc65/libsrc/common/strnicmp.s

94 lines
2.6 KiB
ArmAsm
Raw Permalink Normal View History

;
; Christian Groessler, 10.02.2009
; derived from strncmp.s and stricmp.s
;
; int __fastcall__ strnicmp (const char* s1, const char* s2, size_t count);
; int __fastcall__ strncasecmp (const char* s1, const char* s2, size_t count);
;
.export _strnicmp, _strncasecmp
2020-01-02 17:57:03 +00:00
.import popax, popptr1
.importzp ptr1, ptr2, ptr3, tmp1, tmp2
2020-04-02 20:58:16 +00:00
.import ctypemaskdirect
.include "ctype.inc"
_strnicmp:
_strncasecmp:
2020-11-01 21:59:07 +00:00
inx
stx ptr3+1
tax
inx
stx ptr3 ; save count with each byte incremented separately
; Get the remaining arguments
jsr popax ; get s2
sta ptr2
stx ptr2+1
jsr popptr1 ; get s1
; Loop setup
; ldy #0 Y=0 guaranteed by popptr1
; Start of compare loop. Check the counter.
2020-11-03 10:54:50 +00:00
Loop: dec ptr3 ; decrement high byte
beq IncHi
; Compare a byte from the strings
Comp: lda (ptr2),y
2020-01-02 17:57:03 +00:00
sta tmp2 ; remember original char
2020-04-02 20:58:16 +00:00
jsr ctypemaskdirect ; get character classification
and #CT_LOWER ; lower case char?
beq L1 ; jump if no
2020-01-02 17:57:03 +00:00
lda #<('A'-'a') ; make upper case char
2020-04-02 20:58:16 +00:00
adc tmp2 ; ctypemaskdirect ensures carry clear!
2020-01-02 17:57:03 +00:00
sta tmp2 ; remember upper case equivalent
L1: lda (ptr1),y ; get character from first string
sta tmp1 ; remember original char
2020-04-02 20:58:16 +00:00
jsr ctypemaskdirect ; get character classification
and #CT_LOWER ; lower case char?
beq L2 ; jump if no
2020-01-02 17:57:03 +00:00
lda #<('A'-'a') ; make upper case char
2020-04-02 20:58:16 +00:00
adc tmp1 ; ctypemaskdirect ensures carry clear!
2020-04-02 08:03:01 +00:00
sta tmp1 ; remember upper case equivalent
2020-01-02 17:57:03 +00:00
L2: ldx tmp1
cpx tmp2 ; compare characters
2020-04-02 08:03:01 +00:00
bne NotEqual ; jump if strings different
txa ; end of strings?
beq Equal1 ; jump if EOS reached, a/x == 0
; Increment the pointers
iny
bne Loop
inc ptr1+1
inc ptr2+1
2020-04-02 08:03:01 +00:00
bne Loop ; branch always
; Increment hi byte
2020-11-01 21:59:07 +00:00
IncHi: dec ptr3+1
2020-04-02 08:03:01 +00:00
bne Comp ; jump if counter not zero
; Exit code if strings are equal. a/x not set
Equal: lda #$00
tax
Equal1: rts
; Exit code if strings not equal
NotEqual:
bcs L3
2020-04-02 08:03:01 +00:00
ldx #$FF ; make result negative
rts
2020-04-02 08:03:01 +00:00
L3: ldx #$01 ; make result positive
rts