Skip to content

Commit 5c9b05b

Browse files
committed
Make jim_float handle NaN-s and Inf-s
Close #2
1 parent 5bb6f15 commit 5c9b05b

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

example.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,14 @@ int main()
2929

3030
jim_member_key(&jim, "floats", NULL);
3131
jim_array_begin(&jim);
32+
jim_float(&jim, 0.0, 4);
33+
jim_float(&jim, -0.0, 4);
3234
jim_float(&jim, 3.1415, 4);
3335
jim_float(&jim, 2.71828, 5);
3436
jim_float(&jim, 1.6180, 4);
37+
jim_float(&jim, 0.0 / 0.0, 4);
38+
jim_float(&jim, 1.0 / 0.0, 4);
39+
jim_float(&jim, -1.0 / 0.0, 4);
3540
jim_array_end(&jim);
3641

3742
jim_member_key(&jim, "string", NULL);

jim.h

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -229,26 +229,35 @@ void jim_integer(Jim *jim, long long int x)
229229
}
230230
}
231231

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+
232238
void jim_float(Jim *jim, double x, int precision)
233239
{
234-
// TODO(#2): jim_float does not support NaN and Inf-s
235240
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);
237245

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, ".");
244252

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);
250258

251-
jim_element_end(jim);
259+
jim_element_end(jim);
260+
}
252261
}
253262
}
254263

0 commit comments

Comments
 (0)