Skip to content

Commit 676ba55

Browse files
committed
stdlib: Add strlcat
Adds strlcat which can be used to safely concatenate strings Signed-off-by: Joshua Watt <[email protected]>
1 parent f4f7d18 commit 676ba55

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ ZLIBOBJ = \
149149
# Common library objects
150150
LIBOBJ_COM = \
151151
stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \
152-
stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) \
152+
stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) stdlib/strlcat.$(O) \
153153
\
154154
nasmlib/ver.$(O) \
155155
nasmlib/alloc.$(O) nasmlib/asprintf.$(O) \

configure.ac

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ PA_FUNC_SNPRINTF
230230
PA_FUNC_VSNPRINTF
231231
AC_CHECK_FUNCS([strlcpy])
232232
AC_CHECK_FUNCS([strrchrnul])
233+
AC_CHECK_FUNCS([strlcat])
233234

234235
dnl These types are POSIX-specific, and Windows does it differently...
235236
AC_CHECK_TYPES([struct stat], [AC_CHECK_FUNCS([stat fstat])])
@@ -247,6 +248,7 @@ AC_CHECK_DECLS(strsep)
247248
AC_CHECK_DECLS(strlcpy)
248249
AC_CHECK_DECLS(strnlen)
249250
AC_CHECK_DECLS(strrchrnul)
251+
AC_CHECK_DECLS(strlcat)
250252

251253
dnl Check for missing types
252254
AC_TYPE_UINTMAX_T

include/compiler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ size_t strlcpy(char *, const char *, size_t);
181181
char * pure_func strrchrnul(const char *, int);
182182
#endif
183183

184+
#if !defined(HAVE_STRLCAT) || !HAVE_DECL_STRLCAT
185+
size_t strlcat(char *, const char *, size_t);
186+
#endif
187+
184188
/* C++ and C23 have bool, false, and true as proper keywords */
185189
#if !defined(__cplusplus) && (__STDC_VERSION__ < 202311L)
186190
# ifdef HAVE_STDBOOL_H

stdlib/strlcat.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright (c) 2019 Garmin Ltd. or its subsidiaries
3+
*
4+
* Permission to use, copy, modify, and distribute this software for any
5+
* purpose with or without fee is hereby granted, provided that the above
6+
* copyright notice and this permission notice appear in all copies.
7+
*
8+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15+
*/
16+
17+
#include "compiler.h"
18+
19+
/*
20+
* Concatenate src string to dest of size size. The destination buffer will
21+
* have no more than size-1 character when the operation finishes. Always NUL
22+
* terminates, unless size == 0 or dest has no NUL terminator. Returns
23+
* strlen(initial dest) + strlen(src); if retval >= size, truncation occurred.
24+
*/
25+
#ifndef HAVE_STRLCAT
26+
27+
size_t strlcat(char *dest, const char *src, size_t size)
28+
{
29+
size_t n;
30+
31+
/* find the NULL terminator in dest */
32+
for (n = 0; n < size && dest[n] != '\0'; n++)
33+
;
34+
35+
/* destination was not NULL terminated. Return the initial size */
36+
if (n == size)
37+
return size;
38+
39+
return strlcpy(&dest[n], src, size - n) + n;
40+
}
41+
42+
#endif
43+

0 commit comments

Comments
 (0)