From 66932626d5a0298a2dbbd9cd38001dbdf4e0f96c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 27 Nov 2021 15:46:15 +0100 Subject: [PATCH] YaML: escape exclamation marks to avoid issues with compliant parsers and added some support for reading such escaped characters. --- .../conversions/yaml/yaml_datastructs_funcs.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 2 +- radio/src/storage/yaml/yaml_parser.cpp | 13 +++++++++++++ radio/src/storage/yaml/yaml_parser.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 1da071392..14e8a2233 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -437,7 +437,7 @@ bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* o { int32_t sval = yaml_to_signed(val, node->size); if (sval < 0) { - wf(opaque, "!", 1); + wf(opaque, "\\!", 2); sval = abs(sval); } diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 2bd1e8fbe..e971a3f3b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -763,7 +763,7 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, { int32_t sval = yaml_to_signed(val, node->size); if (sval < 0) { - wf(opaque, "!", 1); + wf(opaque, "\\!", 2); sval = abs(sval); } diff --git a/radio/src/storage/yaml/yaml_parser.cpp b/radio/src/storage/yaml/yaml_parser.cpp index 220f9cd4e..861e63c69 100644 --- a/radio/src/storage/yaml/yaml_parser.cpp +++ b/radio/src/storage/yaml/yaml_parser.cpp @@ -213,6 +213,10 @@ YamlParser::parse(const char* buffer, unsigned int size) state = ps_ValQuo; break; } + if (*c == '\\') { + state = ps_ValEsc; + break; + } CONCAT_STR(scratch_buf, scratch_len, *c); break; @@ -284,6 +288,15 @@ YamlParser::parse(const char* buffer, unsigned int size) state = ps_ValQuo; break; } + if (*c == '\\') { + state = ps_ValEsc; + break; + } + CONCAT_STR(scratch_buf, scratch_len, *c); + break; + + case ps_ValEsc: + state = ps_Val; CONCAT_STR(scratch_buf, scratch_len, *c); break; diff --git a/radio/src/storage/yaml/yaml_parser.h b/radio/src/storage/yaml/yaml_parser.h index b3b32d1dc..bc62dbe7d 100644 --- a/radio/src/storage/yaml/yaml_parser.h +++ b/radio/src/storage/yaml/yaml_parser.h @@ -46,6 +46,7 @@ class YamlParser ps_AttrSP, ps_Sep, ps_Val, + ps_ValEsc, ps_ValQuo, ps_ValEsc1, ps_ValEsc2,