|
|
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.