aboutsummaryrefslogtreecommitdiff
path: root/stdlib/tst-strtod4.c
blob: dfd3f05027c0d3c10f256d0f9b0477752329971f (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "tst-strtod.h"

/* This tests internal interfaces, which are only defined for types
   with distinct ABIs, so disable testing for types without distinct
   ABIs.  */
#undef IF_FLOAT32
#define IF_FLOAT32(x)
#undef IF_FLOAT64
#define IF_FLOAT64(x)
#undef IF_FLOAT32X
#define IF_FLOAT32X(x)
#undef IF_FLOAT64X
#define IF_FLOAT64X(x)
#if !__HAVE_DISTINCT_FLOAT128
# undef IF_FLOAT128
# define IF_FLOAT128(x)
#endif

#define NNBSP "\xe2\x80\xaf"

#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF)			\
static const struct							\
{									\
  const char *in;							\
  const char *out;							\
  FTYPE expected;							\
} tests_strto ## FSUF[] =						\
  {									\
    { "000"NNBSP"000"NNBSP"000", "", 0.0 ## LSUF },			\
    { "1"NNBSP"000"NNBSP"000,5x", "x", 1000000.5 ## LSUF },		\
    /* Bug 30964 */							\
    { "10"NNBSP NNBSP"200", NNBSP NNBSP"200", 10.0 ## LSUF }		\
  };									\
									\
static int								\
test_strto ## FSUF (void)						\
{									\
  int status = 0;							\
									\
  for (int i = 0;							\
       i < sizeof (tests_strto ## FSUF) / sizeof (tests_strto ## FSUF[0]); \
       ++i)								\
    {									\
      char *ep;								\
      FTYPE r = __strto ## FSUF ## _internal (tests_strto ## FSUF[i].in, \
					      &ep, 1);			\
									\
      if (strcmp (ep, tests_strto ## FSUF[i].out) != 0)			\
	{								\
	  printf ("%d: got rest string \"%s\", expected \"%s\"\n",	\
		  i, ep, tests_strto ## FSUF[i].out);			\
	  status = 1;							\
	}								\
									\
      if (r != tests_strto ## FSUF[i].expected)				\
	{								\
	  char buf1[FSTRLENMAX], buf2[FSTRLENMAX];			\
	  FTOSTR (buf1, sizeof (buf1), "%g", r);			\
	  FTOSTR (buf2, sizeof (buf2), "%g",				\
		  tests_strto ## FSUF[i].expected);			\
	  printf ("%d: got wrong results %s, expected %s\n",		\
		  i, buf1, buf2);					\
	  status = 1;							\
	}								\
    }									\
									\
  return status;							\
}

GEN_TEST_STRTOD_FOREACH (TEST_STRTOD)

static int
do_test (void)
{
  if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL)
    {
      puts ("could not set locale");
      return 1;
    }

  return STRTOD_TEST_FOREACH (test_strto);
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"