diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index b3c3f87e0..f4c609114 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -381,6 +381,7 @@ bool ModelsList::loadYaml() if (bytes_read == 0) break; + if (f_eof(&file)) yp.set_eof(); if (yp.parse(line, bytes_read) != YamlParser::CONTINUE_PARSING) break; } diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 55e6f22cf..bbc28cddc 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -58,6 +58,7 @@ const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, vo if (bytes_read == 0) break; + if (f_eof(&file)) yp.set_eof(); if (yp.parse(buffer, bytes_read) != YamlParser::CONTINUE_PARSING) break; } diff --git a/radio/src/storage/yaml/yaml_parser.cpp b/radio/src/storage/yaml/yaml_parser.cpp index 743760ce8..682151353 100644 --- a/radio/src/storage/yaml/yaml_parser.cpp +++ b/radio/src/storage/yaml/yaml_parser.cpp @@ -40,6 +40,7 @@ void YamlParser::init(const YamlParserCalls* parser_calls, void* parser_ctx) calls = parser_calls; ctx = parser_ctx; reset(); + eof = false; } void YamlParser::reset() @@ -311,6 +312,11 @@ YamlParser::parse(const char* buffer, unsigned int size) c++; } // for each char + if ((state == ps_Val) && eof && node_found) { + // TODO: trim spaces at the end? + calls->set_attr(ctx, scratch_buf, scratch_len); + } + return CONTINUE_PARSING; } diff --git a/radio/src/storage/yaml/yaml_parser.h b/radio/src/storage/yaml/yaml_parser.h index bc62dbe7d..15b4b4907 100644 --- a/radio/src/storage/yaml/yaml_parser.h +++ b/radio/src/storage/yaml/yaml_parser.h @@ -73,6 +73,7 @@ class YamlParser uint8_t scratch_len; bool node_found; + bool eof; // tree iterator state const YamlParserCalls* calls; @@ -98,6 +99,8 @@ public: void init(const YamlParserCalls* parser_calls, void* parser_ctx); YamlResult parse(const char* buffer, unsigned int size); + + void set_eof() { eof = true; } }; #endif