10a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes/* $OpenBSD: mbtowc.c,v 1.2 2012/12/05 23:20:00 deraadt Exp $ */ 20a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes 30a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes/*- 40a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * Copyright (c) 2002-2004 Tim J. Robbins. 50a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * All rights reserved. 60a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * 70a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * Redistribution and use in source and binary forms, with or without 80a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * modification, are permitted provided that the following conditions 90a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * are met: 100a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * 1. Redistributions of source code must retain the above copyright 110a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * notice, this list of conditions and the following disclaimer. 120a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 130a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * notice, this list of conditions and the following disclaimer in the 140a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * documentation and/or other materials provided with the distribution. 150a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * 160a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 170a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 180a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 190a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 200a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 210a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 220a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 230a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 240a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 250a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 260a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes * SUCH DAMAGE. 270a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes */ 280a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes 290a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes 300a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes#include <stdlib.h> 310a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes#include <string.h> 320a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes#include <wchar.h> 330a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes#include <errno.h> 340a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes 350a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughesint 360a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughesmbtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n) 370a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes{ 380a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes static mbstate_t mbs; 390a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes size_t rval; 400a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes 410a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes if (s == NULL) { 420a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes /* No support for state dependent encodings. */ 430a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes memset(&mbs, 0, sizeof(mbs)); 440a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes return (0); 450a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes } 460a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes rval = mbrtowc(pwc, s, n, &mbs); 470a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes if (rval == (size_t)-1 || rval == (size_t)-2) 480a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes return (-1); 490a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes return ((int)rval); 500a5e26da1eae6b75a89695faf2e057c5c4717721Elliott Hughes} 51