You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/09/21 06:02:34 UTC

[nuttx] 09/10: libs/libc/wchar: add wcsspn implementation

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit e2962e84c5e7b9e558ed4895b4765e5c7a484bc1
Author: guoshichao <gu...@xiaomi.com>
AuthorDate: Sat Aug 19 17:20:31 2023 +0800

    libs/libc/wchar: add wcsspn implementation
    
    Signed-off-by: guoshichao <gu...@xiaomi.com>
---
 libs/libc/wchar/Make.defs     |  2 +-
 libs/libc/wchar/lib_wcscspn.c | 70 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/libs/libc/wchar/Make.defs b/libs/libc/wchar/Make.defs
index 9501bbd542..5167f698eb 100644
--- a/libs/libc/wchar/Make.defs
+++ b/libs/libc/wchar/Make.defs
@@ -28,7 +28,7 @@ CSRCS += lib_wcstoull.c lib_wcstold.c lib_wcstof.c lib_wcstod.c
 CSRCS += lib_swprintf.c lib_mbsnrtowcs.c lib_wcsnrtombs.c lib_mbsinit.c
 CSRCS += lib_mbrlen.c lib_mbsrtowcs.c lib_wcsrtombs.c lib_wcscpy.c
 CSRCS += lib_wcscat.c lib_wcslcat.c lib_wcsncat.c lib_wcsrchr.c lib_wcschr.c
-CSRCS += lib_wcsncpy.c lib_wcsncmp.c
+CSRCS += lib_wcsncpy.c lib_wcsncmp.c lib_wcscspn.c
 
 # Add the wchar directory to the build
 
diff --git a/libs/libc/wchar/lib_wcscspn.c b/libs/libc/wchar/lib_wcscspn.c
new file mode 100644
index 0000000000..087345803c
--- /dev/null
+++ b/libs/libc/wchar/lib_wcscspn.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * libs/libc/wchar/lib_wcscspn.c
+ *
+ * Copyright © 2005-2014 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <wchar.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name:  wcscspn
+ *
+ * Description:
+ *    Get span until character in wide string. scans "s" for the first
+ *    occurrence of any of the wide characters that are part of "c".
+ *
+ * Input Parameters:
+ *   s - the wchar string to be scanned
+ *   c - the wchar string containing the characters to match.
+ *
+ * Returned Value:
+ *   Return the number of wide characters of "s" read before this first
+ *   occurrence.
+ *
+ ****************************************************************************/
+
+size_t wcscspn(FAR const wchar_t *s, FAR const wchar_t *c)
+{
+  FAR const wchar_t *a;
+
+  if (!c[0])
+    {
+      return wcslen(s);
+    }
+
+  if (!c[1])
+    {
+      return (s = wcschr(a = s, *c)) ? s - a : wcslen(a);
+    }
+
+  for (a = s; *s && !wcschr(c, *s); s++);
+  return s - a;
+}