1*62f08720SJoerg Sonnenberger /* $NetBSD: vswscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ 2*62f08720SJoerg Sonnenberger /* $DragonFly: src/lib/libc/stdio/vswscanf.c,v 1.1 2005/07/25 00:37:41 joerg Exp $ */ 3*62f08720SJoerg Sonnenberger 4*62f08720SJoerg Sonnenberger /*- 5*62f08720SJoerg Sonnenberger * Copyright (c) 1990, 1993 6*62f08720SJoerg Sonnenberger * The Regents of the University of California. All rights reserved. 7*62f08720SJoerg Sonnenberger * 8*62f08720SJoerg Sonnenberger * This code is derived from software contributed to Berkeley by 9*62f08720SJoerg Sonnenberger * Donn Seeley at UUNET Technologies, Inc. 10*62f08720SJoerg Sonnenberger * 11*62f08720SJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without 12*62f08720SJoerg Sonnenberger * modification, are permitted provided that the following conditions 13*62f08720SJoerg Sonnenberger * are met: 14*62f08720SJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright 15*62f08720SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer. 16*62f08720SJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright 17*62f08720SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the 18*62f08720SJoerg Sonnenberger * documentation and/or other materials provided with the distribution. 19*62f08720SJoerg Sonnenberger * 3. All advertising materials mentioning features or use of this software 20*62f08720SJoerg Sonnenberger * must display the following acknowledgement: 21*62f08720SJoerg Sonnenberger * This product includes software developed by the University of 22*62f08720SJoerg Sonnenberger * California, Berkeley and its contributors. 23*62f08720SJoerg Sonnenberger * 4. Neither the name of the University nor the names of its contributors 24*62f08720SJoerg Sonnenberger * may be used to endorse or promote products derived from this software 25*62f08720SJoerg Sonnenberger * without specific prior written permission. 26*62f08720SJoerg Sonnenberger * 27*62f08720SJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 28*62f08720SJoerg Sonnenberger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29*62f08720SJoerg Sonnenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30*62f08720SJoerg Sonnenberger * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31*62f08720SJoerg Sonnenberger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 32*62f08720SJoerg Sonnenberger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 33*62f08720SJoerg Sonnenberger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34*62f08720SJoerg Sonnenberger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35*62f08720SJoerg Sonnenberger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36*62f08720SJoerg Sonnenberger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37*62f08720SJoerg Sonnenberger * SUCH DAMAGE. 38*62f08720SJoerg Sonnenberger */ 39*62f08720SJoerg Sonnenberger 40*62f08720SJoerg Sonnenberger #include <limits.h> 41*62f08720SJoerg Sonnenberger #include <stdarg.h> 42*62f08720SJoerg Sonnenberger #include <stdio.h> 43*62f08720SJoerg Sonnenberger #include <stdlib.h> 44*62f08720SJoerg Sonnenberger #include <string.h> 45*62f08720SJoerg Sonnenberger #include <wchar.h> 46*62f08720SJoerg Sonnenberger 47*62f08720SJoerg Sonnenberger #include "local.h" 48*62f08720SJoerg Sonnenberger #include "priv_stdio.h" 49*62f08720SJoerg Sonnenberger 50*62f08720SJoerg Sonnenberger static int eofread(void *, char *, int); 51*62f08720SJoerg Sonnenberger 52*62f08720SJoerg Sonnenberger static int 53*62f08720SJoerg Sonnenberger /*ARGSUSED*/ 54*62f08720SJoerg Sonnenberger eofread(void *cookie, char *buf, int len) 55*62f08720SJoerg Sonnenberger { 56*62f08720SJoerg Sonnenberger 57*62f08720SJoerg Sonnenberger return (0); 58*62f08720SJoerg Sonnenberger } 59*62f08720SJoerg Sonnenberger 60*62f08720SJoerg Sonnenberger int 61*62f08720SJoerg Sonnenberger vswscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt, 62*62f08720SJoerg Sonnenberger va_list ap) 63*62f08720SJoerg Sonnenberger { 64*62f08720SJoerg Sonnenberger static const mbstate_t initial; 65*62f08720SJoerg Sonnenberger mbstate_t mbs; 66*62f08720SJoerg Sonnenberger FILE f; 67*62f08720SJoerg Sonnenberger char *mbstr; 68*62f08720SJoerg Sonnenberger size_t mlen; 69*62f08720SJoerg Sonnenberger int r; 70*62f08720SJoerg Sonnenberger 71*62f08720SJoerg Sonnenberger /* 72*62f08720SJoerg Sonnenberger * XXX Convert the wide character string to multibyte, which 73*62f08720SJoerg Sonnenberger * __vfwscanf() will convert back to wide characters. 74*62f08720SJoerg Sonnenberger */ 75*62f08720SJoerg Sonnenberger if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL) 76*62f08720SJoerg Sonnenberger return (EOF); 77*62f08720SJoerg Sonnenberger mbs = initial; 78*62f08720SJoerg Sonnenberger if ((mlen = wcsrtombs(mbstr, (const wchar_t ** __restrict)&str, 79*62f08720SJoerg Sonnenberger SIZE_T_MAX, &mbs)) == (size_t)-1) { 80*62f08720SJoerg Sonnenberger free(mbstr); 81*62f08720SJoerg Sonnenberger return (EOF); 82*62f08720SJoerg Sonnenberger } 83*62f08720SJoerg Sonnenberger f.pub._fileno = -1; 84*62f08720SJoerg Sonnenberger f.pub._flags = __SRD; 85*62f08720SJoerg Sonnenberger f._bf._base = f.pub._p = (unsigned char *)mbstr; 86*62f08720SJoerg Sonnenberger f._bf._size = f.pub._r = mlen; 87*62f08720SJoerg Sonnenberger f._read = eofread; 88*62f08720SJoerg Sonnenberger f._ub._base = NULL; 89*62f08720SJoerg Sonnenberger f._lb._base = NULL; 90*62f08720SJoerg Sonnenberger f._up = NULL; 91*62f08720SJoerg Sonnenberger f.fl_mutex = PTHREAD_MUTEX_INITIALIZER; 92*62f08720SJoerg Sonnenberger f.fl_owner = NULL; 93*62f08720SJoerg Sonnenberger f.fl_count = 0; 94*62f08720SJoerg Sonnenberger memset(&f._wcio, 0, sizeof(f._wcio)); 95*62f08720SJoerg Sonnenberger r = __vfwscanf_unlocked(&f, fmt, ap); 96*62f08720SJoerg Sonnenberger free(mbstr); 97*62f08720SJoerg Sonnenberger 98*62f08720SJoerg Sonnenberger return (r); 99*62f08720SJoerg Sonnenberger } 100