Skip to content

Commit

Permalink
fix(radio): Fix handling of blank lines in YAML files (EdgeTX#3762)
Browse files Browse the repository at this point in the history
* Fix handling of blank lines in YAML files.

* Added some basic EOL / blank line unit tests

---------

Co-authored-by: raphaelcoeffic <[email protected]>
  • Loading branch information
philmoz and raphaelcoeffic authored Sep 7, 2023
1 parent fec64a9 commit 65ee80f
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 8 deletions.
14 changes: 6 additions & 8 deletions radio/src/storage/yaml/yaml_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,15 +302,13 @@ YamlParser::parse(const char* buffer, unsigned int size)
break;

case ps_CRLF:
if (*c == '\n') {
// Skip blank lines
while (c < end && (*c == '\r' || *c == '\n'))
c += 1;
// reset state at EOL
// Skip blank lines
while (c < end && (*c == '\r' || *c == '\n'))
c += 1;
// reset state at EOL (unless we have run out of buffer, in case EOL continues in next buffer)
if (c < end)
reset();
continue;
}
break;
continue;
}

c++;
Expand Down
70 changes: 70 additions & 0 deletions radio/src/tests/yaml.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/

#include "gtests.h"

#include <storage/yaml/yaml_node.h>
#include <storage/yaml/yaml_parser.h>
#include <storage/yaml/yaml_tree_walker.h>

struct TestStruct {
uint8_t foo;
uint8_t bar;

TestStruct() : foo(0), bar(0) {}
};

static const struct YamlNode struct_TestStruct[] = {
YAML_UNSIGNED( "foo", 8 ),
YAML_UNSIGNED( "bar", 8 ),
YAML_END
};

static const struct YamlNode struct_test[] = {
YAML_STRUCT("testStruct", sizeof(TestStruct) * 8, struct_TestStruct, NULL),
YAML_END
};

static const struct YamlNode _root_node = YAML_ROOT( struct_test );

TEST(Yaml, SkipBlankLines)
{
TestStruct t;

YamlTreeWalker tree;
tree.reset(&_root_node, (uint8_t*)&t);

const char chunk_1[] = "testStruct:\n foo: 12\n";
const char chunk_2[] = "\n bar: 34\n\n fo";
const char chunk_3[] = "o: 45";

YamlParser yp;
yp.init(YamlTreeWalker::get_parser_calls(), &tree);
EXPECT_EQ(YamlParser::CONTINUE_PARSING, yp.parse(chunk_1, sizeof(chunk_1) - 1));
EXPECT_EQ(12, t.foo);

EXPECT_EQ(YamlParser::CONTINUE_PARSING, yp.parse(chunk_2, sizeof(chunk_2) - 1));
EXPECT_EQ(34, t.bar);

yp.set_eof();
EXPECT_EQ(YamlParser::CONTINUE_PARSING, yp.parse(chunk_3, sizeof(chunk_3) - 1));
EXPECT_EQ(45, t.foo);
}

0 comments on commit 65ee80f

Please sign in to comment.