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
108
109
110
|
From 4ed44ab58e27a9a09902b9c5b49df484842b6c9a Mon Sep 17 00:00:00 2001
From: Dr. Werner Fink <werner@suse.de>
Date: Wed, 13 Jul 2016 20:08:51 +1000
Subject: [PATCH] misc: fix strtod_nol_err tests
A better way of implementing the string to double
conversion and a better way of testing it.
Signed-off-by: Craig Small <csmall@enc.com.au>
---
diff --git a/include/strutils.h b/include/strutils.h
index 85a6192..a5a15c9 100644
--- a/include/strutils.h
+++ b/include/strutils.h
@@ -7,6 +7,6 @@
extern long strtol_or_err(const char *str, const char *errmesg);
extern double strtod_or_err(const char *str, const char *errmesg);
-double strtod_nol_or_err(char *str, const char *errmesg);
+extern double strtod_nol_or_err(char *str, const char *errmesg);
#endif
diff --git a/lib/strutils.c b/lib/strutils.c
index e5245db..e0632c4 100644
--- a/lib/strutils.c
+++ b/lib/strutils.c
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <float.h>
+#include <math.h>
#include <stdlib.h>
#include <ctype.h>
@@ -71,9 +73,9 @@ double strtod_or_err(const char *str, const char *errmesg)
*/
double strtod_nol_or_err(char *str, const char *errmesg)
{
- double num;
+ long double num;
const char *cp, *radix;
- double mult;
+ long double mult;
int negative = 0;
if (str != NULL && *str != '\0') {
@@ -95,29 +97,29 @@ double strtod_nol_or_err(char *str, const char *errmesg)
mult=0.1;
while(isdigit(*radix)) {
radix++;
- mult *= 10;
+ mult *= 10.0;
}
while(isdigit(*cp)) {
- num += (*cp - '0') * mult;
- mult /= 10;
+ num += (long double)(*cp - '0') * mult;
+ mult /= 10.0;
cp++;
}
/* got the integers */
if (*cp == '\0')
- return (negative?-num:num);
+ return (double)(negative?-num:num);
if (*cp != '.' && *cp != ',')
error(EXIT_FAILURE, EINVAL, "%s: '%s'", errmesg, str);
cp++;
mult = 0.1;
while(isdigit(*cp)) {
- num += (*cp - '0') * mult;
- mult /= 10;
+ num += (long double)(*cp - '0') * mult;
+ mult /= 10.0;
cp++;
}
if (*cp == '\0')
- return (negative?-num:num);
+ return (double)(negative?-num:num);
}
error(EXIT_FAILURE, errno, "%s: '%s'", errmesg, str);
- return 0;
+ return (double)0;
}
diff --git a/lib/test_strtod_nol.c b/lib/test_strtod_nol.c
index 0be798c..736768a 100644
--- a/lib/test_strtod_nol.c
+++ b/lib/test_strtod_nol.c
@@ -1,4 +1,5 @@
-
+#include <float.h>
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "strutils.h"
@@ -33,8 +34,8 @@ int main(int argc, char *argv[])
double val;
for(i=0; tests[i].string != NULL; i++) {
- if(strtod_nol_or_err(tests[i].string, "Cannot parse number") !=
- tests[i].result) {
+ val = strtod_nol_or_err(tests[i].string, "Cannot parse number");
+ if(fabs(tests[i].result - val) > DBL_EPSILON) {
fprintf(stderr, "FAIL: strtod_nol_or_err(\"%s\") != %f\n",
tests[i].string, tests[i].result);
return EXIT_FAILURE;
--
libgit2 0.24.0
|