diff options
author | Zack Weinberg <zackw@panix.com> | 2018-03-07 14:31:59 -0500 |
---|---|---|
committer | Gabriel F. T. Gomes <gabriel@inconstante.eti.br> | 2018-12-05 18:15:42 -0200 |
commit | b87eb3f8feb826ac48463f598fc10476055bee5a (patch) | |
tree | f71f60fbd1a5340ca8d2a9015c813b04cf053036 | |
parent | 349718d4d7841df46bcc36df9bc2baef4c40d6f5 (diff) | |
download | glibc-b87eb3f8feb826ac48463f598fc10476055bee5a.zip glibc-b87eb3f8feb826ac48463f598fc10476055bee5a.tar.gz glibc-b87eb3f8feb826ac48463f598fc10476055bee5a.tar.bz2 |
Use SCANF_ISOC99_A instead of _IO_FLAGS2_SCANF_STD.
Change the callers of __vfscanf_internal and __vfwscanf_internal that
want C99-compliant behavior to communicate this via the new flags
argument, rather than setting bits on the FILE object. This also
means these functions do not need to do their own locking.
Tested for powerpc and powerpc64le.
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | libio/libio.h | 1 | ||||
-rw-r--r-- | libio/libioP.h | 5 | ||||
-rw-r--r-- | stdio-common/isoc99_fscanf.c | 7 | ||||
-rw-r--r-- | stdio-common/isoc99_scanf.c | 12 | ||||
-rw-r--r-- | stdio-common/isoc99_sscanf.c | 3 | ||||
-rw-r--r-- | stdio-common/isoc99_vfscanf.c | 9 | ||||
-rw-r--r-- | stdio-common/isoc99_vscanf.c | 9 | ||||
-rw-r--r-- | stdio-common/isoc99_vsscanf.c | 3 | ||||
-rw-r--r-- | stdio-common/vfscanf-internal.c | 2 | ||||
-rw-r--r-- | wcsmbs/isoc99_fwscanf.c | 7 | ||||
-rw-r--r-- | wcsmbs/isoc99_swscanf.c | 3 | ||||
-rw-r--r-- | wcsmbs/isoc99_vfwscanf.c | 9 | ||||
-rw-r--r-- | wcsmbs/isoc99_vswscanf.c | 3 | ||||
-rw-r--r-- | wcsmbs/isoc99_vwscanf.c | 9 | ||||
-rw-r--r-- | wcsmbs/isoc99_wscanf.c | 7 |
16 files changed, 40 insertions, 75 deletions
@@ -1,6 +1,32 @@ 2018-12-05 Zack Weinberg <zackw@panix.com> Gabriel F. T. Gomes <gabriel@inconstante.eti.br> + * stdio-common/isoc99_scanf.c + * stdio-common/isoc99_fscanf.c + * stdio-common/isoc99_sscanf.c + * stdio-common/isoc99_vscanf.c + * stdio-common/isoc99_vfscanf.c + * stdio-common/isoc99_vsscanf.c + * wcsmbs/isoc99_wscanf.c + * wcsmbs/isoc99_fwscanf.c + * wcsmbs/isoc99_swscanf.c + * wcsmbs/isoc99_vwscanf.c + * wcsmbs/isoc99_vfwscanf.c + * wcsmbs/isoc99_vswscanf.c: + Pass SCANF_ISOC99_A to __vfscanf_internal and/or __vfwscanf_internal. + Do not set _IO_FLAGS2_SCANF_STD on the FILE passed to that function. + No need to lock and unlock the FILE passed to that function. + + * stdio-common/vfscanf-internal.c + (__vfscanf_internal, __vfwscanf_internal): + Don't look at _IO_FLAGS2_SCANF_STD. + * libio/libioP.h (_IO_acquire_lock_clear_flags2_fct) + (_IO_release_lock): Don't clear _IO_FLAGS2_SCANF_STD. + * libio/libio.h (_IO_FLAGS2_SCANF_STD): Delete. + +2018-12-05 Zack Weinberg <zackw@panix.com> + Gabriel F. T. Gomes <gabriel@inconstante.eti.br> + * libio/libioP.h (SCANF_LDBL_IS_DBL, SCANF_ISOC99_A): New constants. (__vfscanf_internal, __vfwscanf_internal): New function prototypes. * libio/libio.h: Remove libc_hidden_proto for _IO_vfscanf. diff --git a/libio/libio.h b/libio/libio.h index d4eba2d..30cb7d7 100644 --- a/libio/libio.h +++ b/libio/libio.h @@ -92,7 +92,6 @@ typedef union #define _IO_FLAGS2_NOTCANCEL 2 #define _IO_FLAGS2_FORTIFY 4 #define _IO_FLAGS2_USER_WBUF 8 -#define _IO_FLAGS2_SCANF_STD 16 #define _IO_FLAGS2_NOCLOSE 32 #define _IO_FLAGS2_CLOEXEC 64 #define _IO_FLAGS2_NEED_LOCK 128 diff --git a/libio/libioP.h b/libio/libioP.h index 525dce1..9e971cb 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -786,7 +786,7 @@ __attribute__ ((__always_inline__)) _IO_acquire_lock_clear_flags2_fct (FILE **p) { FILE *fp = *p; - fp->_flags2 &= ~(_IO_FLAGS2_FORTIFY | _IO_FLAGS2_SCANF_STD); + fp->_flags2 &= ~(_IO_FLAGS2_FORTIFY); if ((fp->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (fp); } @@ -800,8 +800,7 @@ _IO_acquire_lock_clear_flags2_fct (FILE **p) FILE *_IO_acquire_lock_file = (_fp) # define _IO_release_lock(_fp) \ if (_IO_acquire_lock_file != NULL) \ - _IO_acquire_lock_file->_flags2 &= ~(_IO_FLAGS2_FORTIFY \ - | _IO_FLAGS2_SCANF_STD); \ + _IO_acquire_lock_file->_flags2 &= ~(_IO_FLAGS2_FORTIFY); \ } while (0) #endif diff --git a/stdio-common/isoc99_fscanf.c b/stdio-common/isoc99_fscanf.c index 4210d11..d7b5993 100644 --- a/stdio-common/isoc99_fscanf.c +++ b/stdio-common/isoc99_fscanf.c @@ -20,20 +20,15 @@ #include <stdio.h> /* Read formatted input from STREAM according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_fscanf (FILE *stream, const char *format, ...) { va_list arg; int done; - _IO_acquire_lock_clear_flags2 (stream); - stream->_flags2 |= _IO_FLAGS2_SCANF_STD; - va_start (arg, format); - done = __vfscanf_internal (stream, format, arg, 0); + done = __vfscanf_internal (stream, format, arg, SCANF_ISOC99_A); va_end (arg); - _IO_release_lock (stream); return done; } diff --git a/stdio-common/isoc99_scanf.c b/stdio-common/isoc99_scanf.c index 64c873e..3998322 100644 --- a/stdio-common/isoc99_scanf.c +++ b/stdio-common/isoc99_scanf.c @@ -19,26 +19,16 @@ #include <stdio.h> #include <libioP.h> - /* Read formatted input from stdin according to the format string FORMAT. */ -/* VARARGS1 */ int __isoc99_scanf (const char *format, ...) { va_list arg; int done; -#ifdef _IO_MTSAFE_IO - _IO_acquire_lock_clear_flags2 (stdin); -#endif - stdin->_flags2 |= _IO_FLAGS2_SCANF_STD; - va_start (arg, format); - done = __vfscanf_internal (stdin, format, arg, 0); + done = __vfscanf_internal (stdin, format, arg, SCANF_ISOC99_A); va_end (arg); -#ifdef _IO_MTSAFE_IO - _IO_release_lock (stdin); -#endif return done; } diff --git a/stdio-common/isoc99_sscanf.c b/stdio-common/isoc99_sscanf.c index 2c89a03..c9e5103 100644 --- a/stdio-common/isoc99_sscanf.c +++ b/stdio-common/isoc99_sscanf.c @@ -26,10 +26,9 @@ __isoc99_sscanf (const char *s, const char *format, ...) int done; _IO_strfile sf; FILE *f = _IO_strfile_read (&sf, s); - f->_flags2 |= _IO_FLAGS2_SCANF_STD; va_start (arg, format); - done = __vfscanf_internal (f, format, arg, 0); + done = __vfscanf_internal (f, format, arg, SCANF_ISOC99_A); va_end (arg); return done; diff --git a/stdio-common/isoc99_vfscanf.c b/stdio-common/isoc99_vfscanf.c index c96ca83..3c59c60 100644 --- a/stdio-common/isoc99_vfscanf.c +++ b/stdio-common/isoc99_vfscanf.c @@ -19,16 +19,9 @@ #include <stdio.h> /* Read formatted input from STREAM according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_vfscanf (FILE *stream, const char *format, va_list args) { - int done; - - _IO_acquire_lock_clear_flags2 (stream); - stream->_flags2 |= _IO_FLAGS2_SCANF_STD; - done = __vfscanf_internal (stream, format, args, 0); - _IO_release_lock (stream); - return done; + return __vfscanf_internal (stream, format, args, SCANF_ISOC99_A); } libc_hidden_def (__isoc99_vfscanf) diff --git a/stdio-common/isoc99_vscanf.c b/stdio-common/isoc99_vscanf.c index 72ae72d..fc5d609 100644 --- a/stdio-common/isoc99_vscanf.c +++ b/stdio-common/isoc99_vscanf.c @@ -19,15 +19,8 @@ #include <stdio.h> /* Read formatted input from STDIN according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_vscanf (const char *format, va_list args) { - int done; - - _IO_acquire_lock_clear_flags2 (stdin); - stdin->_flags2 |= _IO_FLAGS2_SCANF_STD; - done = __vfscanf_internal (stdin, format, args, 0); - _IO_release_lock (stdin); - return done; + return __vfscanf_internal (stdin, format, args, SCANF_ISOC99_A); } diff --git a/stdio-common/isoc99_vsscanf.c b/stdio-common/isoc99_vsscanf.c index 02bc0f5..dfc394b 100644 --- a/stdio-common/isoc99_vsscanf.c +++ b/stdio-common/isoc99_vsscanf.c @@ -31,7 +31,6 @@ __isoc99_vsscanf (const char *string, const char *format, va_list args) { _IO_strfile sf; FILE *f = _IO_strfile_read (&sf, string); - f->_flags2 |= _IO_FLAGS2_SCANF_STD; - return __vfscanf_internal (f, format, args, 0); + return __vfscanf_internal (f, format, args, SCANF_ISOC99_A); } libc_hidden_def (__isoc99_vsscanf) diff --git a/stdio-common/vfscanf-internal.c b/stdio-common/vfscanf-internal.c index 6bd0138..df79d91 100644 --- a/stdio-common/vfscanf-internal.c +++ b/stdio-common/vfscanf-internal.c @@ -335,8 +335,6 @@ __vfscanf_internal (FILE *s, const char *format, va_list argptr, /* Temporarily honor the environmental mode bits. */ if (__ldbl_is_dbl) mode_flags |= SCANF_LDBL_IS_DBL; - if (s->_flags2 & _IO_FLAGS2_SCANF_STD) - mode_flags |= SCANF_ISOC99_A; #ifdef __va_copy __va_copy (arg, argptr); diff --git a/wcsmbs/isoc99_fwscanf.c b/wcsmbs/isoc99_fwscanf.c index 00b07dd..5829607 100644 --- a/wcsmbs/isoc99_fwscanf.c +++ b/wcsmbs/isoc99_fwscanf.c @@ -21,20 +21,15 @@ #include <wchar.h> /* Read formatted input from STREAM according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_fwscanf (FILE *stream, const wchar_t *format, ...) { va_list arg; int done; - _IO_acquire_lock_clear_flags2 (stream); - stream->_flags2 |= _IO_FLAGS2_SCANF_STD; - va_start (arg, format); - done = __vfwscanf_internal (stream, format, arg, 0); + done = __vfwscanf_internal (stream, format, arg, SCANF_ISOC99_A); va_end (arg); - _IO_release_lock (stream); return done; } diff --git a/wcsmbs/isoc99_swscanf.c b/wcsmbs/isoc99_swscanf.c index 40401d0..f90e56d 100644 --- a/wcsmbs/isoc99_swscanf.c +++ b/wcsmbs/isoc99_swscanf.c @@ -28,10 +28,9 @@ __isoc99_swscanf (const wchar_t *s, const wchar_t *format, ...) _IO_strfile sf; struct _IO_wide_data wd; FILE *f = _IO_strfile_readw (&sf, &wd, s); - f->_flags2 |= _IO_FLAGS2_SCANF_STD; va_start (arg, format); - done = __vfwscanf_internal (f, format, arg, 0); + done = __vfwscanf_internal (f, format, arg, SCANF_ISOC99_A); va_end (arg); return done; diff --git a/wcsmbs/isoc99_vfwscanf.c b/wcsmbs/isoc99_vfwscanf.c index f70c6b5..715d354 100644 --- a/wcsmbs/isoc99_vfwscanf.c +++ b/wcsmbs/isoc99_vfwscanf.c @@ -20,16 +20,9 @@ #include <wchar.h> /* Read formatted input from STREAM according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_vfwscanf (FILE *stream, const wchar_t *format, va_list args) { - int done; - - _IO_acquire_lock_clear_flags2 (stream); - stream->_flags2 |= _IO_FLAGS2_SCANF_STD; - done = __vfwscanf_internal (stream, format, args, 0); - _IO_release_lock (stream); - return done; + return __vfwscanf_internal (stream, format, args, SCANF_ISOC99_A); } libc_hidden_def (__isoc99_vfwscanf) diff --git a/wcsmbs/isoc99_vswscanf.c b/wcsmbs/isoc99_vswscanf.c index b91eb65..0d8ef76 100644 --- a/wcsmbs/isoc99_vswscanf.c +++ b/wcsmbs/isoc99_vswscanf.c @@ -33,7 +33,6 @@ __isoc99_vswscanf (const wchar_t *string, const wchar_t *format, va_list args) _IO_strfile sf; struct _IO_wide_data wd; FILE *f = _IO_strfile_readw (&sf, &wd, string); - f->_flags2 |= _IO_FLAGS2_SCANF_STD; - return __vfwscanf_internal (f, format, args, 0); + return __vfwscanf_internal (f, format, args, SCANF_ISOC99_A); } libc_hidden_def (__isoc99_vswscanf) diff --git a/wcsmbs/isoc99_vwscanf.c b/wcsmbs/isoc99_vwscanf.c index eb22c8a..3ac3182 100644 --- a/wcsmbs/isoc99_vwscanf.c +++ b/wcsmbs/isoc99_vwscanf.c @@ -20,15 +20,8 @@ #include <wchar.h> /* Read formatted input from STDIN according to the format string FORMAT. */ -/* VARARGS2 */ int __isoc99_vwscanf (const wchar_t *format, va_list args) { - int done; - - _IO_acquire_lock_clear_flags2 (stdin); - stdin->_flags2 |= _IO_FLAGS2_SCANF_STD; - done = __vfwscanf_internal (stdin, format, args, 0); - _IO_release_lock (stdin); - return done; + return __vfwscanf_internal (stdin, format, args, SCANF_ISOC99_A); } diff --git a/wcsmbs/isoc99_wscanf.c b/wcsmbs/isoc99_wscanf.c index 59f80d7..b9418f7 100644 --- a/wcsmbs/isoc99_wscanf.c +++ b/wcsmbs/isoc99_wscanf.c @@ -22,20 +22,15 @@ /* Read formatted input from stdin according to the format string FORMAT. */ -/* VARARGS1 */ int __isoc99_wscanf (const wchar_t *format, ...) { va_list arg; int done; - _IO_acquire_lock_clear_flags2 (stdin); - stdin->_flags2 |= _IO_FLAGS2_SCANF_STD; - va_start (arg, format); - done = __vfwscanf_internal (stdin, format, arg, 0); + done = __vfwscanf_internal (stdin, format, arg, SCANF_ISOC99_A); va_end (arg); - _IO_release_lock (stdin); return done; } |