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