1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include <stdio.h>
#include <stdlib.h>
#include "tst-strtod.h"
#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
struct test_strto ## FSUF \
{ \
const char *str; \
FTYPE result; \
size_t offset; \
} tests_strto ## FSUF[] = \
{ \
{ "0xy", 0.0 ## LSUF, 1 }, \
{ "0x.y", 0.0 ## LSUF, 1 }, \
{ "0x0.y", 0.0 ## LSUF, 4 }, \
{ "0x.0y", 0.0 ## LSUF, 4 }, \
{ ".y", 0.0 ## LSUF, 0 }, \
{ "0.y", 0.0 ## LSUF, 2 }, \
{ ".0y", 0.0 ## LSUF, 2 } \
}; \
\
static int \
test_strto ## FSUF (void) \
{ \
int status = 0; \
for (size_t i = 0; \
i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \
++i) \
{ \
char *ep; \
FTYPE r = strto ## FSUF (tests_strto ## FSUF[i].str, &ep); \
if (r != tests_strto ## FSUF[i].result) \
{ \
char buf1[FSTRLENMAX], buf2[FSTRLENMAX]; \
FTOSTR (buf1, sizeof (buf1), "%g", r); \
FTOSTR (buf2, sizeof (buf2), "%g", tests_strto ## FSUF[i].result); \
printf ("test %zu r = %s, expect %s\n", i, buf1, buf2); \
status = 1; \
} \
if (ep != tests_strto ## FSUF[i].str + tests_strto ## FSUF[i].offset) \
{ \
printf ("test %zu strto" #FSUF \
" parsed %tu characters, expected %zu\n", \
i, ep - tests_strto ## FSUF[i].str, \
tests_strto ## FSUF[i].offset); \
status = 1; \
} \
} \
return status; \
}
GEN_TEST_STRTOD_FOREACH (TEST_STRTOD)
static int
do_test (void)
{
return STRTOD_TEST_FOREACH (test_strto);
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
|