diff options
-rw-r--r-- | example/ndpiReader.c | 15 | ||||
-rw-r--r-- | src/include/ndpi_api.h | 5 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 1 | ||||
-rw-r--r-- | src/lib/ndpi_utils.c | 84 |
4 files changed, 104 insertions, 1 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c index e5ccc5648..326f4d419 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -3212,6 +3212,7 @@ void serializerUnitTest() { assert(ndpi_serialize_uint32_string(&serializer, i, "Hello") != -1); assert(ndpi_serialize_string_string(&serializer, kbuf, vbuf) != -1); assert(ndpi_serialize_string_uint32(&serializer, kbuf, i*i) != -1); + assert(ndpi_serialize_string_float(&serializer, kbuf, (float)(i*i), "%f") != -1); } if(trace) @@ -3227,7 +3228,8 @@ void serializerUnitTest() { else { u_int32_t k32, v32; ndpi_string ks, vs; - + float vf; + switch(et) { case ndpi_serialization_uint32_uint32: assert(ndpi_deserialize_uint32_uint32(&deserializer, &k32, &v32) != -1); @@ -3267,6 +3269,17 @@ void serializerUnitTest() { } break; + case ndpi_serialization_string_float: + assert(ndpi_deserialize_string_float(&deserializer, &ks, &vf) != -1); + if(trace) { + u_int8_t bkpk = ks.str[ks.str_len]; + + ks.str[ks.str_len] = '\0'; + printf("%s=%f\n", ks.str, vf); + ks.str[ks.str_len] = bkpk; + } + break; + default: printf("serializerUnitTest: unsupported type %u detected!\n", et); return; diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index 20dd048ad..8c899128e 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -837,6 +837,9 @@ extern "C" { const char *key, u_int64_t value); int ndpi_serialize_string_string(ndpi_serializer *serializer, const char *key, const char *value); + int ndpi_serialize_string_float(ndpi_serializer *serializer, + const char *key, float value, + const char *format /* e.f. "%.2f" */); int ndpi_serialize_end_of_record(ndpi_serializer *serializer); /* Deserializer */ @@ -864,6 +867,8 @@ extern "C" { ndpi_string *key, u_int64_t *value); int ndpi_deserialize_string_string(ndpi_deserializer *deserializer, ndpi_string *key, ndpi_string *value); + int ndpi_deserialize_string_float(ndpi_deserializer *deserializer, + ndpi_string *key, float *value); int ndpi_deserialize_end_of_record(ndpi_deserializer *deserializer); #ifdef __cplusplus diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index c124cf5fc..a77f70ce0 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1318,6 +1318,7 @@ typedef enum { ndpi_serialization_string_int64, ndpi_serialization_string_uint32, ndpi_serialization_string_uint64, + ndpi_serialization_string_float, ndpi_serialization_string_string, } ndpi_serialization_element_type; diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c index 8959aa05e..1e4f84702 100644 --- a/src/lib/ndpi_utils.c +++ b/src/lib/ndpi_utils.c @@ -893,6 +893,15 @@ static void ndpi_serialize_single_uint64(ndpi_serializer *serializer, /* ********************************** */ +/* TODO: fix portability across platforms */ +static void ndpi_serialize_single_float(ndpi_serializer *serializer, float s) { + + memcpy(&serializer->buffer[serializer->size_used], &s, sizeof(s)); + serializer->size_used += sizeof(float); +} + +/* ********************************** */ + static void ndpi_serialize_single_string(ndpi_serializer *serializer, const char *s, u_int16_t slen) { u_int16_t l = htons(slen); @@ -940,6 +949,15 @@ static void ndpi_deserialize_single_int64(ndpi_serializer *deserializer, /* ********************************** */ +/* TODO: fix portability across platforms */ +static void ndpi_deserialize_single_float(ndpi_serializer *deserializer, + float *s) { + *s = *(float*)&deserializer->buffer[deserializer->size_used]; + deserializer->size_used += sizeof(float); +} + +/* ********************************** */ + static void ndpi_deserialize_single_string(ndpi_serializer *deserializer, ndpi_string *v) { v->str_len = ntohs(*((u_int16_t *) &deserializer->buffer[deserializer->size_used])); @@ -1272,6 +1290,50 @@ int ndpi_serialize_string_uint64(ndpi_serializer *serializer, /* ********************************** */ +int ndpi_serialize_string_float(ndpi_serializer *serializer, + const char *key, float value, + const char *format /* e.f. "%.2f" */) { + u_int16_t klen = strlen(key); + u_int32_t buff_diff = serializer->buffer_size - serializer->size_used; + u_int32_t needed = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + klen /* key */ + + sizeof(float); + + if(serializer->fmt == ndpi_serialization_format_json) + needed += 32 + klen; + + if(buff_diff < needed) { + if (ndpi_extend_serializer_buffer(serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->size_used; + } + + if(serializer->fmt == ndpi_serialization_format_json) { + ndpi_serialize_json_pre(serializer); + serializer->size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer[serializer->size_used], buff_diff); + buff_diff = serializer->buffer_size - serializer->size_used; + + serializer->buffer[serializer->size_used] = ':'; + serializer->size_used++; + + serializer->size_used += snprintf((char *) &serializer->buffer[serializer->size_used], buff_diff, format, value); + + ndpi_serialize_json_post(serializer); + } else { + serializer->buffer[serializer->size_used++] = ndpi_serialization_string_float; + + ndpi_serialize_single_string(serializer, key, klen); + ndpi_serialize_single_float(serializer, value); + } + + return(0); +} + +/* ********************************** */ + int ndpi_serialize_string_string(ndpi_serializer *serializer, const char *key, const char *value) { u_int16_t klen = strlen(key), vlen = strlen(value); @@ -1529,6 +1591,28 @@ int ndpi_deserialize_string_uint64(ndpi_deserializer *deserializer, /* ********************************** */ +int ndpi_deserialize_string_float(ndpi_deserializer *deserializer, + ndpi_string *key, float *value) { + if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_float) { + u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used; + u_int32_t expected = + sizeof(u_int8_t) /* type */ + + sizeof(u_int16_t) /* key len */ + + sizeof(float); + + if(buff_diff < expected) return(-2); + + deserializer->size_used++; /* Skip element type */ + ndpi_deserialize_single_string(deserializer, key); + ndpi_deserialize_single_float(deserializer, value); + + return(0); + } else + return(-1); +} + +/* ********************************** */ + int ndpi_deserialize_string_string(ndpi_deserializer *deserializer, ndpi_string *key, ndpi_string *value) { if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_string_string) { |