@@ -229,26 +229,35 @@ void jim_integer(Jim *jim, long long int x)
229
229
}
230
230
}
231
231
232
+ static int is_nan_or_inf (double x )
233
+ {
234
+ unsigned long long int mask = (1ULL << 11ULL ) - 1ULL ;
235
+ return (((* (unsigned long long int * ) & x ) >> 52ULL ) & mask ) == mask ;
236
+ }
237
+
232
238
void jim_float (Jim * jim , double x , int precision )
233
239
{
234
- // TODO(#2): jim_float does not support NaN and Inf-s
235
240
if (jim -> error == JIM_OK ) {
236
- jim_element_begin (jim );
241
+ if (is_nan_or_inf (x )) {
242
+ jim_null (jim );
243
+ } else {
244
+ jim_element_begin (jim );
237
245
238
- jim_integer_no_element (jim , (long long int ) x );
239
- x -= (double ) (long long int ) x ;
240
- while (precision -- > 0 ) {
241
- x *= 10.0 ;
242
- }
243
- jim_write_cstr (jim , "." );
246
+ jim_integer_no_element (jim , (long long int ) x );
247
+ x -= (double ) (long long int ) x ;
248
+ while (precision -- > 0 ) {
249
+ x *= 10.0 ;
250
+ }
251
+ jim_write_cstr (jim , "." );
244
252
245
- long long int y = (long long int ) x ;
246
- if (y < 0 ) {
247
- y = - y ;
248
- }
249
- jim_integer_no_element (jim , y );
253
+ long long int y = (long long int ) x ;
254
+ if (y < 0 ) {
255
+ y = - y ;
256
+ }
257
+ jim_integer_no_element (jim , y );
250
258
251
- jim_element_end (jim );
259
+ jim_element_end (jim );
260
+ }
252
261
}
253
262
}
254
263
0 commit comments