16
16
*
17
17
**********************************************************************/
18
18
19
+ #include < climits> // for INT_MIN, INT_MAX
20
+ #include < cmath> // for NAN, std::isnan
19
21
#include < cstdio>
20
22
#include < cstring>
21
23
#include < cstdlib>
24
+ #include < locale> // for std::locale::classic
25
+ #include < sstream> // for std::stringstream
22
26
23
27
#include " genericvector.h"
24
28
#include " tprintf.h"
@@ -96,11 +100,17 @@ bool ParamUtils::SetParam(const char *name, const char* value,
96
100
if (*value == ' \0 ' ) return (sp != nullptr );
97
101
98
102
// Look for the parameter among int parameters.
99
- int intval;
100
103
auto *ip = FindParam<IntParam>(name, GlobalParams ()->int_params ,
101
104
member_params->int_params );
102
- if (ip && ip->constraint_ok (constraint) && sscanf (value, " %d" , &intval) == 1 )
103
- ip->set_value (intval);
105
+ if (ip && ip->constraint_ok (constraint)) {
106
+ int intval = INT_MIN;
107
+ std::stringstream stream (value);
108
+ stream.imbue (std::locale::classic ());
109
+ stream >> intval;
110
+ if (intval != INT_MIN) {
111
+ ip->set_value (intval);
112
+ }
113
+ }
104
114
105
115
// Look for the parameter among bool parameters.
106
116
auto *bp = FindParam<BoolParam>(name, GlobalParams ()->bool_params ,
@@ -116,16 +126,16 @@ bool ParamUtils::SetParam(const char *name, const char* value,
116
126
}
117
127
118
128
// Look for the parameter among double parameters.
119
- double doubleval;
120
129
auto *dp = FindParam<DoubleParam>(name, GlobalParams ()->double_params ,
121
130
member_params->double_params );
122
131
if (dp != nullptr && dp->constraint_ok (constraint)) {
123
- # ifdef EMBEDDED
124
- doubleval = strtofloat (value);
125
- # else
126
- if ( sscanf (value, " %lf " , & doubleval) == 1 )
127
- # endif
132
+ double doubleval = NAN;
133
+ std::stringstream stream (value);
134
+ stream. imbue ( std::locale::classic ());
135
+ stream >> doubleval;
136
+ if (! std::isnan (doubleval)) {
128
137
dp->set_value (doubleval);
138
+ }
129
139
}
130
140
return (sp || ip || bp || dp);
131
141
}
0 commit comments