mbsrtowcs.c revision 129179
1102050Stjr/*- 2127944Stjr * Copyright (c) 2002-2004 Tim J. Robbins. 3102050Stjr * All rights reserved. 4102050Stjr * 5102050Stjr * Redistribution and use in source and binary forms, with or without 6102050Stjr * modification, are permitted provided that the following conditions 7102050Stjr * are met: 8102050Stjr * 1. Redistributions of source code must retain the above copyright 9102050Stjr * notice, this list of conditions and the following disclaimer. 10102050Stjr * 2. Redistributions in binary form must reproduce the above copyright 11102050Stjr * notice, this list of conditions and the following disclaimer in the 12102050Stjr * documentation and/or other materials provided with the distribution. 13102050Stjr * 14102050Stjr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15102050Stjr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16102050Stjr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17102050Stjr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18102050Stjr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19102050Stjr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20102050Stjr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21102050Stjr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22102050Stjr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23102050Stjr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24102050Stjr * SUCH DAMAGE. 25102050Stjr */ 26102050Stjr 27102050Stjr#include <sys/cdefs.h> 28102050Stjr__FBSDID("$FreeBSD: head/lib/libc/locale/mbsrtowcs.c 129179 2004-05-13 11:20:27Z tjr $"); 29102050Stjr 30102050Stjr#include <errno.h> 31102050Stjr#include <limits.h> 32102050Stjr#include <stdlib.h> 33102050Stjr#include <wchar.h> 34129154Stjr#include "mblocal.h" 35102050Stjr 36102050Stjrsize_t 37103012Stjrmbsrtowcs(wchar_t * __restrict dst, const char ** __restrict src, size_t len, 38127944Stjr mbstate_t * __restrict ps) 39102050Stjr{ 40127944Stjr static mbstate_t mbs; 41129179Stjr 42129179Stjr if (ps == NULL) 43129179Stjr ps = &mbs; 44129179Stjr return (__mbsrtowcs(dst, src, len, ps)); 45129179Stjr} 46129179Stjr 47129179Stjrsize_t 48129179Stjr__mbsrtowcs_std(wchar_t * __restrict dst, const char ** __restrict src, 49129179Stjr size_t len, mbstate_t * __restrict ps) 50129179Stjr{ 51102050Stjr const char *s; 52102050Stjr size_t nchr; 53102050Stjr wchar_t wc; 54102050Stjr int nb; 55102050Stjr 56102050Stjr s = *src; 57102050Stjr nchr = 0; 58102050Stjr 59102050Stjr if (dst == NULL) { 60102050Stjr for (;;) { 61129154Stjr if ((nb = (int)__mbrtowc(&wc, s, MB_CUR_MAX, ps)) < 0) 62102050Stjr /* Invalid sequence - mbrtowc() sets errno. */ 63102050Stjr return ((size_t)-1); 64102050Stjr else if (nb == 0) 65102050Stjr return (nchr); 66102050Stjr s += nb; 67102050Stjr nchr++; 68102050Stjr } 69102050Stjr /*NOTREACHED*/ 70102050Stjr } 71102050Stjr 72102050Stjr while (len-- > 0) { 73129154Stjr if ((nb = (int)__mbrtowc(dst, s, MB_CUR_MAX, ps)) < 0) { 74102050Stjr *src = s; 75102050Stjr return ((size_t)-1); 76102050Stjr } else if (nb == 0) { 77102050Stjr *src = NULL; 78102050Stjr return (nchr); 79102050Stjr } 80102050Stjr s += nb; 81102050Stjr nchr++; 82102050Stjr dst++; 83102050Stjr } 84102050Stjr *src = s; 85102050Stjr return (nchr); 86102050Stjr} 87