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