From aeebe42bfb39c08a5db361cbef6f9db143d7b234 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Fri, 10 May 2019 18:49:09 +0200 Subject: [PATCH] Fix issues for EOF & parsing arrays --- m-serial-json.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/m-serial-json.h b/m-serial-json.h index 6b789794..1e0f8cfe 100644 --- a/m-serial-json.h +++ b/m-serial-json.h @@ -259,9 +259,12 @@ m_serial_json_read_array_start(m_serial_read_t serial, size_t *num) { FILE *f = (FILE*) serial->data[0]; int final = -1; - fscanf(f, " {%n", &final); - *num = -1U; - return final > 0 ? M_SERIAL_OK_CONTINUE : M_SERIAL_FAIL; + fscanf(f, " [%n", &final); + *num = 0; // don't know the size of the array. + if (final < 0) return M_SERIAL_FAIL; + final = -1; + fscanf(f, " ]%n", &final); + return final > 0 ? M_SERIAL_OK_DONE : M_SERIAL_OK_CONTINUE; } static inline m_serial_return_code_t @@ -279,8 +282,11 @@ m_serial_json_read_map_start(m_serial_read_t serial, size_t *num) FILE *f = (FILE*) serial->data[0]; int final = -1; fscanf(f, " {%n", &final); - *num = -1U; - return final > 0 ? M_SERIAL_OK_CONTINUE : M_SERIAL_FAIL; + *num = 0; // don't know the size of the map. + if (final < 0) return M_SERIAL_FAIL; + final = -1; + fscanf(f, " }%n", &final); + return final > 0 ? M_SERIAL_OK_DONE : M_SERIAL_OK_CONTINUE; } static inline m_serial_return_code_t @@ -314,6 +320,7 @@ static inline m_serial_return_code_t m_serial_json_read_tuple_id(m_serial_read_t serial, const char *const field_name [], const int max, int *id){ FILE *f = (FILE*) serial->data[0]; int c = m_serial_json_read_skip(f); + if (c == EOF) return M_SERIAL_FAIL; if (c == '}') return M_SERIAL_OK_DONE; if (c == ',') { // If first call of read_tuple_id, it is a failure @@ -343,6 +350,7 @@ m_serial_json_read_variant_start(m_serial_read_t serial, const char *const field { FILE *f = (FILE*) serial->data[0]; int c = m_serial_json_read_skip(f); + if (c == EOF) return M_SERIAL_FAIL; if (c == '}') return M_SERIAL_OK_DONE; // c should be \" but let fscanf parse it. ungetc(c, f);