162f08720SJoerg Sonnenberger /*- 262f08720SJoerg Sonnenberger * Copyright (c) 1990, 1993 362f08720SJoerg Sonnenberger * The Regents of the University of California. All rights reserved. 462f08720SJoerg Sonnenberger * 562f08720SJoerg Sonnenberger * This code is derived from software contributed to Berkeley by 662f08720SJoerg Sonnenberger * Donn Seeley at UUNET Technologies, Inc. 762f08720SJoerg Sonnenberger * 862f08720SJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without 962f08720SJoerg Sonnenberger * modification, are permitted provided that the following conditions 1062f08720SJoerg Sonnenberger * are met: 1162f08720SJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright 1262f08720SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer. 1362f08720SJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright 1462f08720SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the 1562f08720SJoerg Sonnenberger * documentation and/or other materials provided with the distribution. 16*dc71b7abSJustin C. Sherrill * 3. Neither the name of the University nor the names of its contributors 1762f08720SJoerg Sonnenberger * may be used to endorse or promote products derived from this software 1862f08720SJoerg Sonnenberger * without specific prior written permission. 1962f08720SJoerg Sonnenberger * 2062f08720SJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2162f08720SJoerg Sonnenberger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2262f08720SJoerg Sonnenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2362f08720SJoerg Sonnenberger * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2462f08720SJoerg Sonnenberger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2562f08720SJoerg Sonnenberger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2662f08720SJoerg Sonnenberger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2762f08720SJoerg Sonnenberger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2862f08720SJoerg Sonnenberger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2962f08720SJoerg Sonnenberger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3062f08720SJoerg Sonnenberger * SUCH DAMAGE. 31e0f95098SPeter Avalos * 32e0f95098SPeter Avalos * @(#)vsscanf.c 8.1 (Berkeley) 6/4/93 33e0f95098SPeter Avalos * $FreeBSD: src/lib/libc/stdio/vswscanf.c,v 1.6 2009/01/15 18:53:52 rdivacky Exp $ 34e0f95098SPeter Avalos * $DragonFly: src/lib/libc/stdio/vswscanf.c,v 1.3 2006/03/02 18:05:30 joerg Exp $ 3562f08720SJoerg Sonnenberger */ 3662f08720SJoerg Sonnenberger 3762f08720SJoerg Sonnenberger #include <limits.h> 3862f08720SJoerg Sonnenberger #include <stdarg.h> 3962f08720SJoerg Sonnenberger #include <stdio.h> 4062f08720SJoerg Sonnenberger #include <stdlib.h> 4162f08720SJoerg Sonnenberger #include <string.h> 4262f08720SJoerg Sonnenberger #include <wchar.h> 4362f08720SJoerg Sonnenberger #include "local.h" 4462f08720SJoerg Sonnenberger #include "priv_stdio.h" 4562f08720SJoerg Sonnenberger 4662f08720SJoerg Sonnenberger static int eofread(void *, char *, int); 4762f08720SJoerg Sonnenberger 4862f08720SJoerg Sonnenberger static int 4954a0004dSSascha Wildner eofread(void *cookie __unused, char *buf __unused, int len __unused) 5062f08720SJoerg Sonnenberger { 5162f08720SJoerg Sonnenberger 5262f08720SJoerg Sonnenberger return (0); 5362f08720SJoerg Sonnenberger } 5462f08720SJoerg Sonnenberger 5562f08720SJoerg Sonnenberger int 5662f08720SJoerg Sonnenberger vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt, 5762f08720SJoerg Sonnenberger va_list ap) 5862f08720SJoerg Sonnenberger { 5962f08720SJoerg Sonnenberger static const mbstate_t initial; 6062f08720SJoerg Sonnenberger mbstate_t mbs; 6162f08720SJoerg Sonnenberger FILE f; 6262f08720SJoerg Sonnenberger char *mbstr; 6362f08720SJoerg Sonnenberger size_t mlen; 6462f08720SJoerg Sonnenberger int r; 65e0f95098SPeter Avalos const wchar_t *strp; 6662f08720SJoerg Sonnenberger 6762f08720SJoerg Sonnenberger /* 6862f08720SJoerg Sonnenberger * XXX Convert the wide character string to multibyte, which 6962f08720SJoerg Sonnenberger * __vfwscanf() will convert back to wide characters. 7062f08720SJoerg Sonnenberger */ 7162f08720SJoerg Sonnenberger if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL) 7262f08720SJoerg Sonnenberger return (EOF); 7362f08720SJoerg Sonnenberger mbs = initial; 74e0f95098SPeter Avalos strp = str; 75e0f95098SPeter Avalos if ((mlen = wcsrtombs(mbstr, &strp, SIZE_T_MAX, &mbs)) == (size_t)-1) { 7662f08720SJoerg Sonnenberger free(mbstr); 7762f08720SJoerg Sonnenberger return (EOF); 7862f08720SJoerg Sonnenberger } 7962f08720SJoerg Sonnenberger f.pub._fileno = -1; 8062f08720SJoerg Sonnenberger f.pub._flags = __SRD; 8162f08720SJoerg Sonnenberger f._bf._base = f.pub._p = (unsigned char *)mbstr; 8262f08720SJoerg Sonnenberger f._bf._size = f.pub._r = mlen; 8362f08720SJoerg Sonnenberger f._read = eofread; 8462f08720SJoerg Sonnenberger f._ub._base = NULL; 8562f08720SJoerg Sonnenberger f._lb._base = NULL; 86704ee28cSJoerg Sonnenberger memset(WCIO_GET(&f), 0, sizeof(struct wchar_io_data)); 87e0f95098SPeter Avalos r = __vfwscanf(&f, fmt, ap); 8862f08720SJoerg Sonnenberger free(mbstr); 8962f08720SJoerg Sonnenberger 9062f08720SJoerg Sonnenberger return (r); 9162f08720SJoerg Sonnenberger } 92