aboutsummaryrefslogtreecommitdiff
blob: 1a298c87f700b4d0a79a2119abb0a0f0b0b889b0 (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
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