diff options
Diffstat (limited to 'libio')
-rw-r--r-- | libio/iovsscanf.c | 12 | ||||
-rw-r--r-- | libio/iovswscanf.c | 14 | ||||
-rw-r--r-- | libio/libio.h | 1 | ||||
-rw-r--r-- | libio/libioP.h | 22 | ||||
-rw-r--r-- | libio/strfile.h | 33 | ||||
-rw-r--r-- | libio/swscanf.c | 10 | ||||
-rw-r--r-- | libio/vscanf.c | 2 | ||||
-rw-r--r-- | libio/vwscanf.c | 2 | ||||
-rw-r--r-- | libio/wscanf.c | 2 |
9 files changed, 68 insertions, 30 deletions
diff --git a/libio/iovsscanf.c b/libio/iovsscanf.c index e56ab8bd7d..ee6a99ec6a 100644 --- a/libio/iovsscanf.c +++ b/libio/iovsscanf.c @@ -24,22 +24,14 @@ This exception applies to code released by its copyright holders in files containing the exception. */ -#include "libioP.h" #include "strfile.h" int _IO_vsscanf (const char *string, const char *format, va_list args) { - int ret; _IO_strfile sf; -#ifdef _IO_MTSAFE_IO - sf._sbf._f._lock = NULL; -#endif - _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); - _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; - _IO_str_init_static_internal (&sf, (char*)string, 0, NULL); - ret = _IO_vfscanf (&sf._sbf._f, format, args, NULL); - return ret; + FILE *f = _IO_strfile_read (&sf, string); + return __vfscanf_internal (f, format, args, 0); } ldbl_weak_alias (_IO_vsscanf, __vsscanf) ldbl_weak_alias (_IO_vsscanf, vsscanf) diff --git a/libio/iovswscanf.c b/libio/iovswscanf.c index 5bd1c88412..cb9cbe15cc 100644 --- a/libio/iovswscanf.c +++ b/libio/iovswscanf.c @@ -24,24 +24,16 @@ This exception applies to code released by its copyright holders in files containing the exception. */ -#include "libioP.h" -#include "strfile.h" #include <wchar.h> +#include "strfile.h" int __vswscanf (const wchar_t *string, const wchar_t *format, va_list args) { - int ret; _IO_strfile sf; struct _IO_wide_data wd; -#ifdef _IO_MTSAFE_IO - sf._sbf._f._lock = NULL; -#endif - _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, 0, &wd, &_IO_wstr_jumps); - _IO_fwide (&sf._sbf._f, 1); - _IO_wstr_init_static (&sf._sbf._f, (wchar_t *)string, 0, NULL); - ret = _IO_vfwscanf ((FILE *) &sf._sbf, format, args, NULL); - return ret; + FILE *f = _IO_strfile_readw (&sf, &wd, string); + return __vfwscanf_internal (f, format, args, 0); } libc_hidden_def (__vswscanf) ldbl_hidden_def (__vswscanf, vswscanf) diff --git a/libio/libio.h b/libio/libio.h index 00f9169613..d4eba2df54 100644 --- a/libio/libio.h +++ b/libio/libio.h @@ -321,7 +321,6 @@ libc_hidden_proto (_IO_padn) libc_hidden_proto (_IO_putc) libc_hidden_proto (_IO_sgetn) libc_hidden_proto (_IO_vfprintf) -libc_hidden_proto (_IO_vfscanf) #ifdef _IO_MTSAFE_IO # undef _IO_peekc diff --git a/libio/libioP.h b/libio/libioP.h index df2633d858..525dce19ee 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -704,6 +704,28 @@ extern off64_t _IO_seekpos_unlocked (FILE *, off64_t, int) #endif /* _G_HAVE_MMAP */ +/* Flags for __vfscanf_internal and __vfwscanf_internal. + + SCANF_LDBL_IS_DBL indicates whether long double values are to be + handled as having the same format as double, in which case the flag + should be set to one, or as another format, otherwise. + + SCANF_ISOC99_A, when set to one, indicates that the ISO C99 or POSIX + behavior of the scanf functions is to be used, i.e. automatic + allocation for input strings with %as, %aS and %a[, a GNU extension, + is disabled. This is the behavior that the __isoc99_scanf family of + functions use. When the flag is set to zero, automatic allocation is + enabled. */ +#define SCANF_LDBL_IS_DBL 0x0001 +#define SCANF_ISOC99_A 0x0002 + +extern int __vfscanf_internal (FILE *fp, const char *format, va_list argp, + unsigned int flags) + attribute_hidden; +extern int __vfwscanf_internal (FILE *fp, const wchar_t *format, va_list argp, + unsigned int flags) + attribute_hidden; + extern int _IO_vscanf (const char *, va_list) __THROW; #ifdef _IO_MTSAFE_IO diff --git a/libio/strfile.h b/libio/strfile.h index 75caac2af5..e51ac34ccd 100644 --- a/libio/strfile.h +++ b/libio/strfile.h @@ -24,7 +24,9 @@ This exception applies to code released by its copyright holders in files containing the exception. */ -#include <stdio.h> +#ifndef STRFILE_H_ +#define STRFILE_H_ + #include "libioP.h" typedef void *(*_IO_alloc_type) (size_t); @@ -80,3 +82,32 @@ typedef struct } _IO_wstrnfile; extern const struct _IO_jump_t _IO_wstrn_jumps attribute_hidden; + +/* Initialize an _IO_strfile SF to read from narrow string STRING, and + return the corresponding FILE object. It is not necessary to fclose + the FILE when it is no longer needed. */ +static inline FILE * +_IO_strfile_read (_IO_strfile *sf, const char *string) +{ + sf->_sbf._f._lock = NULL; + _IO_no_init (&sf->_sbf._f, _IO_USER_LOCK, -1, NULL, NULL); + _IO_JUMPS (&sf->_sbf) = &_IO_str_jumps; + _IO_str_init_static_internal (sf, (char*)string, 0, NULL); + return &sf->_sbf._f; +} + +/* Initialize an _IO_strfile SF and _IO_wide_data WD to read from wide + string STRING, and return the corresponding FILE object. It is not + necessary to fclose the FILE when it is no longer needed. */ +static inline FILE * +_IO_strfile_readw (_IO_strfile *sf, struct _IO_wide_data *wd, + const wchar_t *string) +{ + sf->_sbf._f._lock = NULL; + _IO_no_init (&sf->_sbf._f, _IO_USER_LOCK, 0, wd, &_IO_wstr_jumps); + _IO_fwide (&sf->_sbf._f, 1); + _IO_wstr_init_static (&sf->_sbf._f, (wchar_t *)string, 0, NULL); + return &sf->_sbf._f; +} + +#endif /* strfile.h. */ diff --git a/libio/swscanf.c b/libio/swscanf.c index c8686bcbaf..90f721cc51 100644 --- a/libio/swscanf.c +++ b/libio/swscanf.c @@ -15,20 +15,22 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <libioP.h> #include <stdarg.h> -#include <wchar.h> +#include "strfile.h" /* Read formatted input from S, according to the format string FORMAT. */ -/* VARARGS2 */ + int __swscanf (const wchar_t *s, const wchar_t *format, ...) { va_list arg; int done; + _IO_strfile sf; + struct _IO_wide_data wd; + FILE *f = _IO_strfile_readw (&sf, &wd, s); va_start (arg, format); - done = __vswscanf (s, format, arg); + done = __vfwscanf_internal (f, format, arg, 0); va_end (arg); return done; diff --git a/libio/vscanf.c b/libio/vscanf.c index 9c27122c27..a3e2dd43f2 100644 --- a/libio/vscanf.c +++ b/libio/vscanf.c @@ -32,6 +32,6 @@ int _IO_vscanf (const char *format, va_list args) { - return _IO_vfscanf (_IO_stdin, format, args, NULL); + return __vfscanf_internal (_IO_stdin, format, args, 0); } ldbl_weak_alias (_IO_vscanf, vscanf) diff --git a/libio/vwscanf.c b/libio/vwscanf.c index 0d5f558758..7af770c8c3 100644 --- a/libio/vwscanf.c +++ b/libio/vwscanf.c @@ -30,6 +30,6 @@ int __vwscanf (const wchar_t *format, va_list args) { - return _IO_vfwscanf (_IO_stdin, format, args, NULL); + return __vfwscanf_internal (_IO_stdin, format, args, 0); } ldbl_strong_alias (__vwscanf, vwscanf) diff --git a/libio/wscanf.c b/libio/wscanf.c index c8cdad0acd..fe27ff6fa6 100644 --- a/libio/wscanf.c +++ b/libio/wscanf.c @@ -30,7 +30,7 @@ __wscanf (const wchar_t *format, ...) int done; va_start (arg, format); - done = _IO_vfwscanf (stdin, format, arg, NULL); + done = __vfwscanf_internal (stdin, format, arg, 0); va_end (arg); return done; |