mirror of git://sourceware.org/git/glibc.git
ldbl-128ibm-compat: Add wide character scanning functions
Similarly to what was done for regular character scanning functions, this patch uses the new mode mask, SCANF_LDBL_USES_FLOAT128, in the 'mode' argument of the wide characters scanning function, __vfwscanf_internal (which is also extended to support scanning floating-point values with IEEE binary128, by redirecting calls to __wcstold_internal to __wcstof128_internal). Tested for powerpc64le. Reviewed-By: Paul E. Murphy <murphyp@linux.ibm.com>
This commit is contained in:
parent
a5b15bdec8
commit
b370c5f014
|
|
@ -1,3 +1,11 @@
|
|||
ifeq ($(subdir),libio)
|
||||
ldbl-extra-routines += fwscanf \
|
||||
swscanf \
|
||||
wscanf \
|
||||
vswscanf \
|
||||
vwscanf
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),stdio-common)
|
||||
ldbl-extra-routines += printf_size \
|
||||
asprintf \
|
||||
|
|
@ -23,7 +31,8 @@ ldbl-extra-routines += printf_size \
|
|||
sscanf \
|
||||
vfscanf \
|
||||
vscanf \
|
||||
vsscanf
|
||||
vsscanf \
|
||||
vfwscanf
|
||||
|
||||
# Printing long double values with IEEE binary128 format reuses part
|
||||
# of the internal float128 implementation (__printf_fp, __printf_fphex,
|
||||
|
|
@ -34,6 +43,7 @@ ldbl-extra-routines += printf_size \
|
|||
CFLAGS-vfprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
|
||||
CFLAGS-vfwprintf-internal.c += -mfloat128 -mabi=ibmlongdouble
|
||||
CFLAGS-vfscanf-internal.c += -mfloat128 -mabi=ibmlongdouble
|
||||
CFLAGS-vfwscanf-internal.c += -mfloat128 -mabi=ibmlongdouble
|
||||
|
||||
# Basic tests for the implementation of long double with IEEE binary128
|
||||
# format and for the related redirections in installed headers.
|
||||
|
|
@ -51,9 +61,18 @@ CFLAGS-test-scanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
|
|||
|
||||
$(objpfx)test-scanf-ieee128: gnulib-tests += $(f128-loader-link)
|
||||
|
||||
tests-internal += test-wscanf-ieee128 test-wscanf-ibm128
|
||||
CFLAGS-test-wscanf-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
|
||||
CFLAGS-test-wscanf-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
|
||||
|
||||
$(objpfx)test-wscanf-ieee128: gnulib-tests += $(f128-loader-link)
|
||||
|
||||
ifeq ($(run-built-tests),yes)
|
||||
tests-special += $(objpfx)test-scanf-ieee128.out
|
||||
tests-special += $(objpfx)test-scanf-ibm128.out
|
||||
|
||||
tests-special += $(objpfx)test-wscanf-ieee128.out
|
||||
tests-special += $(objpfx)test-wscanf-ibm128.out
|
||||
endif
|
||||
|
||||
$(objpfx)test-scanf-ieee128.out: \
|
||||
|
|
@ -68,6 +87,18 @@ $(objpfx)test-scanf-ibm128.out: \
|
|||
$(SHELL) $^ '$(test-program-prefix)' $@; \
|
||||
$(evaluate-test)
|
||||
|
||||
$(objpfx)test-wscanf-ieee128.out: \
|
||||
../sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh \
|
||||
$(objpfx)test-wscanf-ieee128
|
||||
$(SHELL) $^ '$(test-program-prefix)' $@; \
|
||||
$(evaluate-test)
|
||||
|
||||
$(objpfx)test-wscanf-ibm128.out: \
|
||||
../sysdeps/ieee754/ldbl-128ibm-compat/test-scanf-ldbl-compat.sh \
|
||||
$(objpfx)test-wscanf-ibm128
|
||||
$(SHELL) $^ '$(test-program-prefix)' $@; \
|
||||
$(evaluate-test)
|
||||
|
||||
tests-internal += test-printf-size-ieee128 test-printf-size-ibm128
|
||||
CFLAGS-test-printf-size-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
|
||||
CFLAGS-test-printf-size-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
|
||||
|
|
|
|||
|
|
@ -172,5 +172,13 @@ libc {
|
|||
__vfscanfieee128;
|
||||
__vscanfieee128;
|
||||
__vsscanfieee128;
|
||||
|
||||
__fwscanfieee128;
|
||||
__swscanfieee128;
|
||||
__wscanfieee128;
|
||||
|
||||
__vfwscanfieee128;
|
||||
__vswscanfieee128;
|
||||
__vwscanfieee128;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
/* Wrapper for fwscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <libioP.h>
|
||||
|
||||
extern int
|
||||
___ieee128_fwscanf (FILE *fp, const wchar_t *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int done;
|
||||
|
||||
va_start (ap, format);
|
||||
done = __vfwscanf_internal (fp, format, ap,
|
||||
SCANF_LDBL_USES_FLOAT128);
|
||||
va_end (ap);
|
||||
|
||||
return done;
|
||||
}
|
||||
strong_alias (___ieee128_fwscanf, __fwscanfieee128)
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/* Wrapper for swscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <strfile.h>
|
||||
#include <libioP.h>
|
||||
|
||||
extern int
|
||||
___ieee128_swscanf (const wchar_t *string, const wchar_t *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int done;
|
||||
|
||||
_IO_strfile sf;
|
||||
struct _IO_wide_data wd;
|
||||
FILE *fp = _IO_strfile_readw (&sf, &wd, string);
|
||||
|
||||
va_start (ap, format);
|
||||
done = __vfwscanf_internal (fp, format, ap,
|
||||
SCANF_LDBL_USES_FLOAT128);
|
||||
va_end (ap);
|
||||
|
||||
return done;
|
||||
}
|
||||
strong_alias (___ieee128_swscanf, __swscanfieee128)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/* Wrapper for vfwscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <libioP.h>
|
||||
|
||||
extern int
|
||||
___ieee128_vfwscanf (FILE *fp, const wchar_t *format, va_list ap)
|
||||
{
|
||||
return __vfwscanf_internal (fp, format, ap,
|
||||
SCANF_LDBL_USES_FLOAT128);
|
||||
}
|
||||
strong_alias (___ieee128_vfwscanf, __vfwscanfieee128)
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/* Wrapper for vswscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <libioP.h>
|
||||
#include <wchar.h>
|
||||
#include <strfile.h>
|
||||
|
||||
extern int
|
||||
___ieee128_vswscanf (const wchar_t *string, const wchar_t *format,
|
||||
va_list ap)
|
||||
{
|
||||
_IO_strfile sf;
|
||||
struct _IO_wide_data wd;
|
||||
FILE *fp = _IO_strfile_readw (&sf, &wd, string);
|
||||
return __vfwscanf_internal (fp, format, ap, SCANF_LDBL_USES_FLOAT128);
|
||||
}
|
||||
strong_alias (___ieee128_vswscanf, __vswscanfieee128)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/* Wrapper for vwscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <libioP.h>
|
||||
|
||||
extern int
|
||||
___ieee128_vwscanf (const wchar_t *format, va_list ap)
|
||||
{
|
||||
return __vfwscanf_internal (stdin, format, ap,
|
||||
SCANF_LDBL_USES_FLOAT128);
|
||||
}
|
||||
strong_alias (___ieee128_vwscanf, __vwscanfieee128)
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/* Wrapper for wscanf. IEEE128 version.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <libioP.h>
|
||||
|
||||
extern int
|
||||
___ieee128_wscanf (const wchar_t *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int done;
|
||||
|
||||
va_start (ap, format);
|
||||
done = __vfwscanf_internal (stdin, format, ap,
|
||||
SCANF_LDBL_USES_FLOAT128);
|
||||
va_end (ap);
|
||||
|
||||
return done;
|
||||
}
|
||||
strong_alias (___ieee128_wscanf, __wscanfieee128)
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include <test-wscanf-ldbl-compat.c>
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include <test-wscanf-ldbl-compat.c>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#define CHAR wchar_t
|
||||
#define L(x) L##x
|
||||
#define FSCANF fwscanf
|
||||
#define SSCANF swscanf
|
||||
#define SCANF wscanf
|
||||
#define VFSCANF vfwscanf
|
||||
#define VSSCANF vswscanf
|
||||
#define VSCANF vwscanf
|
||||
#define STRCPY wcscpy
|
||||
#include <test-scanf-ldbl-compat-template.c>
|
||||
Loading…
Reference in New Issue