diff options
-rw-r--r-- | modules/codec-json/c++/json.tmpl.hpp | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/modules/codec-json/c++/json.tmpl.hpp b/modules/codec-json/c++/json.tmpl.hpp index 51ee3c3..039f066 100644 --- a/modules/codec-json/c++/json.tmpl.hpp +++ b/modules/codec-json/c++/json.tmpl.hpp @@ -505,14 +505,32 @@ struct json_decode<schema::Primitive<T,N>, ToDecode> { if (offset >= buff.read_composite_length()) { return make_error<err::buffer_exhausted>(); } - if (buff.read(offset) >= '1' && buff.read(offset) <= '9') { + /** + * In case of integers it's at least 1. Hacky float + */ + if (buff.read(offset) >= '0' && buff.read(offset) <= '9') { + bool leading_zero = (buff.read(offset) == '0'); ++offset; + bool do_loop = true; if(offset >= buff.read_composite_length()) { - return make_error<err::buffer_exhausted>(); + if(!leading_zero){ + return make_error<err::buffer_exhausted>(); + }else{ + do_loop = false; + } + } + + /** + * Hacky setup for float check + */ + if(do_loop && leading_zero){ + if(buff.read(offset) != '.'){ + return make_error<err::invalid_state>("Leading zero, but no '.' afterwards"); + } } - while(1){ + while(do_loop){ if (buff.read(offset) >= '0' && buff.read(offset) <= '9') { ++offset; @@ -533,9 +551,13 @@ struct json_decode<schema::Primitive<T,N>, ToDecode> { } break; } - } else if (buff.read(offset) == '0' ) { + } + /* Case + else if (buff.read(offset) == '0' ) { ++offset; - } else { + } + */ + else { return make_error<err::buffer_exhausted>(); } @@ -700,6 +722,9 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, ToDecode> { static error_or<void> decode_fields(buffer_view& buff, data<Schema, ToDecode>& to, std::array<bool, sizeof...(T)>& fields){ for(;;){ + /** + * Decode the member name/key + */ data<schema::String, ToDecode> name; auto eov = json_decode<schema::String, ToDecode>::decode(buff, name); if(eov.is_error()){ @@ -709,6 +734,9 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error<err::buffer_exhausted>(); } + /** + * Check the separator + */ if(buff.read() != ':'){ return make_error<err::invalid_state>("Field separator in Struct expected"); } @@ -717,6 +745,9 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error<err::buffer_exhausted>(); } + /** + * Decode the field value + */ { auto eov = decode_field_search<0>(buff, to, fields, name); if(eov.is_error()){ @@ -727,6 +758,9 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error<err::buffer_exhausted>(); } + /** + * Advance to the next member or end of the struct + */ if(buff.read() == ','){ buff.read_advance(1); }else if(buff.read() == '}'){ |