diff --git a/modules/io/src/mol/star_parser.cc b/modules/io/src/mol/star_parser.cc index 4da41b237b9c72f5bcedd64f0c34c7ac82430f23..596230d8320978e23e63b30bb590b22987160851 100644 --- a/modules/io/src/mol/star_parser.cc +++ b/modules/io/src/mol/star_parser.cc @@ -344,7 +344,7 @@ void StarParser::ParseLoop() } else { tmp_values.push_back(tline.str()); const char* d=tmp_values.back().c_str(); - for (size_t i=std::max(before-1, 0); i<columns.size(); ++i) { + for (size_t i=before; i<columns.size(); ++i) { columns[i]=StringRef(d+(columns[i].begin()-tline.begin()), columns[i].size()); } diff --git a/modules/io/tests/test_star_parser.cc b/modules/io/tests/test_star_parser.cc index dd56aaa4cd5df3976339443bc6ae38015bd8bcb5..d9a100dfa40ec1a32168cdefe13734e8d6a35194 100644 --- a/modules/io/tests/test_star_parser.cc +++ b/modules/io/tests/test_star_parser.cc @@ -117,6 +117,46 @@ public: bool visit_two; }; +class HardLoopTestParser : public StarParser { +public: + HardLoopTestParser(std::istream& stream): StarParser(stream), cur_char_('A') + { } + + virtual bool OnBeginLoop(const StarLoopDesc& header) + { + return true; + } + + virtual void OnDataRow(const StarLoopDesc& header, + const std::vector<StringRef>& columns) + { + BOOST_CHECK_EQUAL(columns[0][0], cur_char_); + BOOST_CHECK_EQUAL(columns[0].size(), 1); + ++cur_char_; + BOOST_CHECK_EQUAL(columns[1][0], cur_char_); + BOOST_CHECK_EQUAL(columns[1].size(), 1); + ++cur_char_; + BOOST_CHECK_EQUAL(columns[2][0], cur_char_); + BOOST_CHECK_EQUAL(columns[2].size(), 1); + ++cur_char_; + BOOST_CHECK_EQUAL(columns[3][0], cur_char_); + BOOST_CHECK_EQUAL(columns[3].size(), 1); + ++cur_char_; + BOOST_CHECK_EQUAL(columns[4][0], cur_char_); + BOOST_CHECK_EQUAL(columns[4].size(), 1); + ++cur_char_; + BOOST_CHECK_EQUAL(columns[5][0], cur_char_); + BOOST_CHECK_EQUAL(columns[5].size(), 1); + ++cur_char_; + } + + virtual void OnEndLoop() + { + BOOST_CHECK_EQUAL(cur_char_, 'S'); + } + char cur_char_; +}; + class ItemsAsRowTestParser : public StarParser { public: ItemsAsRowTestParser(std::istream& stream): StarParser(stream, true), @@ -282,6 +322,13 @@ BOOST_AUTO_TEST_CASE(star_multi) BOOST_CHECK(star_p.visit_one); BOOST_CHECK(star_p.visit_two); } + +BOOST_AUTO_TEST_CASE(star_multiline_loop) +{ + std::ifstream s("testfiles/multiline-loop.cif"); + HardLoopTestParser star_p(s); + star_p.Parse(); +} BOOST_AUTO_TEST_CASE(star_loop) { diff --git a/modules/io/tests/testfiles/multiline-loop.cif b/modules/io/tests/testfiles/multiline-loop.cif new file mode 100644 index 0000000000000000000000000000000000000000..64ab7829bb71bb313447c11b92f2a6cbdef7f82d --- /dev/null +++ b/modules/io/tests/testfiles/multiline-loop.cif @@ -0,0 +1,23 @@ +data_multiline_loop +loop_ +_a.u +_a.v +_a.w +_a.x +_a.y +_a.z +A B C +D +E F +G +H +I +J +K +L +M +N +O +P +Q +R \ No newline at end of file