>From NetBSD with overflow check and a couple of minor tweaks by me.

libc minor bump.

Needed for libedit with wide characters which might be nice sometime.

Comments/ok?


Index: include/wchar.h
===================================================================
RCS file: /cvs/src/include/wchar.h,v
retrieving revision 1.17
diff -u -p -r1.17 wchar.h
--- include/wchar.h     1 Jun 2011 16:39:07 -0000       1.17
+++ include/wchar.h     4 Jul 2011 04:04:42 -0000
@@ -146,6 +146,7 @@ unsigned long int wcstoul(const wchar_t 
                int base);
 
 #if __POSIX_VISIBLE >= 200809
+wchar_t        *wcsdup(const wchar_t *);
 int wcscasecmp(const wchar_t *, const wchar_t *);
 int wcsncasecmp(const wchar_t *, const wchar_t *, size_t);
 #endif
Index: lib/libc/shlib_version
===================================================================
RCS file: /cvs/src/lib/libc/shlib_version,v
retrieving revision 1.132
diff -u -p -r1.132 shlib_version
@@ -1,4 +1,4 @@
 major=58
-minor=3
+minor=4
 # note: If changes were made to include/thread_private.h or if system
 # calls were added/changed then libpthread must also be updated.
Index: lib/libc/string/Makefile.inc
===================================================================
RCS file: /cvs/src/lib/libc/string/Makefile.inc,v
retrieving revision 1.25
diff -u -p -r1.25 Makefile.inc
--- lib/libc/string/Makefile.inc        28 May 2011 15:16:46 -0000      1.25
+++ lib/libc/string/Makefile.inc        4 Jul 2011 01:02:53 -0000
@@ -9,7 +9,7 @@ SRCS+=  bm.c memccpy.c memrchr.c strcasec
        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 \
+       wmemmove.c wmemset.c wcsdup.c \
        timingsafe_bcmp.c wcscasecmp.c
 
 # machine-dependent net sources
@@ -144,7 +144,7 @@ MAN+=       bm.3 bcmp.3 bcopy.3 bstring.3 bzer
        strchr.3 strcmp.3 strcoll.3 strcpy.3 strcspn.3 strerror.3 \
        string.3 strlen.3 strmode.3 strdup.3 strpbrk.3 strrchr.3 strsep.3 \
        strsignal.3 strspn.3 strstr.3 strtok.3 strxfrm.3 swab.3 strlcpy.3 \
-       wcstok.3 wmemchr.3 wcswidth.3
+       wcstok.3 wmemchr.3 wcswidth.3 wcsdup.3
 
 MLINKS+=bm.3 bm_comp.3 bm.3 bm_exec.3 bm.3 bm_free.3
 MLINKS+=memchr.3 memrchr.3
Index: lib/libc/string/wcsdup.3
===================================================================
RCS file: lib/libc/string/wcsdup.3
diff -N lib/libc/string/wcsdup.3
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/libc/string/wcsdup.3    4 Jul 2011 03:50:27 -0000
@@ -0,0 +1,86 @@
+.\"    $OpenBSD$
+.\"    $NetBSD: wcsdup.3,v 1.3 2010/12/16 17:42:28 wiz Exp $
+.\"
+.\" Copyright (c) 1990, 1991, 1993
+.\"    The Regents of the University of California.  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.
+.\" 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+.\"
+.\"     from: @(#)strdup.3     8.1 (Berkeley) 6/9/93
+.\"
+.Dd $Mdocdate$
+.Dt WCSDUP 3
+.Os
+.Sh NAME
+.Nm wcsdup
+.Nd save a copy of a string
+.Sh SYNOPSIS
+.In wchar.h
+.Ft wchar_t *
+.Fn wcsdup "const wchar_t *str"
+.Sh DESCRIPTION
+The
+.Fn wcsdup
+function
+allocates sufficient memory for a copy
+of the wide-character string
+.Fa str ,
+does the copy, and returns a pointer to it.
+The pointer may subsequently be used as an
+argument to the function
+.Xr free 3 .
+.Pp
+If insufficient memory is available,
+.Dv NULL
+is returned.
+.Sh EXAMPLES
+The following will point
+.Va p
+to an allocated area of memory containing the nul-terminated string
+.Qq foobar :
+.Bd -literal -offset indent
+wchar_t *p;
+
+if (p = wcsdup(L"foobar"), p == NULL) {
+       fprintf(stderr, "Out of memory.\en");
+       exit(1);
+}
+.Ed
+.Sh ERRORS
+The
+.Fn wcsdup
+function may fail and set the external variable
+.Va errno
+for any of the errors specified for the library function
+.Xr malloc 3 .
+.Sh SEE ALSO
+.Xr free 3 ,
+.Xr malloc 3 ,
+.Xr strdup 3
+.Sh HISTORY
+The
+.Fn wcsdup
+function first appeared in
+.Ox 5.0 .
Index: lib/libc/string/wcsdup.c
===================================================================
RCS file: lib/libc/string/wcsdup.c
diff -N lib/libc/string/wcsdup.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/libc/string/wcsdup.c    4 Jul 2011 04:05:16 -0000
@@ -0,0 +1,36 @@
+/*     $OpenBSD$       */
+/*     $NetBSD: wcsdup.c,v 1.3 2008/05/26 13:17:48 haad Exp $  */
+
+/*
+ * Copyright (C) 2006 Aleksey Cheusov
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee. Permission to modify the code and to distribute modified
+ * code is also granted without any restrictions.
+ */
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <wchar.h>
+
+wchar_t *
+wcsdup(const wchar_t *str)
+{
+       wchar_t *copy;
+       size_t len;
+
+       len = wcslen(str) + 1;
+       if (SIZE_MAX / sizeof (wchar_t) < len) {
+               errno = ENOMEM;
+               return (NULL);
+       }
+       copy = malloc(len * sizeof (wchar_t));
+       if (!copy)
+               return (NULL);
+
+       return (wmemcpy(copy, str, len));
+}

Reply via email to