xref: /haiku/src/system/libroot/posix/string/strlcat.c (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2 ** Copyright 2002, Manuel J. Petit. All rights reserved.
3 ** Distributed under the terms of the NewOS License.
4 */
5 
6 #include <sys/types.h>
7 #include <string.h>
8 
9 
10 /** Concatenates the source string to the destination, writes
11  *	as much as "maxLength" bytes to the dest string.
12  *	Always null terminates the string as long as maxLength is
13  *	larger than the dest string.
14  *	Returns the length of the string that it tried to create
15  *	to be able to easily detect string truncation.
16  */
17 
18 size_t
19 strlcat(char *dest, const char *source, size_t maxLength)
20 {
21 	size_t destLength = strnlen(dest, maxLength), i;
22 
23 	// This returns the wrong size, but it's all we can do
24 	if (maxLength == destLength)
25 		return destLength + strlen(source);
26 
27 	dest += destLength;
28 	maxLength -= destLength;
29 
30 	for (i = 0; i < maxLength - 1 && source[i]; i++) {
31 		dest[i] = source[i];
32 	}
33 
34 	dest[i] = '\0';
35 
36 	return destLength + i + strlen(source + i);
37 }
38 
39