mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 17:29:50 +00:00
94 lines
2.6 KiB
ArmAsm
94 lines
2.6 KiB
ArmAsm
;
|
|
; 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
|
|
.import popax, popptr1
|
|
.importzp ptr1, ptr2, ptr3, tmp1, tmp2
|
|
.import ctypemaskdirect
|
|
.include "ctype.inc"
|
|
|
|
_strnicmp:
|
|
_strncasecmp:
|
|
|
|
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.
|
|
|
|
Loop: dec ptr3 ; decrement high byte
|
|
beq IncHi
|
|
|
|
; Compare a byte from the strings
|
|
|
|
Comp: lda (ptr2),y
|
|
sta tmp2 ; remember original char
|
|
jsr ctypemaskdirect ; get character classification
|
|
and #CT_LOWER ; lower case char?
|
|
beq L1 ; jump if no
|
|
lda #<('A'-'a') ; make upper case char
|
|
adc tmp2 ; ctypemaskdirect ensures carry clear!
|
|
sta tmp2 ; remember upper case equivalent
|
|
|
|
L1: lda (ptr1),y ; get character from first string
|
|
sta tmp1 ; remember original char
|
|
jsr ctypemaskdirect ; get character classification
|
|
and #CT_LOWER ; lower case char?
|
|
beq L2 ; jump if no
|
|
lda #<('A'-'a') ; make upper case char
|
|
adc tmp1 ; ctypemaskdirect ensures carry clear!
|
|
sta tmp1 ; remember upper case equivalent
|
|
|
|
L2: ldx tmp1
|
|
cpx tmp2 ; compare characters
|
|
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
|
|
bne Loop ; branch always
|
|
|
|
; Increment hi byte
|
|
|
|
IncHi: dec ptr3+1
|
|
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
|
|
ldx #$FF ; make result negative
|
|
rts
|
|
|
|
L3: ldx #$01 ; make result positive
|
|
rts
|