From 80d32edbe14af0064148e421dae8ba146698378d Mon Sep 17 00:00:00 2001 From: anjiahao Date: Thu, 25 Nov 2021 10:21:12 +0800 Subject: [PATCH] libc/str:add strlcat to libc Signed-off-by: anjiahao --- include/string.h | 1 + libs/libc/machine/Kconfig | 4 ++ libs/libc/string/Make.defs | 4 ++ libs/libc/string/lib_strlcat.c | 87 ++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 libs/libc/string/lib_strlcat.c diff --git a/include/string.h b/include/string.h index 2b725a7e59..c7ff9d1bf4 100644 --- a/include/string.h +++ b/include/string.h @@ -63,6 +63,7 @@ int strerror_r(int, FAR char *, size_t); size_t strlen(FAR const char *); size_t strnlen(FAR const char *, size_t); FAR char *strcat(FAR char *, FAR const char *); +size_t strlcat(FAR char *, FAR const char *, size_t); FAR char *strncat(FAR char *, FAR const char *, size_t); int strcmp(FAR const char *, FAR const char *); int strncmp(FAR const char *, FAR const char *, size_t); diff --git a/libs/libc/machine/Kconfig b/libs/libc/machine/Kconfig index 304fbf0a00..4ab474e3c8 100644 --- a/libs/libc/machine/Kconfig +++ b/libs/libc/machine/Kconfig @@ -80,6 +80,10 @@ config LIBC_ARCH_STRCPY bool default n +config LIBC_ARCH_STRLCAT + bool + default n + config LIBC_ARCH_STRLCPY bool default n diff --git a/libs/libc/string/Make.defs b/libs/libc/string/Make.defs index 04b588adc6..aa23791ca1 100644 --- a/libs/libc/string/Make.defs +++ b/libs/libc/string/Make.defs @@ -69,6 +69,10 @@ ifneq ($(CONFIG_LIBC_ARCH_STRCPY),y) CSRCS += lib_strcpy.c endif +ifneq ($(CONFIG_LIBC_ARCH_STRLCAT),y) +CSRCS += lib_strlcat.c +endif + ifneq ($(CONFIG_LIBC_ARCH_STRLCPY),y) CSRCS += lib_strlcpy.c endif diff --git a/libs/libc/string/lib_strlcat.c b/libs/libc/string/lib_strlcat.c new file mode 100644 index 0000000000..bc68885444 --- /dev/null +++ b/libs/libc/string/lib_strlcat.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * libs/libc/string/lib_strlcat.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: strlcat + * + * Description: + * The strlcat() function appends at most (dstsize-strlen(dst)-1) + * characters of src to dst (dstsize being the size of the string buffer + * dst). + * + * Returned Value: + * Returns min{dstsize,strlen(dst)} + strlen(src). + * + ****************************************************************************/ + +#ifndef CONFIG_LIBC_ARCH_STRLCAT +size_t strlcat(FAR char *dst, FAR const char *src, size_t dsize) +{ + FAR const char *odst = dst; + FAR const char *osrc = src; + size_t n = dsize; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end. */ + + while (n-- != 0 && *dst != '\0') + { + dst++; + } + + dlen = dst - odst; + n = dsize - dlen; + + if (n-- == 0) + { + return dlen + strlen(src); + } + + while (*src != '\0') + { + if (n != 0) + { + *dst++ = *src; + n--; + } + + src++; + } + + *dst = '\0'; + + /* Count does not include NUL */ + + return dlen + (src - osrc); +} +#endif