Changeset View
Changeset View
Standalone View
Standalone View
lib/libc/locale/mbsnrtowcs.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. | ||||
* | * | ||||
* 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. | ||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src, | mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src, | ||||
size_t nms, size_t len, mbstate_t * __restrict ps) | size_t nms, size_t len, mbstate_t * __restrict ps) | ||||
{ | { | ||||
return mbsnrtowcs_l(dst, src, nms, len, ps, __get_locale()); | return mbsnrtowcs_l(dst, src, nms, len, ps, __get_locale()); | ||||
} | } | ||||
size_t | size_t | ||||
__mbsnrtowcs_std(wchar_t * __restrict dst, const char ** __restrict src, | __mbsnrtowcs_std(wchar_t * __restrict dst, const char ** __restrict src, | ||||
size_t nms, size_t len, mbstate_t * __restrict ps) | size_t nms, size_t len, mbstate_t * __restrict ps, | ||||
mbrtowc_pfn_t pmbrtowc) | |||||
{ | { | ||||
const char *s; | const char *s; | ||||
size_t nchr; | size_t nchr; | ||||
wchar_t wc; | wchar_t wc; | ||||
size_t nb; | size_t nb; | ||||
struct xlocale_ctype *ct = XLOCALE_CTYPE(__get_locale()); | |||||
s = *src; | s = *src; | ||||
nchr = 0; | nchr = 0; | ||||
if (dst == NULL) { | if (dst == NULL) { | ||||
for (;;) { | for (;;) { | ||||
if ((nb = ct->__mbrtowc(&wc, s, nms, ps)) == (size_t)-1) | if ((nb = pmbrtowc(&wc, s, nms, ps)) == (size_t)-1) | ||||
/* Invalid sequence - mbrtowc() sets errno. */ | /* Invalid sequence - mbrtowc() sets errno. */ | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
else if (nb == 0 || nb == (size_t)-2) | else if (nb == 0 || nb == (size_t)-2) | ||||
return (nchr); | return (nchr); | ||||
s += nb; | s += nb; | ||||
nms -= nb; | nms -= nb; | ||||
nchr++; | nchr++; | ||||
} | } | ||||
/*NOTREACHED*/ | /*NOTREACHED*/ | ||||
} | } | ||||
while (len-- > 0) { | while (len-- > 0) { | ||||
if ((nb = ct->__mbrtowc(dst, s, nms, ps)) == (size_t)-1) { | if ((nb = pmbrtowc(dst, s, nms, ps)) == (size_t)-1) { | ||||
*src = s; | *src = s; | ||||
return ((size_t)-1); | return ((size_t)-1); | ||||
} else if (nb == (size_t)-2) { | } else if (nb == (size_t)-2) { | ||||
*src = s + nms; | *src = s + nms; | ||||
return (nchr); | return (nchr); | ||||
} else if (nb == 0) { | } else if (nb == 0) { | ||||
*src = NULL; | *src = NULL; | ||||
return (nchr); | return (nchr); | ||||
Show All 9 Lines |