From 7356b5a2edf68065432837cab4584ec0b2fdc98d Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Fri, 14 Aug 2020 12:40:28 +0800 Subject: [PATCH] libc: Implement strlcpy function Reference: http://www.delorie.com/djgpp/doc/libc/libc_763.html Signed-off-by: chao.an --- include/string.h | 4 +- libs/libc/machine/Kconfig | 4 ++ libs/libc/string/Make.defs | 2 +- libs/libc/string/lib_strlcpy.c | 75 ++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 libs/libc/string/lib_strlcpy.c diff --git a/include/string.h b/include/string.h index 8d641c35a04..d20178911cd 100644 --- a/include/string.h +++ b/include/string.h @@ -1,7 +1,8 @@ /**************************************************************************** * include/string.h * - * Copyright (C) 2007-2012, 2014, 2016-2017 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2012, 2014, 2016-2017, 2020 Gregory Nutt. + * All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -76,6 +77,7 @@ int strncmp(FAR const char *, FAR const char *, size_t); int strcoll(FAR const char *, FAR const char *s2); FAR char *strcpy(FAR char *dest, FAR const char *src); FAR char *stpcpy(FAR char *dest, FAR const char *src); +size_t strlcpy(FAR char *dst, FAR const char *src, size_t siz); FAR char *strncpy(FAR char *, FAR const char *, size_t); FAR char *stpncpy(FAR char *, FAR const char *, size_t); FAR char *strpbrk(FAR const char *, FAR const char *); diff --git a/libs/libc/machine/Kconfig b/libs/libc/machine/Kconfig index e02f87e2213..19163c9d459 100644 --- a/libs/libc/machine/Kconfig +++ b/libs/libc/machine/Kconfig @@ -72,6 +72,10 @@ config LIBC_ARCH_STRCPY bool default n +config LIBC_ARCH_STRLCPY + bool + default n + config LIBC_ARCH_STRNCPY bool default n diff --git a/libs/libc/string/Make.defs b/libs/libc/string/Make.defs index c3df1b4fba6..db9978a0567 100644 --- a/libs/libc/string/Make.defs +++ b/libs/libc/string/Make.defs @@ -48,7 +48,7 @@ CSRCS += lib_strspn.c lib_strstr.c lib_strtok.c lib_strtokr.c CSRCS += lib_strsep.c lib_strerrorr.c lib_explicit_bzero.c lib_strsignal.c CSRCS += lib_anbstr2cstr.c lib_ancstr2bstr.c lib_bmem2cmem.c CSRCS += lib_bstrnlen.c lib_cmem2bmem.c lib_nbstr2cstr.c lib_ncstr2bstr.c -CSRCS += lib_index.c lib_rindex.c +CSRCS += lib_index.c lib_rindex.c lib_strlcpy.c ifneq ($(CONFIG_LIBC_ARCH_MEMCPY),y) ifeq ($(CONFIG_MEMCPY_VIK),y) diff --git a/libs/libc/string/lib_strlcpy.c b/libs/libc/string/lib_strlcpy.c new file mode 100644 index 00000000000..ee6f20177bb --- /dev/null +++ b/libs/libc/string/lib_strlcpy.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * libs/libc/string/lib_strlcpy.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: strlcpy + * + * Description: + * Copy src to string dst of size dsize. At most dsize-1 characters + * will be copied. Always NUL terminates (unless dsize == 0). + * + * Returned Value: + * Returns strlen(src); if retval >= dsize, truncation occurred. + * + ****************************************************************************/ + +#ifndef CONFIG_LIBC_ARCH_STRLCPY +size_t strlcpy(FAR char *dst, FAR const char *src, size_t dsize) +{ + FAR const char *osrc = src; + size_t nleft = dsize; + + if (nleft != 0) + { + while (--nleft != 0) + { + if ((*dst++ = *src++) == '\0') + { + break; + } + } + } + + if (nleft == 0) + { + if (dsize != 0) + { + *dst = '\0'; + } + + while (*src++); + } + + return (src - osrc - 1); +} +#endif