55 lines
898 B
ArmAsm
55 lines
898 B
ArmAsm
/*
|
|
* Return the number of characters in the maximum leading segment
|
|
* of string which consists solely of characters from charset.
|
|
*
|
|
* int
|
|
* strspn(string, charset)
|
|
* char *string;
|
|
* register char *charset;
|
|
* {
|
|
* register char *p, *q;
|
|
* char rl0, rl1;
|
|
*
|
|
* for(q=string; (rl0=*q) != '\0'; ++q) {
|
|
* p = charset;
|
|
* goon:
|
|
* rl1 = *p++;
|
|
* if (rl1 == '\0')
|
|
* break;
|
|
* if (rl0 == rl1)
|
|
* continue;
|
|
* goto gogon;
|
|
* }
|
|
* return(q-string);
|
|
* }
|
|
*/
|
|
.seg
|
|
fp := r13
|
|
FP := rr12
|
|
sp := r15
|
|
SP := rr14
|
|
.psec
|
|
.code
|
|
_strspn::
|
|
ldm r2,|_stkseg+4|(sp),#4 // rr2 <-> q=string , rr4 <-> charset
|
|
~for1:
|
|
ldb rl0,@rr2 // rl0=*q
|
|
testb rl0
|
|
jr nz,~L1
|
|
~finis:
|
|
sub r3,|_stkseg+6|(sp)
|
|
ld r2,r3
|
|
ret
|
|
~L1:
|
|
ldl rr6,rr4 // rr6 <-> p=charset
|
|
~for2:
|
|
ldb rl1,@rr6 // rl1=*p
|
|
testb rl1
|
|
jr z,~finis
|
|
inc r7,#1 // p++
|
|
cpb rl0,rl1
|
|
jr ne,~for2
|
|
inc r3,#1 // q++
|
|
jr ~for1
|
|
}
|