|
|
1.1 ! root 1: .file "strncmp.s" ! 2: # @(#)strncmp.s 1.4 ! 3: # Fast assembler language version of the following C-program ! 4: # strncmp ! 5: # which represents the `standard' for the C-library. ! 6: ! 7: # Compare strings (at most n bytes): return *s1-*s2 for the last ! 8: # characters in s1 and s2 which were compared. ! 9: ! 10: # strncmp(s1, s2, n) ! 11: # register char *s1, *s2; ! 12: # register n; ! 13: # { ! 14: # if(s1 == s2) ! 15: # return(0); ! 16: # while(--n >= 0 && *s1 == *s2++) ! 17: # if(*s1++ == '\0') ! 18: # return(0); ! 19: # return((n < 0)? 0: *s1 - *--s2); ! 20: # } ! 21: .globl _strncmp ! 22: .text ! 23: .align 2 ! 24: _strncmp: ! 25: .word 0x0000 # uses regs. 0,1,2,3,4,5 ! 26: movl 12(ap),r4 # arg `n' ! 27: bgtr L1 # should be > 0 ! 28: L0: ! 29: clrl r0 # else return a zero ! 30: ret ! 31: L1: ! 32: movl 4(ap),r1 # working copy of s1 ! 33: movl 8(ap),r3 # working copy of s2 ! 34: cmpl r1,r3 # if pointers are eql, strings are also ! 35: beql L0 # return a zero ! 36: L2: ! 37: subl3 $65535,r4,r5 # memory for whether `n' <= 65535 ! 38: blss L3 # skip if r4 is not too big ! 39: movl $65535,r4 # else use big number (remdr in r5) ! 40: L3: ! 41: movl r1,r2 # hide r1 while searching for end ! 42: locc $0,r4,(r1) # search for terminal null in s1 ! 43: beql L4 # hop, null not found ! 44: clrl r5 # found, we sure won't need to go again ! 45: subl3 r2,r1,r4 # length of s1 ! 46: incl r4 # add 1 to account for the null ! 47: L4: ! 48: movl r2,r1 # restore copy of s1 for the cmpc3 ! 49: cmpc3 r4,(r1),(r3) # Compare s1 and s2 ! 50: beql L5 # skip if strings are ==, (so far) ! 51: subb3 (r3),(r1),r0 # else difference is returned ! 52: cvtbl r0,r0 # gotta make it an int ! 53: ret ! 54: L5: ! 55: movl r5,r4 ! 56: bgtr L2 # if more compare is needed, go back ! 57: ret # note that r0 is already 0 in this case
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.