summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2025-04-22 13:34:41 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2025-04-22 13:34:41 +0200
commit81fe18e7a966b96a238e971d0179744fb2ae63fe (patch)
treefcecb726110b39168423a205bda749bacc5492b1 /modules
parentebc6a1b1f5dbb9fae12e9970240be7df67b3d353 (diff)
Leading zero is annoying. I need a proper floating point decoder
Diffstat (limited to 'modules')
-rw-r--r--modules/codec-json/c++/json.tmpl.hpp44
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() == '}'){