xref: /csrg-svn/lib/libc/vax/string/strncat.s (revision 22308)
1/*
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.  The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8	.asciz	"@(#)strncat.s	5.2 (Berkeley) 06/05/85"
9#endif not lint
10
11/*
12 * Concatenate string s2 on the end of s1
13 * and return the base of s1.  The parameter
14 * n is the maximum length of string s2 to
15 * concatenate.
16 *
17 * char *
18 * strncat(s1, s2, n)
19 *	char *s1, *s2;
20 *	int n;
21 */
22#include "DEFS.h"
23
24ENTRY(strncat, R6)
25	movl	12(ap),r6	# r6 = n
26	bleq	done		# n <= 0
27	movl	4(ap),r3	# r3 = s1
28	movl	r3,r1
290:
30	locc	$0,$65535,(r1)
31	beql	0b
32	movl	r1,r3		# r3 = index(s1, '\0');
33	movl	8(ap),r1	# r1 = s2
341:
35	movzwl	$65535,r2	# r2 = bytes in first chunk
36	cmpl	r6,r2		# r2 = min(bytes in chunk, n);
37	jgeq	2f
38	movl	r6,r2
392:
40	subl2	r2,r6		# update n
41	locc	$0,r2,(r1)	# '\0' found?
42	jneq	3f
43	subl2	r2,r1		# back up pointer updated by locc
44	movc3	r2,(r1),(r3)	# copy in next piece
45	tstl	r6		# run out of space?
46	jneq	1b
47	clrb	(r3)		# force '\0' termination
48	jbr	done
493:
50	subl2	r0,r2		# r2 = number of bytes to move
51	subl2	r2,r1		# back up pointer updated by locc
52	incl	r2		# copy '\0' as well
53	movc3	r2,(r1),(r3)	# copy in last piece
54done:
55	movl	4(ap),r0	# return s1
56	ret
57