Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/simpleini.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <brofield@users.noreply.github.com>2020-06-16 20:35:12 +0300
committerunknown <brofield@users.noreply.github.com>2020-06-16 20:35:12 +0300
commit0607b9f7f7d92df418a9aec1d080193027e88726 (patch)
tree6c687afffb009b817339e26bd8f7d04a559fc678
parent592b165f35d8608b957ff05c4d8caacdbb501e95 (diff)
Fix for issue 4 "value returned by GetValue for multiline includes ENDTAG" caused by end tags having whitespace after them
-rw-r--r--SimpleIni.h20
-rw-r--r--tests/ts-bugfix.cpp111
2 files changed, 125 insertions, 6 deletions
diff --git a/SimpleIni.h b/SimpleIni.h
index 843a73f..d6336db 100644
--- a/SimpleIni.h
+++ b/SimpleIni.h
@@ -1749,8 +1749,8 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadMultiLineText(
a_pVal = a_pData;
// find the end tag. This tag must start in column 1 and be
- // followed by a newline. No whitespace removal is done while
- // searching for this tag.
+ // followed by a newline. We ignore any whitespace after the end
+ // tag but not whitespace before it.
SI_CHAR cEndOfLineChar = *a_pData;
for(;;) {
// if we are loading comments then we need a comment character as
@@ -1806,10 +1806,18 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadMultiLineText(
// if are looking for a tag then do the check now. This is done before
// checking for end of the data, so that if we have the tag at the end
// of the data then the tag is removed correctly.
- if (a_pTagName &&
- (!IsLess(pDataLine, a_pTagName) && !IsLess(a_pTagName, pDataLine)))
- {
- break;
+ if (a_pTagName) {
+ // strip whitespace from the end of this tag
+ SI_CHAR* pc = a_pData - 1;
+ while (pc > pDataLine && IsSpace(*pc)) --pc;
+ SI_CHAR ch = *++pc;
+ *pc = 0;
+
+ if (!IsLess(pDataLine, a_pTagName) && !IsLess(a_pTagName, pDataLine)) {
+ break;
+ }
+
+ *pc = ch;
}
// if we are at the end of the data then we just automatically end
diff --git a/tests/ts-bugfix.cpp b/tests/ts-bugfix.cpp
index e449092..1234b8f 100644
--- a/tests/ts-bugfix.cpp
+++ b/tests/ts-bugfix.cpp
@@ -24,3 +24,114 @@ TEST(TestBugFix, TestEmptySection) {
output.erase(std::remove(output.begin(), output.end(), '\r'), output.end());
ASSERT_STREQ(expected.c_str(), output.c_str());
}
+
+TEST(TestBugFix, TestMultiLineIgnoreTrailSpace0) {
+ std::string input =
+ "; multiline values\n"
+ "key = <<<EOS\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "EOS\n"
+ "\n"
+ "[section]\n";
+
+ bool multiline = true;
+ CSimpleIniA ini(true, false, multiline);
+
+ SI_Error rc = ini.LoadData(input);
+ ASSERT_EQ(rc, SI_OK);
+
+ std::string output;
+ ini.Save(output);
+
+ std::string expected =
+ "; multiline values\n"
+ "\n"
+ "\n"
+ "key = <<<END_OF_TEXT\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "END_OF_TEXT\n"
+ "\n"
+ "\n"
+ "[section]\n";
+
+ output.erase(std::remove(output.begin(), output.end(), '\r'), output.end());
+ ASSERT_STREQ(expected.c_str(), output.c_str());
+}
+
+TEST(TestBugFix, TestMultiLineIgnoreTrailSpace1) {
+ std::string input =
+ "; multiline values\n"
+ "key = <<<EOS\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "EOS \n"
+ "\n"
+ "[section]\n";
+
+ bool multiline = true;
+ CSimpleIniA ini(true, false, multiline);
+
+ SI_Error rc = ini.LoadData(input);
+ ASSERT_EQ(rc, SI_OK);
+
+ std::string output;
+ ini.Save(output);
+
+ std::string expected =
+ "; multiline values\n"
+ "\n"
+ "\n"
+ "key = <<<END_OF_TEXT\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "END_OF_TEXT\n"
+ "\n"
+ "\n"
+ "[section]\n";
+
+ output.erase(std::remove(output.begin(), output.end(), '\r'), output.end());
+ ASSERT_STREQ(expected.c_str(), output.c_str());
+}
+
+TEST(TestBugFix, TestMultiLineIgnoreTrailSpace2) {
+ std::string input =
+ "; multiline values\n"
+ "key = <<<EOS\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "EOS \n"
+ "\n"
+ "[section]\n";
+
+ bool multiline = true;
+ CSimpleIniA ini(true, false, multiline);
+
+ SI_Error rc = ini.LoadData(input);
+ ASSERT_EQ(rc, SI_OK);
+
+ std::string output;
+ ini.Save(output);
+
+ std::string expected =
+ "; multiline values\n"
+ "\n"
+ "\n"
+ "key = <<<END_OF_TEXT\n"
+ "This is a\n"
+ "multiline value\n"
+ "and it ends.\n"
+ "END_OF_TEXT\n"
+ "\n"
+ "\n"
+ "[section]\n";
+
+ output.erase(std::remove(output.begin(), output.end(), '\r'), output.end());
+ ASSERT_STREQ(expected.c_str(), output.c_str());
+}