*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/locale/wcsnrtombs.c,v 1.2 2004/07/22 02:57:29 tjr Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/locale/wcsnrtombs.c,v 1.3 2005/02/12 08:45:12 stefanf Exp $");
+
+#include "xlocale_private.h"
#include <limits.h>
#include <stdlib.h>
#include "mblocal.h"
size_t
-wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
- size_t len, mbstate_t * __restrict ps)
+wcsnrtombs_l(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
+ size_t len, mbstate_t * __restrict ps, locale_t loc)
{
- static mbstate_t mbs;
-
+ NORMALIZE_LOCALE(loc);
if (ps == NULL)
- ps = &mbs;
- return (__wcsnrtombs(dst, src, nwc, len, ps));
+ ps = &loc->__mbs_wcsnrtombs;
+ return (loc->__lc_ctype->__wcsnrtombs(dst, src, nwc, len, ps, loc));
}
size_t
+wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
+ size_t len, mbstate_t * __restrict ps)
+{
+ return wcsnrtombs_l(dst, src, nwc, len, ps, __current_locale());
+}
+
+__private_extern__ size_t
__wcsnrtombs_std(char * __restrict dst, const wchar_t ** __restrict src,
- size_t nwc, size_t len, mbstate_t * __restrict ps)
+ size_t nwc, size_t len, mbstate_t * __restrict ps, locale_t loc)
{
mbstate_t mbsbak;
char buf[MB_LEN_MAX];
const wchar_t *s;
size_t nbytes;
size_t nb;
+ struct __xlocale_st_runelocale *runeLocale = loc->__lc_ctype;
+ size_t (*__wcrtomb)(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t) = runeLocale->__wcrtomb;
+ int mb_cur_max = runeLocale->__mb_cur_max;
s = *src;
nbytes = 0;
if (dst == NULL) {
while (nwc-- > 0) {
- if ((nb = __wcrtomb(buf, *s, ps)) == (size_t)-1)
+ if ((nb = __wcrtomb(buf, *s, ps, loc)) == (size_t)-1)
/* Invalid character - wcrtomb() sets errno. */
return ((size_t)-1);
else if (*s == L'\0')
}
while (len > 0 && nwc-- > 0) {
- if (len > (size_t)MB_CUR_MAX) {
+ if (len > (size_t)mb_cur_max) {
/* Enough space to translate in-place. */
- if ((nb = (int)__wcrtomb(dst, *s, ps)) < 0) {
+ if ((nb = __wcrtomb(dst, *s, ps, loc)) == (size_t)-1) {
*src = s;
return ((size_t)-1);
}
* character is too long for the buffer.
*/
mbsbak = *ps;
- if ((nb = (int)__wcrtomb(buf, *s, ps)) < 0) {
+ if ((nb = __wcrtomb(buf, *s, ps, loc)) == (size_t)-1) {
*src = s;
return ((size_t)-1);
}