From 02a19fc83d85299d11c8d3a200f1889ca330c62a Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Thu, 13 Feb 2020 16:04:39 -0500 Subject: [PATCH] [liba] Add strlcat --- liba/Makefile | 1 + liba/include/string.h | 1 + liba/src/bridge.c | 1 + liba/src/strlcat.c | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 liba/src/strlcat.c diff --git a/liba/Makefile b/liba/Makefile index 5b49d4576..31de8ce6f 100644 --- a/liba/Makefile +++ b/liba/Makefile @@ -19,6 +19,7 @@ liba_src += $(addprefix liba/src/, \ nearbyintf.c \ strcmp.c \ strchr.c \ + strlcat.c \ strlcpy.c \ strlen.c \ external/sqlite/mem5.c \ diff --git a/liba/include/string.h b/liba/include/string.h index a03942ded..f1719683e 100644 --- a/liba/include/string.h +++ b/liba/include/string.h @@ -14,6 +14,7 @@ void * memset(void * b, int c, size_t len); char * strchr(const char * s, int c); int strcmp(const char * s1, const char * s2); int strncmp(const char * s1, const char * s2, size_t n); +size_t strlcat(char * dst, const char * src, size_t dstSize); size_t strlcpy(char * dst, const char * src, size_t dstSize); size_t strlen(const char * s); diff --git a/liba/src/bridge.c b/liba/src/bridge.c index d6a538f7e..822c4019c 100644 --- a/liba/src/bridge.c +++ b/liba/src/bridge.c @@ -1,5 +1,6 @@ #include #if (__GLIBC__ || __MINGW32__) +#include "strlcat.c" #include "strlcpy.c" #endif diff --git a/liba/src/strlcat.c b/liba/src/strlcat.c new file mode 100644 index 000000000..990ed36da --- /dev/null +++ b/liba/src/strlcat.c @@ -0,0 +1,19 @@ +#include + +size_t strlcat(char * dst, const char * src, size_t dstSize) { + const size_t srcLen = strlen(src); + size_t dstLen = strlen(dst); + if (dstLen > dstSize) { + dstLen = dstSize; + } + if (dstLen == dstSize) { + return dstSize+srcLen; + } + if (srcLen < dstSize-dstLen) { + memcpy(dst+dstLen, src, srcLen+1); + } else { + memcpy(dst+dstLen, src, dstSize-1); + dst[dstLen+dstSize-1] = 0; + } + return dstLen+srcLen; +}