diff options
-rw-r--r-- | json.c | 15 | ||||
-rw-r--r-- | json.h | 1 | ||||
-rw-r--r-- | libgps_json.c | 3 |
3 files changed, 15 insertions, 4 deletions
@@ -70,6 +70,8 @@ PERMISSIONS #ifdef SOCKET_EXPORT_ENABLE #include "json.h" +#include "gps.h" /* only for timestamp_t prototype */ + #ifdef CLIENTDEBUG_ENABLE static int debuglevel = 0; static FILE *debugfp; @@ -119,6 +121,7 @@ static /*@null@*/ char *json_target_address(const struct json_attr_t *cursor, case t_uinteger: targetaddr = (char *)&cursor->addr.uinteger[offset]; break; + case t_timestamp: case t_real: targetaddr = (char *)&cursor->addr.real[offset]; break; @@ -196,6 +199,7 @@ static int json_internal_read_object(const char *cp, case t_uinteger: *((unsigned int *)lptr) = cursor->dflt.uinteger; break; + case t_timestamp: case t_real: *((double *)lptr) = cursor->dflt.real; break; @@ -382,7 +386,7 @@ static int json_internal_read_object(const char *cp, */ for (;;) { int seeking = cursor->type; - if (value_quoted && cursor->type == t_string) + if (value_quoted && (cursor->type == t_string || cursor->type == t_timestamp)) break; if ((strcmp(valbuf, "true")==0 || strcmp(valbuf, "false")==0) && seeking == t_boolean) @@ -402,14 +406,15 @@ static int json_internal_read_object(const char *cp, } if (value_quoted && (cursor->type != t_string && cursor->type != t_character - && cursor->type != t_check && cursor->map == 0)) { + && cursor->type != t_check && cursor->type != t_timestamp + && cursor->map == 0)) { json_debug_trace((1, "Saw quoted value when expecting non-string.\n")); return JSON_ERR_QNONSTRING; } if (!value_quoted && (cursor->type == t_string || cursor->type == t_check - || cursor->map != 0)) { + || cursor->type == t_timestamp || cursor->map != 0)) { json_debug_trace((1, "Didn't see quoted value when expecting string.\n")); return JSON_ERR_NONQSTRING; @@ -434,6 +439,9 @@ static int json_internal_read_object(const char *cp, case t_uinteger: *((unsigned int *)lptr) = (unsigned)atoi(valbuf); break; + case t_timestamp: + *((double *)lptr) = iso8601_to_unix(valbuf); + break; case t_real: *((double *)lptr) = atof(valbuf); break; @@ -554,6 +562,7 @@ int json_read_array(const char *cp, const struct json_array_t *arr, break; case t_integer: case t_uinteger: + case t_timestamp: case t_real: case t_boolean: case t_character: @@ -9,6 +9,7 @@ typedef enum {t_integer, t_uinteger, t_real, t_string, t_boolean, t_character, + t_timestamp, t_object, t_structobject, t_array, t_check} json_type; diff --git a/libgps_json.c b/libgps_json.c index c8976952..c6202b85 100644 --- a/libgps_json.c +++ b/libgps_json.c @@ -299,8 +299,9 @@ static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata, {"class", t_check, .dflt.check = "DEVICE"}, {"path", t_string, STRUCTOBJECT(struct devconfig_t, path), .len = sizeof(gpsdata->devices.list[0].path)}, + {"activated", t_timestamp, STRUCTOBJECT(struct devconfig_t, activated)}, {"activated", t_real, STRUCTOBJECT(struct devconfig_t, activated)}, - {"flags", t_integer, STRUCTOBJECT(struct devconfig_t, flags)}, + {"flags", t_integer, STRUCTOBJECT(struct devconfig_t, flags)}, {"driver", t_string, STRUCTOBJECT(struct devconfig_t, driver), .len = sizeof(gpsdata->devices.list[0].driver)}, {"subtype", t_string, STRUCTOBJECT(struct devconfig_t, subtype), |