1*58b9f456SAndroid Build Coastguard Worker 2*58b9f456SAndroid Build Coastguard Worker 3*58b9f456SAndroid Build Coastguard Worker/*- 4*58b9f456SAndroid Build Coastguard Worker * As noted in the source, some portions of this implementation are copied from 5*58b9f456SAndroid Build Coastguard Worker * FreeBSD libc. These are covered by the following copyright: 6*58b9f456SAndroid Build Coastguard Worker * 7*58b9f456SAndroid Build Coastguard Worker * Copyright (c) 2002-2004 Tim J. Robbins. 8*58b9f456SAndroid Build Coastguard Worker * 9*58b9f456SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 10*58b9f456SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 11*58b9f456SAndroid Build Coastguard Worker * are met: 12*58b9f456SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 13*58b9f456SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 14*58b9f456SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 15*58b9f456SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 16*58b9f456SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 17*58b9f456SAndroid Build Coastguard Worker * 18*58b9f456SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19*58b9f456SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*58b9f456SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*58b9f456SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22*58b9f456SAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*58b9f456SAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*58b9f456SAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*58b9f456SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26*58b9f456SAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27*58b9f456SAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28*58b9f456SAndroid Build Coastguard Worker * SUCH DAMAGE. 29*58b9f456SAndroid Build Coastguard Worker */ 30*58b9f456SAndroid Build Coastguard Worker 31*58b9f456SAndroid Build Coastguard Workersize_t 32*58b9f456SAndroid Build Coastguard Workermbsnrtowcs_l(wchar_t * __restrict dst, const char ** __restrict src, 33*58b9f456SAndroid Build Coastguard Worker size_t nms, size_t len, mbstate_t * __restrict ps, locale_t loc) 34*58b9f456SAndroid Build Coastguard Worker{ 35*58b9f456SAndroid Build Coastguard Worker const char *s; 36*58b9f456SAndroid Build Coastguard Worker size_t nchr; 37*58b9f456SAndroid Build Coastguard Worker wchar_t wc; 38*58b9f456SAndroid Build Coastguard Worker size_t nb; 39*58b9f456SAndroid Build Coastguard Worker FIX_LOCALE(loc); 40*58b9f456SAndroid Build Coastguard Worker 41*58b9f456SAndroid Build Coastguard Worker s = *src; 42*58b9f456SAndroid Build Coastguard Worker nchr = 0; 43*58b9f456SAndroid Build Coastguard Worker 44*58b9f456SAndroid Build Coastguard Worker if (dst == NULL) { 45*58b9f456SAndroid Build Coastguard Worker for (;;) { 46*58b9f456SAndroid Build Coastguard Worker if ((nb = mbrtowc_l(&wc, s, nms, ps, loc)) == (size_t)-1) 47*58b9f456SAndroid Build Coastguard Worker /* Invalid sequence - mbrtowc() sets errno. */ 48*58b9f456SAndroid Build Coastguard Worker return ((size_t)-1); 49*58b9f456SAndroid Build Coastguard Worker else if (nb == 0 || nb == (size_t)-2) 50*58b9f456SAndroid Build Coastguard Worker return (nchr); 51*58b9f456SAndroid Build Coastguard Worker s += nb; 52*58b9f456SAndroid Build Coastguard Worker nms -= nb; 53*58b9f456SAndroid Build Coastguard Worker nchr++; 54*58b9f456SAndroid Build Coastguard Worker } 55*58b9f456SAndroid Build Coastguard Worker /*NOTREACHED*/ 56*58b9f456SAndroid Build Coastguard Worker } 57*58b9f456SAndroid Build Coastguard Worker 58*58b9f456SAndroid Build Coastguard Worker while (len-- > 0) { 59*58b9f456SAndroid Build Coastguard Worker if ((nb = mbrtowc_l(dst, s, nms, ps, loc)) == (size_t)-1) { 60*58b9f456SAndroid Build Coastguard Worker *src = s; 61*58b9f456SAndroid Build Coastguard Worker return ((size_t)-1); 62*58b9f456SAndroid Build Coastguard Worker } else if (nb == (size_t)-2) { 63*58b9f456SAndroid Build Coastguard Worker *src = s + nms; 64*58b9f456SAndroid Build Coastguard Worker return (nchr); 65*58b9f456SAndroid Build Coastguard Worker } else if (nb == 0) { 66*58b9f456SAndroid Build Coastguard Worker *src = NULL; 67*58b9f456SAndroid Build Coastguard Worker return (nchr); 68*58b9f456SAndroid Build Coastguard Worker } 69*58b9f456SAndroid Build Coastguard Worker s += nb; 70*58b9f456SAndroid Build Coastguard Worker nms -= nb; 71*58b9f456SAndroid Build Coastguard Worker nchr++; 72*58b9f456SAndroid Build Coastguard Worker dst++; 73*58b9f456SAndroid Build Coastguard Worker } 74*58b9f456SAndroid Build Coastguard Worker *src = s; 75*58b9f456SAndroid Build Coastguard Worker return (nchr); 76*58b9f456SAndroid Build Coastguard Worker} 77