xref: /freebsd/lib/libc/amd64/string/strncat.c (revision ea7b13771cc9d45bf1bc6c6edad8d1b7bce12990)
1*ea7b1377SRobert Clausecker /*-
2*ea7b1377SRobert Clausecker  * SPDX-License-Identifier: BSD-2-Clause
3*ea7b1377SRobert Clausecker  *
4*ea7b1377SRobert Clausecker  * Copyright (c) 2023 Robert Clausecker
5*ea7b1377SRobert Clausecker  */
6*ea7b1377SRobert Clausecker 
7*ea7b1377SRobert Clausecker #include <sys/cdefs.h>
8*ea7b1377SRobert Clausecker 
9*ea7b1377SRobert Clausecker #include <string.h>
10*ea7b1377SRobert Clausecker 
11*ea7b1377SRobert Clausecker void *__memccpy(void *restrict, const void *restrict, int, size_t);
12*ea7b1377SRobert Clausecker 
13*ea7b1377SRobert Clausecker char *
14*ea7b1377SRobert Clausecker strncat(char *dest, const char *src, size_t n)
15*ea7b1377SRobert Clausecker {
16*ea7b1377SRobert Clausecker 	size_t len;
17*ea7b1377SRobert Clausecker 	char *endptr;
18*ea7b1377SRobert Clausecker 
19*ea7b1377SRobert Clausecker 	len = strlen(dest);
20*ea7b1377SRobert Clausecker 	endptr = __memccpy(dest + len, src, '\0', n);
21*ea7b1377SRobert Clausecker 
22*ea7b1377SRobert Clausecker 	/* avoid an extra branch */
23*ea7b1377SRobert Clausecker 	if (endptr == NULL)
24*ea7b1377SRobert Clausecker 		endptr = dest + len + n + 1;
25*ea7b1377SRobert Clausecker 
26*ea7b1377SRobert Clausecker 	endptr[-1] = '\0';
27*ea7b1377SRobert Clausecker 
28*ea7b1377SRobert Clausecker 	return (dest);
29*ea7b1377SRobert Clausecker }
30