Browse Source

Merge 448bcba1dc into 03b6ef4b0d

pull/3016/merge
Alexander Hoff ❍ 17 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; 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=','); 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); 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]; const char* parts[4];
int n = mesh::Utils::parseTextParts(command, parts, 4, ' '); int n = mesh::Utils::parseTextPartsSkippingEmpty(command, parts, 4, ' ');
if (n == 1) { if (n == 1) {
_region_map->exportTo(reply, 160); _region_map->exportTo(reply, 160);
} else if (n >= 2 && strcmp(parts[1], "load") == 0) { } 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]); 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) { int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv); ::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();

Loading…
Cancel
Save