From e9f3be3ad4d37d9b652261d73703b820c601d160 Mon Sep 17 00:00:00 2001 From: jca Date: Sun, 14 Jul 2024 09:51:18 +0000 Subject: [PATCH] Add wcsnlen(3), wcslen(3) with a max len argument Missing function hit by fcambus@ some time ago. ok millert@ --- lib/libc/Symbols.list | 1 + lib/libc/hidden/wchar.h | 3 ++- lib/libc/string/Makefile.inc | 8 +++---- lib/libc/string/wcslen.3 | 38 +++++++++++++++++++++++++++--- lib/libc/string/wcsnlen.c | 45 ++++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 lib/libc/string/wcsnlen.c diff --git a/lib/libc/Symbols.list b/lib/libc/Symbols.list index 48c4965a6d9..6d11dfff172 100644 --- a/lib/libc/Symbols.list +++ b/lib/libc/Symbols.list @@ -1666,6 +1666,7 @@ wcsncasecmp_l wcsncat wcsncmp wcsncpy +wcsnlen wcspbrk wcsrchr wcsspn diff --git a/lib/libc/hidden/wchar.h b/lib/libc/hidden/wchar.h index 7fb255110c0..c77dbd695b4 100644 --- a/lib/libc/hidden/wchar.h +++ b/lib/libc/hidden/wchar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wchar.h,v 1.4 2017/09/05 03:16:13 schwarze Exp $ */ +/* $OpenBSD: wchar.h,v 1.5 2024/07/14 09:51:18 jca Exp $ */ /* * Copyright (c) 2015 Philip Guenther * @@ -65,6 +65,7 @@ PROTO_NORMAL(wcsncasecmp); PROTO_NORMAL(wcsncat); PROTO_NORMAL(wcsncmp); PROTO_NORMAL(wcsncpy); +PROTO_DEPRECATED(wcsnlen); PROTO_NORMAL(wcsnrtombs); PROTO_NORMAL(wcspbrk); PROTO_NORMAL(wcsrchr); diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc index a1b1934aad0..204ca1b266f 100644 --- a/lib/libc/string/Makefile.inc +++ b/lib/libc/string/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.39 2017/09/05 03:16:13 schwarze Exp $ +# $OpenBSD: Makefile.inc,v 1.40 2024/07/14 09:51:18 jca Exp $ # string sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/string ${LIBCSRCDIR}/string @@ -9,9 +9,9 @@ SRCS+= explicit_bzero.c memccpy.c memmem.c memrchr.c stpcpy.c stpncpy.c \ strndup.c strnlen.c strsignal.c strtok.c strxfrm.c strxfrm_l.c \ timingsafe_bcmp.c timingsafe_memcmp.c \ wcscat.c wcschr.c wcscmp.c wcscpy.c wcscspn.c wcslcat.c wcslcpy.c \ - wcslen.c wcsncat.c wcsncmp.c wcsncpy.c wcspbrk.c wcsrchr.c wcsspn.c \ - wcsstr.c wcstok.c wcswcs.c wcswidth.c wmemchr.c wmemcmp.c wmemcpy.c \ - wmemmove.c wmemset.c wcsdup.c wcscasecmp.c wcscasecmp_l.c + wcslen.c wcsncat.c wcsncmp.c wcsncpy.c wcsnlen.c wcspbrk.c wcsrchr.c \ + wcsspn.c wcsstr.c wcstok.c wcswcs.c wcswidth.c wmemchr.c wmemcmp.c \ + wmemcpy.c wmemmove.c wmemset.c wcsdup.c wcscasecmp.c wcscasecmp_l.c # machine-dependent net sources # ../arch/ARCH/Makefile.inc must include sources for: diff --git a/lib/libc/string/wcslen.3 b/lib/libc/string/wcslen.3 index 12f81763ba3..b6d9aafc41c 100644 --- a/lib/libc/string/wcslen.3 +++ b/lib/libc/string/wcslen.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: wcslen.3,v 1.3 2013/06/05 03:39:23 tedu Exp $ +.\" $OpenBSD: wcslen.3,v 1.4 2024/07/14 09:51:18 jca Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,26 +31,50 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: June 5 2013 $ +.Dd $Mdocdate: July 14 2024 $ .Dt WCSLEN 3 .Os .Sh NAME -.Nm wcslen +.Nm wcslen , +.Nm wcsnlen .Nd find length of a wide string .Sh SYNOPSIS .In wchar.h .Ft size_t .Fn wcslen "const wchar_t *s" +.Ft size_t +.Fn wcsnlen "const wchar_t *s" "size_t maxlen" .Sh DESCRIPTION The .Fn wcslen function computes the length of the wide string .Fa s . +The +.Fn wcsnlen +function computes the length of the wide string +.Fa s , +up to +.Fa maxlen +wide characters. +The +.Fn wcsnlen +function will never attempt to address more than +.Fa maxlen +wide characters, making it suitable for use with wide character arrays +that are not guaranteed to be NUL-terminated. .Sh RETURN VALUES The .Fn wcslen function returns the number of wide characters that precede the terminating null wide character. +.Pp +The +.Fn wcsnlen +function returns the number of wide characters that precede the terminating +null wide character +or +.Fa maxlen , +whichever is smaller. .Sh SEE ALSO .Xr strlen 3 , .Xr wcswidth 3 @@ -61,6 +85,10 @@ function conforms to .St -isoC-99 and was first introduced in .St -isoC-amd1 . +The +.Fn wcsnlen +function conforms to +.St -p1003.1-2008 . .Sh HISTORY The .Fn wcslen @@ -68,3 +96,7 @@ function was ported from .Nx and first appeared in .Ox 3.8 . +The +.Fn wcsnlen +function first appeared in +.Ox 7.6 . diff --git a/lib/libc/string/wcsnlen.c b/lib/libc/string/wcsnlen.c new file mode 100644 index 00000000000..eb1d08e85bf --- /dev/null +++ b/lib/libc/string/wcsnlen.c @@ -0,0 +1,45 @@ +/* $OpenBSD: wcsnlen.c,v 1.1 2024/07/14 09:51:18 jca Exp $ */ +/* $NetBSD: wcslen.c,v 1.2 2001/01/03 14:29:36 lukem Exp $ */ + +/*- + * Copyright (c)1999 Citrus Project, + * All rights reserved. + * + * 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. + * + * citrus Id: wcslen.c,v 1.1 1999/12/29 21:47:45 tshiozak Exp + */ + +#include + +size_t +wcsnlen(const wchar_t *s, size_t maxlen) +{ + const wchar_t *p; + + p = s; + while (maxlen-- && *p) + p++; + + return p - s; +} + -- 2.20.1