From d62e8d4c7c3d01c54174f571e49dffb9bc6338b6 Mon Sep 17 00:00:00 2001 From: "Tim J. Robbins" Date: Sat, 13 Aug 2005 05:54:33 +0000 Subject: [PATCH] Add an implementation of the semi-standard wcsdup() function, as found on Microsoft and GNU systems. --- include/wchar.h | 1 + lib/libc/string/Makefile.inc | 5 +++-- lib/libc/string/wcsdup.c | 43 ++++++++++++++++++++++++++++++++++++ lib/libc/string/wmemchr.3 | 9 ++++++-- 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 lib/libc/string/wcsdup.c diff --git a/include/wchar.h b/include/wchar.h index 931a4088ef78..2326b1debb50 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -214,6 +214,7 @@ int wcwidth(wchar_t); wchar_t *fgetwln(struct __sFILE * __restrict, size_t * __restrict); size_t mbsnrtowcs(wchar_t * __restrict, const char ** __restrict, size_t, size_t, mbstate_t * __restrict); +wchar_t *wcsdup(const wchar_t *); size_t wcsnrtombs(char * __restrict, const wchar_t ** __restrict, size_t, size_t, mbstate_t * __restrict); size_t wcslcat(wchar_t *, const wchar_t *, size_t); diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc index a2d172264a90..e6d8ea5eae75 100644 --- a/lib/libc/string/Makefile.inc +++ b/lib/libc/string/Makefile.inc @@ -14,7 +14,7 @@ MISRCS+=bcmp.c bcopy.c bzero.c ffs.c ffsl.c fls.c flsl.c index.c memccpy.c \ strcasestr.c strnstr.c \ strpbrk.c strrchr.c strsep.c strsignal.c strspn.c strstr.c strtok.c \ strxfrm.c swab.c wcscat.c wcschr.c wcscmp.c wcscoll.c wcscpy.c \ - wcscspn.c \ + wcscspn.c wcsdup.c \ wcslcat.c wcslcpy.c wcslen.c wcsncat.c wcsncmp.c wcsncpy.c wcspbrk.c \ wcsrchr.c wcsspn.c wcsstr.c wcstok.c wcswidth.c wcsxfrm.c wmemchr.c \ wmemcmp.c \ @@ -53,7 +53,8 @@ MLINKS+=wmemchr.3 wmemcmp.3 wmemchr.3 wmemcpy.3 \ wmemchr.3 wmemmove.3 wmemchr.3 wmemset.3 \ wmemchr.3 wcscat.3 wmemchr.3 wcschr.3 \ wmemchr.3 wcscmp.3 wmemchr.3 wcscpy.3 \ - wmemchr.3 wcscspn.3 wmemchr.3 wcslcat.3 \ + wmemchr.3 wcscspn.3 wmemchr.3 wcsdup.3 \ + wmemchr.3 wcslcat.3 \ wmemchr.3 wcslcpy.3 wmemchr.3 wcslen.3 \ wmemchr.3 wcsncat.3 wmemchr.3 wcsncmp.3 \ wmemchr.3 wcsncpy.3 wmemchr.3 wcspbrk.3 \ diff --git a/lib/libc/string/wcsdup.c b/lib/libc/string/wcsdup.c new file mode 100644 index 000000000000..1e5db9258a05 --- /dev/null +++ b/lib/libc/string/wcsdup.c @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 2005 Tim J. Robbins. + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +wchar_t * +wcsdup(const wchar_t *s) +{ + wchar_t *copy; + size_t len; + + len = wcslen(s) + 1; + if ((copy = malloc(len * sizeof(wchar_t))) == NULL) + return (NULL); + return (wmemcpy(copy, s, len)); +} diff --git a/lib/libc/string/wmemchr.3 b/lib/libc/string/wmemchr.3 index a448064418a2..a8b18cd6321e 100644 --- a/lib/libc/string/wmemchr.3 +++ b/lib/libc/string/wmemchr.3 @@ -39,7 +39,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 22, 2000 +.Dd August 13, 2005 .Dt WMEMCHR 3 .Os .Sh NAME @@ -53,6 +53,7 @@ .Nm wcscmp , .Nm wcscpy , .Nm wcscspn , +.Nm wcsdup , .Nm wcslcat , .Nm wcslcpy , .Nm wcslen , @@ -88,6 +89,8 @@ .Fn wcscpy "wchar_t * restrict s1" "const wchar_t * restrict s2" .Ft size_t .Fn wcscspn "const wchar_t *s1" "const wchar_t *s2" +.Ft wchar_t * +.Fn wcsdup "const wchar_t *s" .Ft size_t .Fn wcslcat "wchar_t *s1" "const wchar_t *s2" "size_t n" .Ft size_t @@ -125,6 +128,7 @@ counterpart, such as .Xr strcmp 3 , .Xr strcpy 3 , .Xr strcspn 3 , +.Xr strdup 3 , .Xr strlcat 3 , .Xr strlcpy 3 , .Xr strlen 3 , @@ -139,7 +143,8 @@ counterpart, such as These functions conform to .St -isoC-99 , with the exception of -.Fn wcslcat +.Fn wcsdup , +.Fn wcslcat , and .Fn wcslcpy , which are extensions.