|
|
1.1 root 1: .file "memccpy.s"
2: # @(#)memccpy.s 1.5
3: # Fast assembler language version of the following C-program
4: # memccpy
5: # which represents the `standard' for the C-library.
6:
7: # Copy s2 to s1, stopping if character c is copied. Copy no more than n bytes.
8: # Return a pointer to the byte after character c in the copy,
9: # or NULL if c is not found in the first n bytes.
10:
11: # char *
12: # memccpy(s1, s2, c, n)
13: # register char *s1, *s2;
14: # register int c, n;
15: # {
16: # while (--n >= 0)
17: # if ((*s1++ = *s2++) == c)
18: # return (s1);
19: # return (0);
20: # }
21: .globl _memccpy
22: .text
23: .align 2
24: _memccpy:
25: .word 0x00c0 # uses regs. 0,1,2,3,4,5,6,7
26: movq 12(ap),r6 # escape char in r6, len in r7
27: tstl r7 # source length (arg `n')
28: bleq L2 # n <= 0, so return now!
29: movq 4(ap),r3 # dest ptr in r3, src ptr in r4
30: movl r4,r1 # src ptr in r1 also
31: L0:
32: cmpl $65535,r7 # is max len VERY large?
33: bgeq L1 # hop if not
34: locc r6,$65535,(r1) # look for escape char in src.
35: bneq L3 # found it
36: movc3 $65535,(r4),(r3) # copy all the chars
37: movl r1,r4 # updated src ptr
38: subl2 $65535,r7
39: jbr L0 # go look at some more chars
40: L1:
41: locc r6,r7,(r1) # look for escape char in src.
42: bneq L4 # found it
43: movc3 r7,(r4),(r3) # copy all the chars
44: ret # done (r0 is now 0)
45: L2:
46: clrl r0 # char not found, return zero
47: ret
48: L3:
49: movl $65535,r7 # len of BLOCK when len VERY large
50: L4:
51: subl2 r0,r7 # number of bytes to escape char
52: incl r7 # move the escape char also
53: movc3 r7,(r4),(r3) # copy the chars
54: movl r3,r0 # we're done - return ptr to next dest char
55: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.