[libcxx-commits] [libcxx] febbf68 - [SystemZ][z/OS] Missing wchar functions libc++

Muiez Ahmed via libcxx-commits libcxx-commits at lists.llvm.org
Fri Mar 12 12:41:21 PST 2021


Author: Muiez Ahmed
Date: 2021-03-12T15:39:31-05:00
New Revision: febbf68b423b14d55a14980d2ba3ec37ef1e31dc

URL: https://github.com/llvm/llvm-project/commit/febbf68b423b14d55a14980d2ba3ec37ef1e31dc
DIFF: https://github.com/llvm/llvm-project/commit/febbf68b423b14d55a14980d2ba3ec37ef1e31dc.diff

LOG: [SystemZ][z/OS] Missing wchar functions libc++

The aim is to add the missing z/OS specific implementations for mbsnrtowcs and wcsnrtombs, as part of libc++.

Differential Revision: https://reviews.llvm.org/D98207

Added: 
    libcxx/src/support/ibm/mbsnrtowcs.inc
    libcxx/src/support/ibm/wcsnrtombs.inc

Modified: 
    libcxx/include/wchar.h
    libcxx/src/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h
index b21a78968e23..e4ba50046294 100644
--- a/libcxx/include/wchar.h
+++ b/libcxx/include/wchar.h
@@ -170,13 +170,13 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
 }
 #endif
 
-#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT_LIKE)
+#if defined(__cplusplus) && (defined(_LIBCPP_MSVCRT_LIKE) || defined(__MVS__))
 extern "C" {
 size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
                   size_t nmc, size_t len, mbstate_t *__restrict ps);
 size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src,
                   size_t nwc, size_t len, mbstate_t *__restrict ps);
-}  // extern "C++"
-#endif  // __cplusplus && _LIBCPP_MSVCRT
+}  // extern "C"
+#endif  // __cplusplus && (_LIBCPP_MSVCRT || __MVS__)
 
 #endif  // _LIBCPP_WCHAR_H

diff  --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt
index aa59698db733..5a59b58d4363 100644
--- a/libcxx/src/CMakeLists.txt
+++ b/libcxx/src/CMakeLists.txt
@@ -92,6 +92,8 @@ elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
     )
 elseif(ZOS)
   list(APPEND LIBCXX_SOURCES
+    support/ibm/mbsnrtowcs.inc
+    support/ibm/wcsnrtombs.inc
     support/ibm/xlocale_zos.cpp
     )
 endif()

diff  --git a/libcxx/src/support/ibm/mbsnrtowcs.inc b/libcxx/src/support/ibm/mbsnrtowcs.inc
new file mode 100644
index 000000000000..aad3057df792
--- /dev/null
+++ b/libcxx/src/support/ibm/mbsnrtowcs.inc
@@ -0,0 +1,72 @@
+/*-
+ * Some portions of this implementation are copied from
+ * FreeBSD libc.  These are covered by the following copyright:
+ *
+ * Copyright (c) 2002-2004 Tim J. Robbins.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+size_t
+mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src,
+    size_t nms, size_t len, mbstate_t * __restrict ps) {
+  const char *s;
+  size_t nchr;
+  wchar_t wc;
+  size_t nb;
+
+  s = *src;
+  nchr = 0;
+
+  if (dst == NULL) {
+    for (;;) {
+      if ((nb = mbrtowc(&wc, s, nms, ps)) == (size_t)-1)
+        /* Invalid sequence - mbrtowc() sets errno. */
+        return ((size_t)-1);
+      else if (nb == 0 || nb == (size_t)-2)
+        return (nchr);
+      s += nb;
+      nms -= nb;
+      nchr++;
+    }
+    /*NOTREACHED*/
+  }
+
+  while (len-- > 0) {
+    if ((nb = mbrtowc(dst, s, nms, ps)) == (size_t)-1) {
+      *src = s;
+      return ((size_t)-1);
+    } else if (nb == (size_t)-2) {
+      *src = s + nms;
+      return (nchr);
+    } else if (nb == 0) {
+      *src = NULL;
+      return (nchr);
+    }
+    s += nb;
+    nms -= nb;
+    nchr++;
+    dst++;
+  }
+  *src = s;
+  return (nchr);
+}

diff  --git a/libcxx/src/support/ibm/wcsnrtombs.inc b/libcxx/src/support/ibm/wcsnrtombs.inc
new file mode 100644
index 000000000000..89c435e5cc4a
--- /dev/null
+++ b/libcxx/src/support/ibm/wcsnrtombs.inc
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2002-2004 Tim J. Robbins.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+size_t
+wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src,
+    size_t nwc, size_t len, mbstate_t * __restrict ps) {
+  mbstate_t mbsbak;
+  char buf[MB_CUR_MAX];
+  const wchar_t *s;
+  size_t nbytes;
+  size_t nb;
+
+  s = *src;
+  nbytes = 0;
+
+  if (dst == NULL) {
+    while (nwc-- > 0) {
+      if ((nb = wcrtomb(buf, *s, ps)) == (size_t)-1)
+        /* Invalid character - wcrtomb() sets errno. */
+        return ((size_t)-1);
+      else if (*s == L'\0')
+        return (nbytes + nb - 1);
+      s++;
+      nbytes += nb;
+    }
+    return (nbytes);
+  }
+
+  while (len > 0 && nwc-- > 0) {
+    if (len > (size_t)MB_CUR_MAX) {
+      /* Enough space to translate in-place. */
+      if ((nb = wcrtomb(dst, *s, ps)) == (size_t)-1) {
+        *src = s;
+        return ((size_t)-1);
+      }
+    } else {
+      /*
+       * May not be enough space; use temp. buffer.
+       *
+       * We need to save a copy of the conversion state
+       * here so we can restore it if the multibyte
+       * character is too long for the buffer.
+       */
+      mbsbak = *ps;
+      if ((nb = wcrtomb(buf, *s, ps)) == (size_t)-1) {
+        *src = s;
+        return ((size_t)-1);
+      }
+      if (nb > len) {
+        /* MB sequence for character won't fit. */
+        *ps = mbsbak;
+        break;
+      }
+      memcpy(dst, buf, nb);
+    }
+    if (*s == L'\0') {
+      *src = NULL;
+      return (nbytes + nb - 1);
+    }
+    s++;
+    dst += nb;
+    len -= nb;
+    nbytes += nb;
+  }
+  *src = s;
+  return (nbytes);
+}
+


        


More information about the libcxx-commits mailing list