about summary refs log tree commit diff
path: root/stdlib/tst-strtod5.c
blob: 7eb9b3a2d7f31b2a34d854763d31f942cb3b84f4 (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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/* Tests of strtod in a locale using decimal comma.
   Copyright (C) 2007-2024 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
   <https://www.gnu.org/licenses/>.  */

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "tst-strtod.h"

#define NBSP "\xc2\xa0"

#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF)			\
static const struct							\
{									\
  const char *in;							\
  FTYPE expected;							\
} tests_strto ## FSUF[] =						\
  {									\
    { "0", 0.0 ## LSUF },						\
    { "000", 0.0 ## LSUF },						\
    { "-0", -0.0 ## LSUF },						\
    { "-000", -0.0 ## LSUF },						\
    { "0,", 0.0 ## LSUF },						\
    { "-0,", -0.0 ## LSUF },						\
    { "0,0", 0.0 ## LSUF },						\
    { "-0,0", -0.0 ## LSUF },						\
    { "0e-10", 0.0 ## LSUF },						\
    { "-0e-10", -0.0 ## LSUF },						\
    { "0,e-10", 0.0 ## LSUF },						\
    { "-0,e-10", -0.0 ## LSUF },					\
    { "0,0e-10", 0.0 ## LSUF },						\
    { "-0,0e-10", -0.0 ## LSUF },					\
    { "0e-1000000", 0.0 ## LSUF },					\
    { "-0e-1000000", -0.0 ## LSUF },					\
    { "0,0e-1000000", 0.0 ## LSUF },					\
    { "-0,0e-1000000", -0.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 (tests_strto ## FSUF[i].in, &ep);		\
									\
      if (*ep != '\0')							\
	{								\
	  printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); \
	  status = 1;							\
	}								\
									\
      if (r != tests_strto ## FSUF[i].expected				\
	  || (copysign ## CSUF (10.0 ## LSUF, r)			\
	      != copysign ## CSUF (10.0 ## LSUF,			\
				   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);
}

#include <support/test-driver.c>