diff --git a/src/util/io/reader.cpp b/src/util/io/reader.cpp index 9684ff4e..55e1bce2 100644 --- a/src/util/io/reader.cpp +++ b/src/util/io/reader.cpp @@ -116,10 +116,13 @@ void Reader::readLine() { } void Reader::unknownKey() { - warning(_("Unexpected key: '") + key + _("'")); - do { - moveNext(); - } while (indent > expected_indent); + if (indent == expected_indent) { + warning(_("Unexpected key: '") + key + _("'")); + do { + moveNext(); + } while (indent > expected_indent); + } + // else: could be a nameless value, which doesn't call exitBlock to move past its own key } // ----------------------------------------------------------------------------- : Handling basic types diff --git a/src/util/io/reader.hpp b/src/util/io/reader.hpp index 327e15c9..677cc266 100644 --- a/src/util/io/reader.hpp +++ b/src/util/io/reader.hpp @@ -146,12 +146,16 @@ shared_ptr read_new(Reader& reader) { return new_shared(); } +/// Update the 'index' member of a value for use by IndexMap +template void update_index(T&, size_t index) {} + template void Reader::handle(const Char* name, vector& vector) { String vectorKey = singular_form(name); while (enterBlock(vectorKey)) { vector.resize(vector.size() + 1); handle(vector.back()); + update_index(vector.back(), vector.size() - 1); // update index for IndexMap exitBlock(); } } @@ -169,11 +173,13 @@ void Reader::handle(map& m) { template void Reader::handle(IndexMap& m) { - while (indent >= expected_indent) { + do { + UInt l = line_number; for (typename IndexMap::iterator it = m.begin() ; it != m.end() ; ++it) { handle(get_key_name(*it).c_str(), *it); } - } + if (l == line_number) unknownKey(m); + } while (indent >= expected_indent); } // ----------------------------------------------------------------------------- : Reflection @@ -181,11 +187,11 @@ void Reader::handle(IndexMap& m) { /// Implement reflection as used by Reader #define REFLECT_OBJECT_READER(Cls) \ template<> void Reader::handle(Cls& object) { \ - while (indent >= expected_indent) { \ + do { \ UInt l = line_number; \ object.reflect(*this); \ if (l == line_number) unknownKey(object); \ - } \ + } while (indent >= expected_indent); \ } \ void Cls::reflect(Reader& reader) { \ reflect_impl(reader); \ diff --git a/src/util/version.cpp b/src/util/version.cpp new file mode 100644 index 00000000..de34c738 --- /dev/null +++ b/src/util/version.cpp @@ -0,0 +1,54 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) 2001 - 2006 Twan van Laarhoven | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +// ----------------------------------------------------------------------------- : Includes + +#include +#include +#include