From 4f5879f9989b98dbc9b0d52acf689f9dcd88396e Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 16 Feb 2017 16:10:09 -0600 Subject: [PATCH] C library: Add ffs(). Add strings.h. Move strcasecmp, strncasecmp, bzero, bcmp, and bcopy to where they belong in strings.h.h, not string.h. bzero, bcmp, and bcopy are legacy functions; the contemporary counterparts should be used instead. --- include/cxx/cstring | 11 ++++- include/string.h | 13 +----- include/strings.h | 83 +++++++++++++++++++++++++++++++++ libc/README.txt | 2 +- libc/stdlib/Make.defs | 2 +- libc/string/Make.defs | 17 +++---- libc/string/lib_ffs.c | 87 +++++++++++++++++++++++++++++++++++ libc/string/lib_memset.c | 1 - libc/string/lib_strcasecmp.c | 2 +- libc/string/lib_strncasecmp.c | 2 +- sched/init/os_start.c | 2 +- 11 files changed, 194 insertions(+), 28 deletions(-) create mode 100644 include/strings.h create mode 100644 libc/string/lib_ffs.c diff --git a/include/cxx/cstring b/include/cxx/cstring index a79dfbc204349..7fca19c45a7ff 100644 --- a/include/cxx/cstring +++ b/include/cxx/cstring @@ -42,6 +42,7 @@ #include #include +#include //*************************************************************************** // Namespace @@ -51,6 +52,8 @@ namespace std { using ::size_t; + // Declared in string.h + using ::strdup; using ::strndup; using ::strerror; @@ -60,8 +63,6 @@ namespace std using ::strncat; using ::strcmp; using ::strncmp; - using ::strcasecmp; - using ::strncasecmp; using ::strcoll; using ::stpcpy; using ::strcpy; @@ -83,6 +84,12 @@ namespace std using ::memcpy; using ::memmove; using ::memset; + + // Declared in legacy strings.h + + using ::ffs; + using ::strcasecmp; + using ::strncasecmp; } #endif // __INCLUDE_CXX_CSTRING diff --git a/include/string.h b/include/string.h index 4d698a20992a5..9ba3d03b02892 100644 --- a/include/string.h +++ b/include/string.h @@ -1,7 +1,7 @@ /**************************************************************************** * include/string.h * - * Copyright (C) 2007-2012, 2014, 2016 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2012, 2014, 2016-2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -47,15 +47,6 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -/* Compatibility definitions */ - -#ifndef CONFIG_LIBC_ARCH_BZERO -# define bzero(s,n) (void)memset(s,0,n) -#endif - -#define bcopy(b1,b2,len) (void)memmove(b2,b1,len) - -#define rindex(s,c) strrchr(s,c) /**************************************************************************** * Public Function Prototypes @@ -79,8 +70,6 @@ FAR char *strcat(FAR char *, FAR const char *); 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); -int strcasecmp(FAR const char *, FAR const char *); -int strncasecmp(FAR const char *, FAR const char *, size_t); int strcoll(FAR const char *, FAR const char *s2); FAR char *strcpy(char *dest, FAR const char *src); FAR char *stpcpy(char *dest, FAR const char *src); diff --git a/include/strings.h b/include/strings.h new file mode 100644 index 0000000000000..bff724d9ba313 --- /dev/null +++ b/include/strings.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * include/strings.h + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __INCLUDE_STRINGS_H +#define __INCLUDE_STRINGS_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Compatibility definitions */ + +#define bcmp(b1,b2,len) memcmp(b1,b2,(size_t)len) +#define bcopy(b1,b2,len) (void)memmove(b2,b1,len) + +#ifndef CONFIG_LIBC_ARCH_BZERO +# define bzero(s,n) (void)memset(s,0,n) +#endif + +#define index(s,c) strchr(s,c) +#define rindex(s,c) strrchr(s,c) + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +int ffs(int j); +int strcasecmp(FAR const char *, FAR const char *); +int strncasecmp(FAR const char *, FAR const char *, size_t); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif +#endif /* __INCLUDE_STRINGS_H */ diff --git a/libc/README.txt b/libc/README.txt index ccc69a3cf46af..4184aa71a8127 100644 --- a/libc/README.txt +++ b/libc/README.txt @@ -45,7 +45,7 @@ we have: semaphore - semaphore.h stdio - stdio.h stdlib - stdlib.h - string - string.h + string - string.h (and legacy strings.h) time - time.h unistd - unistd.h wchar - wchar.h diff --git a/libc/stdlib/Make.defs b/libc/stdlib/Make.defs index ec3977575d04d..3b66369fd76ad 100644 --- a/libc/stdlib/Make.defs +++ b/libc/stdlib/Make.defs @@ -36,7 +36,7 @@ # Add the stdlib C files to the build CSRCS += lib_abs.c lib_abort.c lib_div.c lib_ldiv.c lib_lldiv.c -CSRCS += lib_imaxabs.c lib_itoa.c lib_labs.c lib_llabs.c +CSRCS += lib_itoa.c lib_labs.c lib_llabs.c CSRCS += lib_bsearch.c lib_rand.c lib_qsort.c lib_srand.c CSRCS += lib_strtol.c lib_strtoll.c lib_strtoul.c lib_strtoull.c CSRCS += lib_strtod.c lib_strtof.c lib_strtold.c lib_checkbase.c diff --git a/libc/string/Make.defs b/libc/string/Make.defs index 9f9ba2a107d1e..415afc9237b0f 100644 --- a/libc/string/Make.defs +++ b/libc/string/Make.defs @@ -1,7 +1,7 @@ ############################################################################ # libc/string/Make.defs # -# Copyright (C) 2011-2012, 2014, 2016 Gregory Nutt. All rights reserved. +# Copyright (C) 2011-2012, 2014, 2016-2017 Gregory Nutt. All rights reserved. # Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without @@ -35,13 +35,14 @@ # Add the string C files to the build -CSRCS += lib_isbasedigit.c lib_memset.c lib_memchr.c lib_memccpy.c -CSRCS += lib_memcmp.c lib_memmove.c lib_skipspace.c lib_stpcpy.c -CSRCS += lib_strcasecmp.c lib_strcat.c lib_strchr.c lib_strcpy.c -CSRCS += lib_strcmp.c lib_strcspn.c lib_strdup.c lib_strerror.c lib_strlen.c -CSRCS += lib_strnlen.c lib_strncasecmp.c lib_strncat.c lib_strncmp.c -CSRCS += lib_strncpy.c lib_strndup.c lib_strcasestr.c lib_strpbrk.c -CSRCS += lib_strrchr.c lib_strspn.c lib_strstr.c lib_strtok.c lib_strtokr.c +CSRCS += lib_ffs.c lib_isbasedigit.c lib_memset.c lib_memchr.c +CSRCS += lib_memccpy.c lib_memcmp.c lib_memmove.c lib_skipspace.c +CSRCS += lib_stpcpy.c lib_strcasecmp.c lib_strcat.c lib_strchr.c +CSRCS += lib_strcpy.c lib_strcmp.c lib_strcspn.c lib_strdup.c +CSRCS += lib_strerror.c lib_strlen.c lib_strnlen.c lib_strncasecmp.c +CSRCS += lib_strncat.c lib_strncmp.c lib_strncpy.c lib_strndup.c +CSRCS += lib_strcasestr.c lib_strpbrk.c lib_strrchr.c lib_strspn.c +CSRCS += lib_strstr.c lib_strtok.c lib_strtokr.c ifneq ($(CONFIG_LIBC_ARCH_MEMCPY),y) ifeq ($(CONFIG_MEMCPY_VIK),y) diff --git a/libc/string/lib_ffs.c b/libc/string/lib_ffs.c new file mode 100644 index 0000000000000..c52a9c43b2368 --- /dev/null +++ b/libc/string/lib_ffs.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * libc/string/lib_ffs.c + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define NBITS (8 * sizeof(unsigned int)) + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: ffs + * + * Description: + * The ffs() function will find the first bit set (beginning with the least + * significant bit) in i, and return the index of that bit. Bits are + * numbered starting at one (the least significant bit). + * + * Returned Value: + * The ffs() function will return the index of the first bit set. If i is + * 0, then ffs() will return 0. + * + ****************************************************************************/ + +int ffs(int j) +{ + int ret = 0; + + if (j != 0) + { + unsigned int value = (unsigned int)j; + int bitno; + + for (bitno = 1; bitno <= NBITS; bitno++, value >>= 1) + { + if ((value & 1) != 0) + { + ret = bitno; + break; + } + } + } + + return ret; +} diff --git a/libc/string/lib_memset.c b/libc/string/lib_memset.c index c1feb50b74f73..d9771f8103534 100644 --- a/libc/string/lib_memset.c +++ b/libc/string/lib_memset.c @@ -1,4 +1,3 @@ - /**************************************************************************** * libc/string/lib_memset.c * diff --git a/libc/string/lib_strcasecmp.c b/libc/string/lib_strcasecmp.c index 5fa3e28914973..1971d2839ee75 100644 --- a/libc/string/lib_strcasecmp.c +++ b/libc/string/lib_strcasecmp.c @@ -39,7 +39,7 @@ #include -#include +#include #include /**************************************************************************** diff --git a/libc/string/lib_strncasecmp.c b/libc/string/lib_strncasecmp.c index 1019833a50fab..47b024e909f39 100644 --- a/libc/string/lib_strncasecmp.c +++ b/libc/string/lib_strncasecmp.c @@ -40,7 +40,7 @@ #include #include -#include +#include #include /**************************************************************************** diff --git a/sched/init/os_start.c b/sched/init/os_start.c index 2d8eb2e6e14e2..00f932fd13b83 100644 --- a/sched/init/os_start.c +++ b/sched/init/os_start.c @@ -442,7 +442,7 @@ void os_start(void) * that has pid == 0 and sched_priority == 0. */ - bzero((void *)&g_idletcb[cpu], sizeof(struct task_tcb_s)); + memset((void *)&g_idletcb[cpu], 0, sizeof(struct task_tcb_s)); g_idletcb[cpu].cmn.pid = g_lastpid; g_idletcb[cpu].cmn.task_state = TSTATE_TASK_RUNNING;