Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/wcsnrtombs.c
/*- | /*- | ||||
* Copyright 2013 Garrett D'Amore <garrett@damore.org> | |||||
* Copyright 2010 Nexenta Systems, Inc. All rights reserved. | |||||
* Copyright (c) 2002-2004 Tim J. Robbins. | * Copyright (c) 2002-2004 Tim J. Robbins. | ||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
* Copyright (c) 2011 The FreeBSD Foundation | * Copyright (c) 2011 The FreeBSD Foundation | ||||
* All rights reserved. | * All rights reserved. | ||||
* Portions of this software were developed by David Chisnall | * Portions of this software were developed by David Chisnall | ||||
* under sponsorship from the FreeBSD Foundation. | * under sponsorship from the FreeBSD Foundation. | ||||
* | * | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc, | ||||
size_t len, mbstate_t * __restrict ps) | size_t len, mbstate_t * __restrict ps) | ||||
{ | { | ||||
return wcsnrtombs_l(dst, src, nwc, len, ps, __get_locale()); | return wcsnrtombs_l(dst, src, nwc, len, ps, __get_locale()); | ||||
} | } | ||||
size_t | size_t | ||||
__wcsnrtombs_std(char * __restrict dst, const wchar_t ** __restrict src, | __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, | ||||
wcrtomb_pfn_t pwcrtomb) | |||||
{ | { | ||||
mbstate_t mbsbak; | mbstate_t mbsbak; | ||||
char buf[MB_LEN_MAX]; | char buf[MB_LEN_MAX]; | ||||
const wchar_t *s; | const wchar_t *s; | ||||
size_t nbytes; | size_t nbytes; | ||||
size_t nb; | size_t nb; | ||||
struct xlocale_ctype *l = XLOCALE_CTYPE(__get_locale()); | |||||
s = *src; | s = *src; | ||||
nbytes = 0; | nbytes = 0; | ||||
if (dst == NULL) { | if (dst == NULL) { | ||||
while (nwc-- > 0) { | while (nwc-- > 0) { | ||||
if ((nb = l->__wcrtomb(buf, *s, ps)) == (size_t)-1) | if ((nb = pwcrtomb(buf, *s, ps)) == (size_t)-1) | ||||
/* Invalid character - wcrtomb() sets errno. */ | /* Invalid character - wcrtomb() sets errno. */ | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
else if (*s == L'\0') | else if (*s == L'\0') | ||||
return (nbytes + nb - 1); | return (nbytes + nb - 1); | ||||
s++; | s++; | ||||
nbytes += nb; | nbytes += nb; | ||||
} | } | ||||
return (nbytes); | return (nbytes); | ||||
} | } | ||||
while (len > 0 && nwc-- > 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. */ | /* Enough space to translate in-place. */ | ||||
if ((nb = l->__wcrtomb(dst, *s, ps)) == (size_t)-1) { | if ((nb = pwcrtomb(dst, *s, ps)) == (size_t)-1) { | ||||
*src = s; | *src = s; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
} else { | } else { | ||||
/* | /* | ||||
* May not be enough space; use temp. buffer. | * May not be enough space; use temp. buffer. | ||||
* | * | ||||
* We need to save a copy of the conversion state | * We need to save a copy of the conversion state | ||||
* here so we can restore it if the multibyte | * here so we can restore it if the multibyte | ||||
* character is too long for the buffer. | * character is too long for the buffer. | ||||
*/ | */ | ||||
mbsbak = *ps; | mbsbak = *ps; | ||||
if ((nb = l->__wcrtomb(buf, *s, ps)) == (size_t)-1) { | if ((nb = pwcrtomb(buf, *s, ps)) == (size_t)-1) { | ||||
*src = s; | *src = s; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} | } | ||||
if (nb > (int)len) { | if (nb > (int)len) { | ||||
/* MB sequence for character won't fit. */ | /* MB sequence for character won't fit. */ | ||||
*ps = mbsbak; | *ps = mbsbak; | ||||
break; | break; | ||||
} | } | ||||
Show All 14 Lines |