diff options
author | unknown <brofield@users.noreply.github.com> | 2020-06-16 20:35:12 +0300 |
---|---|---|
committer | unknown <brofield@users.noreply.github.com> | 2020-06-16 20:35:12 +0300 |
commit | 0607b9f7f7d92df418a9aec1d080193027e88726 (patch) | |
tree | 6c687afffb009b817339e26bd8f7d04a559fc678 | |
parent | 592b165f35d8608b957ff05c4d8caacdbb501e95 (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.h | 20 | ||||
-rw-r--r-- | tests/ts-bugfix.cpp | 111 |
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()); +} |