Browse Source

Merge 448bcba1dc into 03b6ef4b0d

pull/3016/merge
Alexander Hoff ❍ 16 hours ago
committed by GitHub
parent
commit
e15a36b3c2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 18
      src/Utils.cpp
  2. 10
      src/Utils.h
  3. 2
      src/helpers/CommonCLI.cpp
  4. 47
      test/test_utils/test_tohex.cpp

18
src/Utils.cpp

@ -150,4 +150,20 @@ int Utils::parseTextParts(char* text, const char* parts[], int max_num, char sep
return num;
}
}
int Utils::parseTextPartsSkippingEmpty(char* text, const char* parts[], int max_num, char separator) {
int num = 0;
char* sp = text;
while (*sp && num < max_num) {
while (*sp == separator) sp++;
if (*sp == '\0') break;
parts[num++] = sp;
while (*sp && *sp != separator) sp++;
if (*sp) {
*sp++ = 0;
}
}
return num;
}
}

10
src/Utils.h

@ -81,6 +81,16 @@ public:
*/
static int parseTextParts(char* text, const char* parts[], int max_num, char separator=',');
/**
* \brief parse 'text' into non-empty parts separated by 'separator' char.
* \param text the text to parse (note is MODIFIED!)
* \param parts destination array to store pointers to starts of parse parts
* \param max_num max elements to store in 'parts' array
* \param separator the separator character; consecutive instances are treated as one
* \returns the number of non-empty parts parsed (in 'parts')
*/
static int parseTextPartsSkippingEmpty(char* text, const char* parts[], int max_num, char separator=',');
static bool isHexChar(char c);
};

2
src/helpers/CommonCLI.cpp

@ -1002,7 +1002,7 @@ void CommonCLI::handleRegionCmd(char* command, char* reply) {
}
const char* parts[4];
int n = mesh::Utils::parseTextParts(command, parts, 4, ' ');
int n = mesh::Utils::parseTextPartsSkippingEmpty(command, parts, 4, ' ');
if (n == 1) {
_region_map->exportTo(reply, 160);
} else if (n >= 2 && strcmp(parts[1], "load") == 0) {

47
test/test_utils/test_tohex.cpp

@ -51,6 +51,53 @@ TEST(UtilsToHex, NullTerminatesOnEmptyInput) {
EXPECT_EQ('\0', output[0]);
}
TEST(UtilsParseTextParts, PreservesEmptyPartsByDefault) {
char input[] = "region default ";
const char* parts[4];
int count = Utils::parseTextParts(input, parts, 4, ' ');
ASSERT_EQ(3, count);
EXPECT_STREQ("region", parts[0]);
EXPECT_STREQ("default", parts[1]);
EXPECT_STREQ("", parts[2]);
}
TEST(UtilsParseTextParts, SkippingEmptyTreatsTrailingSpacesAsNoArgument) {
char input[] = "region default ";
const char* parts[4];
int count = Utils::parseTextPartsSkippingEmpty(input, parts, 4, ' ');
ASSERT_EQ(2, count);
EXPECT_STREQ("region", parts[0]);
EXPECT_STREQ("default", parts[1]);
}
TEST(UtilsParseTextParts, SkippingEmptyKeepsNamedArgumentBetweenRepeatedSpaces) {
char input[] = "region default au-nsw ";
const char* parts[4];
int count = Utils::parseTextPartsSkippingEmpty(input, parts, 4, ' ');
ASSERT_EQ(3, count);
EXPECT_STREQ("region", parts[0]);
EXPECT_STREQ("default", parts[1]);
EXPECT_STREQ("au-nsw", parts[2]);
}
TEST(UtilsParseTextParts, KeepsExplicitNullRegionArgument) {
char input[] = "region default <null> ";
const char* parts[4];
int count = Utils::parseTextPartsSkippingEmpty(input, parts, 4, ' ');
ASSERT_EQ(3, count);
EXPECT_STREQ("region", parts[0]);
EXPECT_STREQ("default", parts[1]);
EXPECT_STREQ("<null>", parts[2]);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();

Loading…
Cancel
Save