Module Name: src
Committed By: joerg
Date: Thu Apr 18 23:24:27 UTC 2013
Modified Files:
src/include: wchar.h
src/lib/libc/include: namespace.h
src/lib/libc/locale: multibyte_amd1.c wcscoll.c wcsxfrm.c
src/lib/libc/string: wcscasecmp.c wcsncasecmp.c
Log Message:
Add wcscoll_l, wcsxfrm_l, wcsncasecmp_l, wcscasecmp_l, btowc_l,
mbrlen_l, mbsinit_l, mbsrtowcs_l, wcrtomb_l, wcsrtombs_l and wctob_l.
To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/include/wchar.h
cvs rdiff -u -r1.160 -r1.161 src/lib/libc/include/namespace.h
cvs rdiff -u -r1.9 -r1.10 src/lib/libc/locale/multibyte_amd1.c
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/locale/wcscoll.c
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/locale/wcsxfrm.c
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/string/wcscasecmp.c \
src/lib/libc/string/wcsncasecmp.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/include/wchar.h
diff -u src/include/wchar.h:1.33 src/include/wchar.h:1.34
--- src/include/wchar.h:1.33 Thu Apr 18 22:23:17 2013
+++ src/include/wchar.h Thu Apr 18 23:24:26 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wchar.h,v 1.33 2013/04/18 22:23:17 joerg Exp $ */
+/* $NetBSD: wchar.h,v 1.34 2013/04/18 23:24:26 joerg Exp $ */
/*-
* Copyright (c)1999 Citrus Project,
@@ -211,6 +211,11 @@ __END_DECLS
typedef struct _locale *locale_t;
# define __LOCALE_T_DECLARED
# endif
+int wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
+size_t wcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t);
+int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
+int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t);
+
float wcstof_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
double wcstod_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
long double wcstold_l(const wchar_t * __restrict, wchar_t ** __restrict,
@@ -227,6 +232,21 @@ unsigned long long int wcstoull_l(const
wchar_t ** __restrict, int, locale_t);
int wcwidth_l(wchar_t, locale_t);
int wcswidth_l(const wchar_t *, size_t, locale_t);
-#endif
+#endif /* _POSIX_C_SOURCE || _NETBSD_SOURCE */
+
+#if defined(_NETBSD_SOURCE)
+wint_t btowc_l(int, locale_t);
+size_t mbrlen_l(const char * __restrict, size_t, mbstate_t * __restrict,
+ locale_t);
+size_t mbrtowc_l(wchar_t * __restrict, const char * __restrict, size_t,
+ mbstate_t * __restrict, locale_t);
+int mbsinit_l(const mbstate_t *, locale_t);
+size_t mbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
+ mbstate_t * __restrict, locale_t);
+size_t wcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
+size_t wcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
+ mbstate_t * __restrict, locale_t);
+int wctob_l(wint_t, locale_t);
+#endif /* _NETBSD_SOURCE */
#endif /* !_WCHAR_H_ */
Index: src/lib/libc/include/namespace.h
diff -u src/lib/libc/include/namespace.h:1.160 src/lib/libc/include/namespace.h:1.161
--- src/lib/libc/include/namespace.h:1.160 Thu Apr 18 22:23:17 2013
+++ src/lib/libc/include/namespace.h Thu Apr 18 23:24:26 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: namespace.h,v 1.160 2013/04/18 22:23:17 joerg Exp $ */
+/* $NetBSD: namespace.h,v 1.161 2013/04/18 23:24:26 joerg Exp $ */
/*-
* Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -704,8 +704,10 @@
#define wait4 _wait4
#define waitpid _waitpid
#define wcscasecmp _wcscasecmp
+#define wcscasecmp_l _wcscasecmp_l
#define wcsdup _wcsdup
#define wcsncasecmp _wcsncasecmp
+#define wcsncasecmp_l _wcsncasecmp_l
#define wcstof _wcstof
#define wcstof_l _wcstof_l
#define wcstod _wcstod
Index: src/lib/libc/locale/multibyte_amd1.c
diff -u src/lib/libc/locale/multibyte_amd1.c:1.9 src/lib/libc/locale/multibyte_amd1.c:1.10
--- src/lib/libc/locale/multibyte_amd1.c:1.9 Sun Jun 13 04:14:57 2010
+++ src/lib/libc/locale/multibyte_amd1.c Thu Apr 18 23:24:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: multibyte_amd1.c,v 1.9 2010/06/13 04:14:57 tnozaki Exp $ */
+/* $NetBSD: multibyte_amd1.c,v 1.10 2013/04/18 23:24:27 joerg Exp $ */
/*-
* Copyright (c)2002, 2008 Citrus Project,
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: multibyte_amd1.c,v 1.9 2010/06/13 04:14:57 tnozaki Exp $");
+__RCSID("$NetBSD: multibyte_amd1.c,v 1.10 2013/04/18 23:24:27 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -46,19 +46,22 @@ __RCSID("$NetBSD: multibyte_amd1.c,v 1.9
#include "runetype_local.h"
#include "multibyte.h"
-#define _RUNE_LOCALE() \
- ((_RuneLocale *)(*_current_locale())->part_impl[(size_t)LC_CTYPE])
+#define _RUNE_LOCALE(loc) \
+ ((_RuneLocale *)((loc)->part_impl[(size_t)LC_CTYPE]))
-#define _CITRUS_CTYPE() \
- (_RUNE_LOCALE()->rl_citrus_ctype)
+#define _CITRUS_CTYPE(loc) \
+ (_RUNE_LOCALE(loc)->rl_citrus_ctype)
size_t
-mbrlen(const char *s, size_t n, mbstate_t *ps)
+mbrlen_l(const char *s, size_t n, mbstate_t *ps, locale_t loc)
{
size_t ret;
int err0;
- _fixup_ps(_RUNE_LOCALE(), ps, s == NULL);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbrlen(_ps_to_ctype(ps), s, n,
_ps_to_private(ps), &ret);
@@ -68,8 +71,14 @@ mbrlen(const char *s, size_t n, mbstate_
return ret;
}
+size_t
+mbrlen(const char *s, size_t n, mbstate_t *ps)
+{
+ return mbrlen_l(s, n, ps, *_current_locale());
+}
+
int
-mbsinit(const mbstate_t *ps)
+mbsinit_l(const mbstate_t *ps, locale_t loc)
{
int ret;
int err0;
@@ -78,8 +87,11 @@ mbsinit(const mbstate_t *ps)
if (ps == NULL)
return 1;
+ if (loc == NULL)
+ loc = _C_locale;
+
if (_ps_to_runelocale(ps) == NULL)
- rl = _RUNE_LOCALE();
+ rl = _RUNE_LOCALE(loc);
else
rl = _ps_to_runelocale(ps);
@@ -92,13 +104,22 @@ mbsinit(const mbstate_t *ps)
return ret;
}
+int
+mbsinit(const mbstate_t *ps)
+{
+ return mbsinit_l(ps, *_current_locale());
+}
+
size_t
-mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+mbrtowc_l(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps, locale_t loc)
{
size_t ret;
int err0;
- _fixup_ps(_RUNE_LOCALE(), ps, s == NULL);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbrtowc(_ps_to_ctype(ps), pwc, s, n,
_ps_to_private(ps), &ret);
@@ -109,12 +130,22 @@ mbrtowc(wchar_t *pwc, const char *s, siz
}
size_t
-mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
+mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+ return mbrtowc_l(pwc, s, n, ps, *_current_locale());
+}
+
+size_t
+mbsrtowcs_l(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps,
+ locale_t loc)
{
size_t ret;
int err0;
- _fixup_ps(_RUNE_LOCALE(), ps, s == NULL);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_mbsrtowcs(_ps_to_ctype(ps), pwcs, s, n,
_ps_to_private(ps), &ret);
@@ -125,12 +156,21 @@ mbsrtowcs(wchar_t *pwcs, const char **s,
}
size_t
-wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
+mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
+{
+ return mbsrtowcs_l(pwcs, s, n, ps, *_current_locale());
+}
+
+size_t
+wcrtomb_l(char *s, wchar_t wc, mbstate_t *ps, locale_t loc)
{
size_t ret;
int err0;
- _fixup_ps(_RUNE_LOCALE(), ps, s == NULL);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_wcrtomb(_ps_to_ctype(ps), s, wc,
_ps_to_private(ps), &ret);
@@ -141,12 +181,22 @@ wcrtomb(char *s, wchar_t wc, mbstate_t *
}
size_t
-wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
+wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
+{
+ return wcrtomb_l(s, wc, ps, *_current_locale());
+}
+
+size_t
+wcsrtombs_l(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps,
+ locale_t loc)
{
size_t ret;
int err0;
- _fixup_ps(_RUNE_LOCALE(), ps, s == NULL);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ _fixup_ps(_RUNE_LOCALE(loc), ps, s == NULL);
err0 = _citrus_ctype_wcsrtombs(_ps_to_ctype(ps), s, ppwcs, n,
_ps_to_private(ps), &ret);
@@ -156,28 +206,52 @@ wcsrtombs(char *s, const wchar_t **ppwcs
return ret;
}
+size_t
+wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps)
+{
+ return wcsrtombs_l(s, ppwcs, n, ps, *_current_locale());
+}
+
wint_t
-btowc(int c)
+btowc_l(int c, locale_t loc)
{
wint_t ret;
int err0;
- err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(), c, &ret);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ err0 = _citrus_ctype_btowc(_CITRUS_CTYPE(loc), c, &ret);
if (err0)
errno = err0;
return ret;
}
+wint_t
+btowc(int c)
+{
+ return btowc_l(c, *_current_locale());
+}
+
int
-wctob(wint_t wc)
+wctob_l(wint_t wc, locale_t loc)
{
int ret;
int err0;
- err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(), wc, &ret);
+ if (loc == NULL)
+ loc = _C_locale;
+
+ err0 = _citrus_ctype_wctob(_CITRUS_CTYPE(loc), wc, &ret);
if (err0)
errno = err0;
return ret;
}
+
+int
+wctob(wint_t wc)
+{
+ return wctob_l(wc, *_current_locale());
+}
\ No newline at end of file
Index: src/lib/libc/locale/wcscoll.c
diff -u src/lib/libc/locale/wcscoll.c:1.2 src/lib/libc/locale/wcscoll.c:1.3
--- src/lib/libc/locale/wcscoll.c:1.2 Mon Jun 25 22:32:44 2012
+++ src/lib/libc/locale/wcscoll.c Thu Apr 18 23:24:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wcscoll.c,v 1.2 2012/06/25 22:32:44 abs Exp $ */
+/* $NetBSD: wcscoll.c,v 1.3 2013/04/18 23:24:27 joerg Exp $ */
/*-
* Copyright (c)2003 Citrus Project,
@@ -28,20 +28,31 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: wcscoll.c,v 1.2 2012/06/25 22:32:44 abs Exp $");
+__RCSID("$NetBSD: wcscoll.c,v 1.3 2013/04/18 23:24:27 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <assert.h>
#include <wchar.h>
+#include <locale.h>
+#include "setlocale_local.h"
/*
* Compare strings with using collating information.
*/
int
-wcscoll(const wchar_t *s1, const wchar_t *s2)
+wcscoll_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
{
+ if (loc == NULL)
+ loc = _C_locale;
/* XXX: LC_COLLATE should be implemented. */
+ /* LINTED */ (void)loc;
return (wcscmp(s1, s2));
}
+
+int
+wcscoll(const wchar_t *s1, const wchar_t *s2)
+{
+ return wcscoll_l(s1, s2, *_current_locale());
+}
Index: src/lib/libc/locale/wcsxfrm.c
diff -u src/lib/libc/locale/wcsxfrm.c:1.3 src/lib/libc/locale/wcsxfrm.c:1.4
--- src/lib/libc/locale/wcsxfrm.c:1.3 Mon Jun 25 22:32:44 2012
+++ src/lib/libc/locale/wcsxfrm.c Thu Apr 18 23:24:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wcsxfrm.c,v 1.3 2012/06/25 22:32:44 abs Exp $ */
+/* $NetBSD: wcsxfrm.c,v 1.4 2013/04/18 23:24:27 joerg Exp $ */
/*-
* Copyright (c)2003 Citrus Project,
@@ -28,23 +28,28 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: wcsxfrm.c,v 1.3 2012/06/25 22:32:44 abs Exp $");
+__RCSID("$NetBSD: wcsxfrm.c,v 1.4 2013/04/18 23:24:27 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <assert.h>
#include <wchar.h>
+#include <locale.h>
+#include "setlocale_local.h"
/*
* Compare strings with using collating information.
*/
size_t
-wcsxfrm(wchar_t *s1, const wchar_t *s2, size_t n)
+wcsxfrm_l(wchar_t *s1, const wchar_t *s2, size_t n, locale_t loc)
{
size_t len;
+ if (loc == NULL)
+ loc = _C_locale;
/* XXX: LC_COLLATE should be implemented. */
+ /* LINTED */(void)loc;
len = wcslen(s2);
if (len<n)
@@ -60,3 +65,9 @@ wcsxfrm(wchar_t *s1, const wchar_t *s2,
return (len);
}
+
+size_t
+wcsxfrm(wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ return wcsxfrm_l(s1, s2, n, *_current_locale());
+}
Index: src/lib/libc/string/wcscasecmp.c
diff -u src/lib/libc/string/wcscasecmp.c:1.2 src/lib/libc/string/wcscasecmp.c:1.3
--- src/lib/libc/string/wcscasecmp.c:1.2 Sat Aug 26 22:45:52 2006
+++ src/lib/libc/string/wcscasecmp.c Thu Apr 18 23:24:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wcscasecmp.c,v 1.2 2006/08/26 22:45:52 christos Exp $ */
+/* $NetBSD: wcscasecmp.c,v 1.3 2013/04/18 23:24:27 joerg Exp $ */
/*
* Copyright (C) 2006 Aleksey Cheusov
@@ -13,29 +13,35 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: wcscasecmp.c,v 1.2 2006/08/26 22:45:52 christos Exp $");
+__RCSID("$NetBSD: wcscasecmp.c,v 1.3 2013/04/18 23:24:27 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <assert.h>
#include <wchar.h>
#include <wctype.h>
+#include <locale.h>
+#include "setlocale_local.h"
__weak_alias(wcscasecmp,_wcscasecmp)
+__weak_alias(wcscasecmp_l,_wcscasecmp_l)
int
-wcscasecmp(const wchar_t *s1, const wchar_t *s2)
+wcscasecmp_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
{
int lc1 = 0;
int lc2 = 0;
int diff = 0;
+ if (loc == NULL)
+ loc = _C_locale;
+
_DIAGASSERT(s1);
_DIAGASSERT(s2);
for (;;) {
- lc1 = towlower(*s1);
- lc2 = towlower(*s2);
+ lc1 = towlower_l(*s1, loc);
+ lc2 = towlower_l(*s2, loc);
diff = lc1 - lc2;
if (diff)
@@ -48,3 +54,9 @@ wcscasecmp(const wchar_t *s1, const wcha
++s2;
}
}
+
+int
+wcscasecmp(const wchar_t *s1, const wchar_t *s2)
+{
+ return wcscasecmp_l(s1, s2, *_current_locale());
+}
Index: src/lib/libc/string/wcsncasecmp.c
diff -u src/lib/libc/string/wcsncasecmp.c:1.2 src/lib/libc/string/wcsncasecmp.c:1.3
--- src/lib/libc/string/wcsncasecmp.c:1.2 Sat Aug 26 22:45:52 2006
+++ src/lib/libc/string/wcsncasecmp.c Thu Apr 18 23:24:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wcsncasecmp.c,v 1.2 2006/08/26 22:45:52 christos Exp $ */
+/* $NetBSD: wcsncasecmp.c,v 1.3 2013/04/18 23:24:27 joerg Exp $ */
/*
* Copyright (C) 2006 Aleksey Cheusov
@@ -13,18 +13,21 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: wcsncasecmp.c,v 1.2 2006/08/26 22:45:52 christos Exp $");
+__RCSID("$NetBSD: wcsncasecmp.c,v 1.3 2013/04/18 23:24:27 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <assert.h>
#include <wchar.h>
#include <wctype.h>
+#include <locale.h>
+#include "setlocale_local.h"
__weak_alias(wcsncasecmp,_wcsncasecmp)
+__weak_alias(wcsncasecmp_l,_wcsncasecmp_l)
int
-wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n)
+wcsncasecmp_l(const wchar_t *s1, const wchar_t *s2, size_t n, locale_t loc)
{
int lc1 = 0;
int lc2 = 0;
@@ -33,9 +36,12 @@ wcsncasecmp(const wchar_t *s1, const wch
_DIAGASSERT(s1);
_DIAGASSERT(s2);
+ if (loc == NULL)
+ loc = _C_locale;
+
while (n--) {
- lc1 = towlower (*s1);
- lc2 = towlower (*s2);
+ lc1 = towlower_l(*s1, loc);
+ lc2 = towlower_l(*s2, loc);
diff = lc1 - lc2;
if (diff)
@@ -50,3 +56,9 @@ wcsncasecmp(const wchar_t *s1, const wch
return 0;
}
+
+int
+wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ return wcsncasecmp_l(s1, s2, n, *_current_locale());
+}