From 81fe18e7a966b96a238e971d0179744fb2ae63fe Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 22 Apr 2025 13:34:41 +0200 Subject: Leading zero is annoying. I need a proper floating point decoder --- modules/codec-json/c++/json.tmpl.hpp | 44 ++++++++++++++++++++++++++++++++---- 1 file 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, ToDecode> { if (offset >= buff.read_composite_length()) { return make_error(); } - 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(); + if(!leading_zero){ + return make_error(); + }else{ + do_loop = false; + } + } + + /** + * Hacky setup for float check + */ + if(do_loop && leading_zero){ + if(buff.read(offset) != '.'){ + return make_error("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, ToDecode> { } break; } - } else if (buff.read(offset) == '0' ) { + } + /* Case + else if (buff.read(offset) == '0' ) { ++offset; - } else { + } + */ + else { return make_error(); } @@ -700,6 +722,9 @@ struct json_decode...>, ToDecode> { static error_or decode_fields(buffer_view& buff, data& to, std::array& fields){ for(;;){ + /** + * Decode the member name/key + */ data name; auto eov = json_decode::decode(buff, name); if(eov.is_error()){ @@ -709,6 +734,9 @@ struct json_decode...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error(); } + /** + * Check the separator + */ if(buff.read() != ':'){ return make_error("Field separator in Struct expected"); } @@ -717,6 +745,9 @@ struct json_decode...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error(); } + /** + * 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...>, ToDecode> { if(buff.read_composite_length() == 0){ return make_error(); } + /** + * Advance to the next member or end of the struct + */ if(buff.read() == ','){ buff.read_advance(1); }else if(buff.read() == '}'){ -- cgit v1.2.3