From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vs1-xe2f.google.com (mail-vs1-xe2f.google.com [IPv6:2607:f8b0:4864:20::e2f]) by sourceware.org (Postfix) with ESMTPS id E9C0F38582A2 for ; Mon, 4 Jul 2022 18:33:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E9C0F38582A2 Received: by mail-vs1-xe2f.google.com with SMTP id d187so9747718vsd.10 for ; Mon, 04 Jul 2022 11:33:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=0APege0fzMkuwupW6LeJ9eqA4t69+O4YhH2eJ9OjHDY=; b=qbc9tfq/MbH7vfKxiaaWL0J7dlkpVrouB+FJLGP+6Mp2Prepnkr5Yr3nOLRi5XZ0cm zOpbJjdNVFP5Kg9FDs68j/95HEFhGTgP5iyuusmtGV+wyO/wxwldak174z1l0YFkRZA/ mJINMIleNaCQ0nlolh2Hte1Akd81S521vmT8kPVudpVwfa01yhp4CUKVj/BSmTTYpsQt 3NBJgzBHOdipl/ilnllbN5Sn8L+i83plrb9aUbciISTqiXGQVrqBYDY2oh1Ylk1W126b W4mzICJT9mhgBidFostzGp2VLnyhTguI1jeYq5A2CZdHEmaRXhltg8YFVDq6ekERRD52 J02Q== X-Gm-Message-State: AJIora9BvX2JdJqorol4fFR6jUdh2t2/CWyAwN0fJfxtRMeq3BDLcGYi b9qTobq21XvFeSffJIdNtFESSbdF/q7Bdlaj X-Google-Smtp-Source: AGRyM1usHoEybiLh65bYsmbIVDKpN9/euG+Lvxev6EqdRrDPBbhm5fTLFzMcU8loBJFlCzYFE5TeHw== X-Received: by 2002:a67:b20e:0:b0:356:a603:7f2e with SMTP id b14-20020a67b20e000000b00356a6037f2emr7186288vsf.68.1656959604028; Mon, 04 Jul 2022 11:33:24 -0700 (PDT) Received: from smtpclient.apple ([2804:431:c7cb:fef6:fc57:dc88:c1a6:22c5]) by smtp.gmail.com with ESMTPSA id z1-20020ab022c1000000b00382838cf25bsm1466043uam.35.2022.07.04.11.33.22 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Jul 2022 11:33:23 -0700 (PDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.100.31\)) Subject: Re: [PATCH v4 2/3] stdlib: Implement mbrtoc8(), c8rtomb(), and the char8_t typedef. From: Adhemerval Zanella In-Reply-To: <20220630125215.6052-3-tom@honermann.net> Date: Mon, 4 Jul 2022 15:33:20 -0300 Cc: libc-alpha@sourceware.org Content-Transfer-Encoding: quoted-printable Message-Id: References: <20220630125215.6052-1-tom@honermann.net> <20220630125215.6052-3-tom@honermann.net> To: Tom Honermann X-Mailer: Apple Mail (2.3696.100.31) X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jul 2022 18:33:29 -0000 > On 30 Jun 2022, at 09:52, Tom Honermann via Libc-alpha = wrote: >=20 > This change provides implementations for the mbrtoc8 and c8rtomb > functions adopted for C++20 via WG21 P0482R6 and for C2X via WG14 > N2653. It also provides the char8_t typedef from WG14 N2653. >=20 > The mbrtoc8 and c8rtomb functions are declared in uchar.h in C2X > mode or when the _GNU_SOURCE macro or C++20 __cpp_char8_t feature > test macro is defined. >=20 > The char8_t typedef is declared in uchar.h in C2X mode or when the > _GNU_SOURCE macro is defined and the C++20 __cpp_char8_t feature > test macro is not defined (if __cpp_char8_t is defined, then char8_t > is a builtin type). LGTM with a minor nit below. Reviewed-by: Adhemerval Zanella > --- > NEWS | 9 ++ > sysdeps/mach/hurd/i386/libc.abilist | 2 + > sysdeps/unix/sysv/linux/aarch64/libc.abilist | 2 + > sysdeps/unix/sysv/linux/alpha/libc.abilist | 2 + > sysdeps/unix/sysv/linux/arc/libc.abilist | 2 + > sysdeps/unix/sysv/linux/arm/be/libc.abilist | 2 + > sysdeps/unix/sysv/linux/arm/le/libc.abilist | 2 + > sysdeps/unix/sysv/linux/csky/libc.abilist | 2 + > sysdeps/unix/sysv/linux/hppa/libc.abilist | 2 + > sysdeps/unix/sysv/linux/i386/libc.abilist | 2 + > sysdeps/unix/sysv/linux/ia64/libc.abilist | 2 + > .../sysv/linux/m68k/coldfire/libc.abilist | 2 + > .../unix/sysv/linux/m68k/m680x0/libc.abilist | 2 + > .../sysv/linux/microblaze/be/libc.abilist | 2 + > .../sysv/linux/microblaze/le/libc.abilist | 2 + > .../sysv/linux/mips/mips32/fpu/libc.abilist | 2 + > .../sysv/linux/mips/mips32/nofpu/libc.abilist | 2 + > .../sysv/linux/mips/mips64/n32/libc.abilist | 2 + > .../sysv/linux/mips/mips64/n64/libc.abilist | 2 + > sysdeps/unix/sysv/linux/nios2/libc.abilist | 2 + > sysdeps/unix/sysv/linux/or1k/libc.abilist | 2 + > .../linux/powerpc/powerpc32/fpu/libc.abilist | 2 + > .../powerpc/powerpc32/nofpu/libc.abilist | 2 + > .../linux/powerpc/powerpc64/be/libc.abilist | 2 + > .../linux/powerpc/powerpc64/le/libc.abilist | 2 + > .../unix/sysv/linux/riscv/rv32/libc.abilist | 2 + > .../unix/sysv/linux/riscv/rv64/libc.abilist | 2 + > .../unix/sysv/linux/s390/s390-32/libc.abilist | 2 + > .../unix/sysv/linux/s390/s390-64/libc.abilist | 2 + > sysdeps/unix/sysv/linux/sh/be/libc.abilist | 2 + > sysdeps/unix/sysv/linux/sh/le/libc.abilist | 2 + > .../sysv/linux/sparc/sparc32/libc.abilist | 2 + > .../sysv/linux/sparc/sparc64/libc.abilist | 2 + > .../unix/sysv/linux/x86_64/64/libc.abilist | 2 + > .../unix/sysv/linux/x86_64/x32/libc.abilist | 2 + > wcsmbs/Makefile | 2 +- > wcsmbs/Versions | 3 + > wcsmbs/c8rtomb.c | 132 ++++++++++++++++++ > wcsmbs/mbrtoc8.c | 126 +++++++++++++++++ > wcsmbs/uchar.h | 21 +++ > 40 files changed, 360 insertions(+), 1 deletion(-) > create mode 100644 wcsmbs/c8rtomb.c > create mode 100644 wcsmbs/mbrtoc8.c >=20 > diff --git a/NEWS b/NEWS > index b0a3d7e512..94243e2170 100644 > --- a/NEWS > +++ b/NEWS > @@ -46,6 +46,15 @@ Major new features: > to more flexibly configure and operate on filesystem mounts. The = new > mount APIs are specifically designed to work with namespaces. >=20 > +* Support for the mbrtoc8 and c8rtomb multibyte/UTF-8 character = conversion > + functions has been added per the ISO C2X N2653 and C++20 P0482R6 = proposals. > + Support for the char8_t typedef has been added per the ISO C2X = N2653 > + proposal. The functions are declared in uchar.h in C2X mode or = when the > + _GNU_SOURCE macro or C++20 __cpp_char8_t feature test macro is = defined. > + The char8_t typedef is declared in uchar.h in C2X mode or when the > + _GNU_SOURCE macro is defined and the C++20 __cpp_char8_t feature = test macro > + is not defined (if __cpp_char8_t is defined, then char8_t is a = builtin type). > + > Deprecated and removed features, and other changes affecting = compatibility: >=20 > * Support for prelink will be removed in the next release; this = includes > diff --git a/sysdeps/mach/hurd/i386/libc.abilist = b/sysdeps/mach/hurd/i386/libc.abilist > index 4dc87e9061..66fb0e28fa 100644 > --- a/sysdeps/mach/hurd/i386/libc.abilist > +++ b/sysdeps/mach/hurd/i386/libc.abilist > @@ -2289,6 +2289,8 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 close_range F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist = b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > index 8dba065b81..b3cf9fdd70 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > @@ -2616,8 +2616,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist = b/sysdeps/unix/sysv/linux/alpha/libc.abilist > index 08f4750022..2a45006462 100644 > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist > @@ -2713,8 +2713,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist = b/sysdeps/unix/sysv/linux/arc/libc.abilist > index 75db763023..0ac6bba241 100644 > --- a/sysdeps/unix/sysv/linux/arc/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist > @@ -2377,8 +2377,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist = b/sysdeps/unix/sysv/linux/arm/be/libc.abilist > index fa33f317ac..bfa763906b 100644 > --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist > @@ -496,8 +496,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist = b/sysdeps/unix/sysv/linux/arm/le/libc.abilist > index dba2e4ce42..ffcd7ca432 100644 > --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist > @@ -493,8 +493,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist = b/sysdeps/unix/sysv/linux/csky/libc.abilist > index e6ff921c29..940777b118 100644 > --- a/sysdeps/unix/sysv/linux/csky/libc.abilist > +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist > @@ -2652,8 +2652,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist = b/sysdeps/unix/sysv/linux/hppa/libc.abilist > index 8a40cece83..508efe6626 100644 > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist > @@ -2601,8 +2601,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist = b/sysdeps/unix/sysv/linux/i386/libc.abilist > index a89826049f..16b91fcee9 100644 > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist > @@ -2785,8 +2785,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist = b/sysdeps/unix/sysv/linux/ia64/libc.abilist > index d1d96b7469..51b646790d 100644 > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist > @@ -2551,8 +2551,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist = b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > index 63a62f267a..ddb43651f2 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > @@ -497,8 +497,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist = b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > index f68325f9bc..3db7deb4d0 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > @@ -2728,8 +2728,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist = b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > index 247af2075c..94afb7ad0b 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > @@ -2701,8 +2701,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist = b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > index b0ac3f9009..5873751425 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > @@ -2698,8 +2698,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist = b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > index b22cd6bf2f..f296e4edb7 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > @@ -2693,8 +2693,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist = b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > index 12fc2cce3e..1888756819 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > @@ -2691,8 +2691,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist = b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > index d3e96dfd43..7dfacee25b 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > @@ -2699,8 +2699,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist = b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > index cb58ed4db0..53e188aafe 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > @@ -2602,8 +2602,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist = b/sysdeps/unix/sysv/linux/nios2/libc.abilist > index 61ad58a599..bc6a836b1b 100644 > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist > @@ -2740,8 +2740,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist = b/sysdeps/unix/sysv/linux/or1k/libc.abilist > index 1260dc4e2e..299fa67961 100644 > --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist > +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist > @@ -2123,8 +2123,10 @@ GLIBC_2.35 wprintf F > GLIBC_2.35 write F > GLIBC_2.35 writev F > GLIBC_2.35 wscanf F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git = a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist = b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > index 363939762c..a5a072394d 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > @@ -2755,8 +2755,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git = a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist = b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > index f512ad8baf..2d26fd8639 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > @@ -2788,8 +2788,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist = b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > index c9bdc9859c..d9f1c593ea 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > @@ -2510,8 +2510,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist = b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > index f091be30bd..874f33dbcc 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > @@ -2812,8 +2812,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist = b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > index 7ea73f9af8..465798a56f 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > @@ -2379,8 +2379,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist = b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > index 333fa62714..ecc0544c05 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > @@ -2579,8 +2579,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist = b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > index a867467b12..3e8d00d513 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > @@ -2753,8 +2753,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist = b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > index dbad5b3163..a872a3d186 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > @@ -2547,8 +2547,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist = b/sysdeps/unix/sysv/linux/sh/be/libc.abilist > index 6f755cc173..a2938ca2be 100644 > --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist > @@ -2608,8 +2608,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist = b/sysdeps/unix/sysv/linux/sh/le/libc.abilist > index 77d936aa3c..ef318251c5 100644 > --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist > @@ -2605,8 +2605,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist = b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > index 09bb4363e1..2e2fbe72e2 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > @@ -2748,8 +2748,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist = b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > index 9df9cb6adb..e1991259cd 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > @@ -2574,8 +2574,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist = b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > index 4829450ad0..7d0843d1d8 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > @@ -2525,8 +2525,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist = b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > index caea228bcb..761958f768 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > @@ -2631,8 +2631,10 @@ GLIBC_2.35 __memcmpeq F > GLIBC_2.35 _dl_find_object F > GLIBC_2.35 epoll_pwait2 F > GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F > +GLIBC_2.36 c8rtomb F > GLIBC_2.36 fsmount F > GLIBC_2.36 fsopen F > +GLIBC_2.36 mbrtoc8 F > GLIBC_2.36 move_mount F > GLIBC_2.36 pidfd_getfd F > GLIBC_2.36 pidfd_open F > diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile > index df9a85f4a9..bda281ad70 100644 > --- a/wcsmbs/Makefile > +++ b/wcsmbs/Makefile > @@ -42,7 +42,7 @@ routines :=3D wcscat wcschr wcscmp wcscpy wcscspn = wcsdup wcslen wcsncat \ > wcsmbsload mbsrtowcs_l \ > isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf = \ > isoc99_swscanf isoc99_vswscanf \ > - mbrtoc16 c16rtomb mbrtoc32 c32rtomb > + mbrtoc8 c8rtomb mbrtoc16 c16rtomb mbrtoc32 c32rtomb >=20 > strop-tests :=3D wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy = wcsnlen \ > wcpcpy wcsncpy wcpncpy wcscat wcsncat wcschrnul wcsspn = wcspbrk \ > diff --git a/wcsmbs/Versions b/wcsmbs/Versions > index 0b31c1b940..ec28acfb73 100644 > --- a/wcsmbs/Versions > +++ b/wcsmbs/Versions > @@ -49,4 +49,7 @@ libc { > wcstof32; wcstof64; wcstof32x; > wcstof32_l; wcstof64_l; wcstof32x_l; > } > + GLIBC_2.36 { > + c8rtomb; mbrtoc8; > + } > } > diff --git a/wcsmbs/c8rtomb.c b/wcsmbs/c8rtomb.c > new file mode 100644 > index 0000000000..b564770eb5 > --- /dev/null > +++ b/wcsmbs/c8rtomb.c > @@ -0,0 +1,132 @@ > +/* UTF-8 to multibyte conversion. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be = useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > + > + > +/* This is the private state used if PS is NULL. */ > +static mbstate_t state; > + > +size_t > +c8rtomb (char *s, char8_t c8, mbstate_t *ps) > +{ > + /* This implementation depends on the converter invoked by wcrtomb = not > + needing to retain state in either the top most bit of = ps->__count or > + in ps->__value between invocations. This implementation uses = the > + top most bit of ps->__count to indicate that trailing code units = are > + expected and uses ps->__value to store previously seen code = units. */ > + > + wchar_t wc; > + > + if (ps =3D=3D NULL) > + ps =3D &state; > + > + if (s =3D=3D NULL) > + { > + /* if 's' is a null pointer, behave as if u8'\0' was passed as = 'c8'. If > + this occurs for an incomplete code unit sequence, then an = error will > + be reported below. */ > + c8 =3D u8""[0]; > + } > + > + if (! (ps->__count & 0x80000000)) > + { > + /* Initial state. */ > + if ((c8 >=3D 0x80 && c8 <=3D 0xC1) || c8 >=3D 0xF5) > + { > + /* An invalid lead code unit. */ > + __set_errno (EILSEQ); > + return -1; > + } > + if (c8 >=3D 0xC2) > + { > + /* A valid lead code unit. */ > + ps->__count |=3D 0x80000000; > + ps->__value.__wchb[0] =3D c8; > + ps->__value.__wchb[3] =3D 1; > + return 0; > + } > + /* A single byte (ASCII) code unit. */ > + wc =3D c8; > + } > + else > + { > + char8_t cu1 =3D ps->__value.__wchb[0]; > + if (ps->__value.__wchb[3] =3D=3D 1) > + { > + /* A single lead code unit was previously seen. */ > + if ((c8 < 0x80 || c8 > 0xBF) > + || (cu1 =3D=3D 0xE0 && c8 < 0xA0) > + || (cu1 =3D=3D 0xED && c8 > 0x9F) > + || (cu1 =3D=3D 0xF0 && c8 < 0x90) > + || (cu1 =3D=3D 0xF4 && c8 > 0x8F)) > + { > + /* An invalid second code unit. */ > + __set_errno (EILSEQ); > + return -1; > + } > + if (cu1 >=3D 0xE0) > + { > + /* A three or four code unit sequence. */ > + ps->__value.__wchb[1] =3D c8; > + ++ps->__value.__wchb[3]; > + return 0; > + } > + wc =3D ((cu1 & 0x1F) << 6) > + + (c8 & 0x3F); > + } > + else > + { > + char8_t cu2 =3D ps->__value.__wchb[1]; > + /* A three or four byte code unit sequence. */ > + if (c8 < 0x80 || c8 > 0xBF) > + { > + /* An invalid third or fourth code unit. */ > + __set_errno (EILSEQ); > + return -1; > + } > + if (ps->__value.__wchb[3] =3D=3D 2 && cu1 >=3D 0xF0) > + { > + /* A four code unit sequence. */ > + ps->__value.__wchb[2] =3D c8; > + ++ps->__value.__wchb[3]; > + return 0; > + } > + if (cu1 < 0xF0) > + { > + wc =3D ((cu1 & 0x0F) << 12) > + + ((cu2 & 0x3F) << 6) > + + (c8 & 0x3F); > + } > + else > + { > + char8_t cu3 =3D ps->__value.__wchb[2]; > + wc =3D ((cu1 & 0x07) << 18) > + + ((cu2 & 0x3F) << 12) > + + ((cu3 & 0x3F) << 6) > + + (c8 & 0x3F); > + } > + } > + ps->__count &=3D 0x7fffffff; > + ps->__value.__wch =3D 0; > + } > + > + return wcrtomb (s, wc, ps); > +} > diff --git a/wcsmbs/mbrtoc8.c b/wcsmbs/mbrtoc8.c > new file mode 100644 > index 0000000000..f2fab3b6a7 > --- /dev/null > +++ b/wcsmbs/mbrtoc8.c > @@ -0,0 +1,126 @@ > +/* Multibyte to UTF-8 conversion. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be = useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#ifndef EILSEQ > +# define EILSEQ EINVAL > +#endif > + > + > +/* This is the private state used if PS is NULL. */ > +static mbstate_t state; > + > +size_t > +mbrtoc8 (char8_t *pc8, const char *s, size_t n, mbstate_t *ps) > +{ > + /* This implementation depends on the converter invoked by = mbrtowc() not Refer to function name without =E2=80=98()=E2=80=99. > + needing to retain state in either the top most bit of = ps->__count or > + in ps->__value between invocations. This implementation uses = the > + top most bit of ps->__count to indicate that trailing code units = are > + yet to be written and uses ps->__value to store those code = units. */ > + > + if (ps =3D=3D NULL) > + ps =3D &state; > + > + /* If state indicates that trailing code units are yet to be = written, write > + those first regardless of whether 's' is a null pointer. */ > + if (ps->__count & 0x80000000) > + { > + /* ps->__value.__wchb[3] stores the index of the next code unit = to > + write. Code units are stored in reverse order. */ > + size_t i =3D ps->__value.__wchb[3]; > + if (pc8 !=3D NULL) > + { > + *pc8 =3D ps->__value.__wchb[i]; > + } > + if (i =3D=3D 0) > + { > + ps->__count &=3D 0x7fffffff; > + ps->__value.__wch =3D 0; > + } > + else > + --ps->__value.__wchb[3]; > + return -3; > + } > + > + if (s =3D=3D NULL) > + { > + /* if 's' is a null pointer, behave as if a null pointer was = passed for > + 'pc8', an empty string was passed for 's', and 1 passed for = 'n'. */ > + pc8 =3D NULL; > + s =3D ""; > + n =3D 1; > + } > + > + wchar_t wc; > + size_t result; > + > + result =3D mbrtowc (&wc, s, n, ps); > + if (result <=3D n) > + { > + if (wc <=3D 0x7F) > + { > + if (pc8 !=3D NULL) > + *pc8 =3D wc; > + } > + else if (wc <=3D 0x7FF) > + { > + if (pc8 !=3D NULL) > + *pc8 =3D 0xC0 + ((wc >> 6) & 0x1F); > + ps->__value.__wchb[0] =3D 0x80 + (wc & 0x3F); > + ps->__value.__wchb[3] =3D 0; > + ps->__count |=3D 0x80000000; > + } > + else if (wc <=3D 0xFFFF) > + { > + if (pc8 !=3D NULL) > + *pc8 =3D 0xE0 + ((wc >> 12) & 0x0F); > + ps->__value.__wchb[1] =3D 0x80 + ((wc >> 6) & 0x3F); > + ps->__value.__wchb[0] =3D 0x80 + (wc & 0x3F); > + ps->__value.__wchb[3] =3D 1; > + ps->__count |=3D 0x80000000; > + } > + else if (wc <=3D 0x10FFFF) > + { > + if (pc8 !=3D NULL) > + *pc8 =3D 0xF0 + ((wc >> 18) & 0x07); > + ps->__value.__wchb[2] =3D 0x80 + ((wc >> 12) & 0x3F); > + ps->__value.__wchb[1] =3D 0x80 + ((wc >> 6) & 0x3F); > + ps->__value.__wchb[0] =3D 0x80 + (wc & 0x3F); > + ps->__value.__wchb[3] =3D 2; > + ps->__count |=3D 0x80000000; > + } > + } > + if (result =3D=3D 0 && wc !=3D 0) > + { > + /* mbrtowc() never returns -3. When a MB sequence converts to = multiple > + WCs, no input is consumed when writing the subsequent WCs = resulting > + in a result of 0 even if a null character wasn't written. = */ > + result =3D -3; > + } > + > + return result; > +} > diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h > index 051cdcbeb5..c37e8619a0 100644 > --- a/wcsmbs/uchar.h > +++ b/wcsmbs/uchar.h > @@ -31,6 +31,13 @@ > #include > #include >=20 > +/* Declare the C2x char8_t typedef in C2x modes, but only if the C++ > + __cpp_char8_t feature test macro is not defined. */ > +#if __GLIBC_USE (ISOC2X) && !defined __cpp_char8_t > +/* Define the 8-bit character type. */ > +typedef unsigned char char8_t; > +#endif > + > #ifndef __USE_ISOCXX11 > /* Define the 16-bit and 32-bit character types. */ > typedef __uint_least16_t char16_t; > @@ -40,6 +47,20 @@ typedef __uint_least32_t char32_t; >=20 > __BEGIN_DECLS >=20 > +/* Declare the C2x mbrtoc8() and c8rtomb() functions in C2x modes or = if > + the C++ __cpp_char8_t feature test macro is defined. */ > +#if __GLIBC_USE (ISOC2X) || defined __cpp_char8_t > +/* Write char8_t representation of multibyte character pointed > + to by S to PC8. */ > +extern size_t mbrtoc8 (char8_t *__restrict __pc8, > + const char *__restrict __s, size_t __n, > + mbstate_t *__restrict __p) __THROW; > + > +/* Write multibyte representation of char8_t C8 to S. */ > +extern size_t c8rtomb (char *__restrict __s, char8_t __c8, > + mbstate_t *__restrict __ps) __THROW; > +#endif > + > /* Write char16_t representation of multibyte character pointed > to by S to PC16. */ > extern size_t mbrtoc16 (char16_t *__restrict __pc16, > --=20 > 2.32.0 >=20