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.
This commit is contained in:
Zack Weinberg 2018-03-07 14:31:59 -05:00 committed by Gabriel F. T. Gomes
parent 349718d4d7
commit b87eb3f8fe
16 changed files with 40 additions and 75 deletions

View File

@ -1,3 +1,29 @@
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>

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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)

View File

@ -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);
}

View File

@ -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)

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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);
}

View File

@ -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;
}