about summary refs log tree commit diff
path: root/stdlib/tst-strtod2.c
blob: 2cb0953fa911efd0a3c0a1a430eee9e68684da08 (plain) (blame)
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"