json_dumper: add json_dumper_value_double

Add locale-independent version that replaces json_dumper_value_anyf for
floating-point numbers. NaN and -/+Infinity are mapped to null.

Change-Id: I8e7856de480b7bcafe77ddd015239e1257768ced
Reviewed-on: https://code.wireshark.org/review/31948
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot
Reviewed-by: Jakub Zawadzki <jbwzawadzki@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Peter Wu 2019-02-09 19:20:28 +01:00 committed by Anders Broman
parent 0ca65a66f4
commit 7cc5941f95
3 changed files with 25 additions and 1 deletions

View File

@ -102,6 +102,7 @@ libwsutil.so.0 libwsutil0 #MINVER#
json_dumper_finish@Base 2.9.0
json_dumper_set_member_name@Base 2.9.0
json_dumper_value_anyf@Base 2.9.0
json_dumper_value_double@Base 3.0.0
json_dumper_value_string@Base 2.9.0
json_dumper_value_va_list@Base 2.9.1
json_dumper_write_base64@Base 2.9.1

View File

@ -13,6 +13,8 @@
#include "json_dumper.h"
#include <math.h>
/*
* json_dumper.state[current_depth] describes a nested element:
* - type: none/object/array/value
@ -305,6 +307,24 @@ json_dumper_value_string(json_dumper *dumper, const char *value)
dumper->state[dumper->current_depth] = JSON_DUMPER_TYPE_VALUE;
}
void
json_dumper_value_double(json_dumper *dumper, double value)
{
if (!json_dumper_check_state(dumper, JSON_DUMPER_SET_VALUE, JSON_DUMPER_TYPE_VALUE)) {
return;
}
prepare_token(dumper);
gchar buffer[G_ASCII_DTOSTR_BUF_SIZE] = { 0 };
if (isfinite(value) && g_ascii_dtostr(buffer, G_ASCII_DTOSTR_BUF_SIZE, value) && buffer[0]) {
fputs(buffer, dumper->output_file);
} else {
fputs("null", dumper->output_file);
}
dumper->state[dumper->current_depth] = JSON_DUMPER_TYPE_VALUE;
}
void
json_dumper_value_va_list(json_dumper *dumper, const char *format, va_list ap)
{

View File

@ -34,7 +34,7 @@ extern "C" {
* json_dumper_set_member_name(&dumper, "array");
* json_dumper_begin_array(&dumper);
* json_dumper_value_anyf(&dumper, "true");
* json_dumper_value_anyf(&dumper, "1.0");
* json_dumper_value_double(&dumper, 1.0);
* json_dumper_begin_base64(&dumper);
* json_dumper_write_base64(&dumper, (const guchar *)"abcd", 4);
* json_dumper_write_base64(&dumper, (const guchar *)"1234", 4);
@ -80,6 +80,9 @@ json_dumper_end_array(json_dumper *dumper);
WS_DLL_PUBLIC void
json_dumper_value_string(json_dumper *dumper, const char *value);
WS_DLL_PUBLIC void
json_dumper_value_double(json_dumper *dumper, double value);
/**
* Dump number, "true", "false" or "null" values.
*/