mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
84 lines
3.0 KiB
C
84 lines
3.0 KiB
C
|
/* Test scanf formats for nan, nan(), nan(n-char-sequence) types.
|
||
|
Copyright The GNU Toolchain Authors.
|
||
|
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
|
||
|
<https://www.gnu.org/licenses/>. */
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include <support/check.h>
|
||
|
|
||
|
#define CHECK_SCANF_RET(OK, STR, FMT, ...) \
|
||
|
do \
|
||
|
{ \
|
||
|
int ret = sscanf (STR, FMT, __VA_ARGS__); \
|
||
|
TEST_VERIFY (ret == (OK)); \
|
||
|
} \
|
||
|
while (0)
|
||
|
|
||
|
/* Valid nan types:
|
||
|
1. nan
|
||
|
2. nan()
|
||
|
3. nan([a-zA-Z0-9_]+)
|
||
|
Any other nan format is invalid and should produce a conversion error.
|
||
|
The return value denotes the number of valid conversions. On conversion
|
||
|
error the rest of the input is discarded. */
|
||
|
static int
|
||
|
do_test (void)
|
||
|
{
|
||
|
int a;
|
||
|
float b;
|
||
|
double c;
|
||
|
long double d;
|
||
|
|
||
|
/* All valid inputs. */
|
||
|
CHECK_SCANF_RET (1, "nan", "%lf", &c);
|
||
|
CHECK_SCANF_RET (1, "nan()", "%lf", &c);
|
||
|
CHECK_SCANF_RET (1, "nan(12345)", "%lf", &c);
|
||
|
CHECK_SCANF_RET (2, "nan12", "%lf%d", &c, &a);
|
||
|
CHECK_SCANF_RET (2, "nan nan()", "%f%Lf", &b, &d);
|
||
|
CHECK_SCANF_RET (2, "nan nan(12345foo)", "%lf%Lf", &c, &d);
|
||
|
CHECK_SCANF_RET (3, "nan nan() 12.234", "%lf%Lf%f", &c, &d, &b);
|
||
|
CHECK_SCANF_RET (4, "nannan()nan(foo)1234", "%lf%f%Lf%d", &c, &b, &d, &a);
|
||
|
|
||
|
/* Partially valid inputs. */
|
||
|
CHECK_SCANF_RET (1, "nan( )", "%3lf", &c);
|
||
|
CHECK_SCANF_RET (1, "nan nan(", "%lf%f", &c, &b);
|
||
|
|
||
|
/* Invalid inputs. */
|
||
|
|
||
|
/* Dangling parentheses. */
|
||
|
CHECK_SCANF_RET (0, "nan(", "%lf", &c);
|
||
|
CHECK_SCANF_RET (0, "nan(123", "%lf", &c);
|
||
|
CHECK_SCANF_RET (0, "nan(12345", "%lf%d", &c, &a);
|
||
|
|
||
|
/* Field width is not sufficient for valid conversion. */
|
||
|
CHECK_SCANF_RET (0, "nan()", "%4Lf", &d);
|
||
|
CHECK_SCANF_RET (0, "nan(1", "%5lf", &c);
|
||
|
|
||
|
/* Space is not a valid character. */
|
||
|
CHECK_SCANF_RET (0, "nan( )", "%lf", &c);
|
||
|
CHECK_SCANF_RET (0, "nan( )12.34", "%Lf%f", &d, &b);
|
||
|
CHECK_SCANF_RET (0, "nan(12 foo)", "%f", &b);
|
||
|
|
||
|
/* Period '.' is not a valid character. */
|
||
|
CHECK_SCANF_RET (0, "nan(12.34) nan(FooBar)", "%lf%Lf", &c, &d);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#include <support/test-driver.c>
|