Commit 76b5e931 authored by twanvl's avatar twanvl

fixed reading of IndexMaps: loop, initialization of 'index'

parent 17762eca
...@@ -116,10 +116,13 @@ void Reader::readLine() { ...@@ -116,10 +116,13 @@ void Reader::readLine() {
} }
void Reader::unknownKey() { void Reader::unknownKey() {
warning(_("Unexpected key: '") + key + _("'")); if (indent == expected_indent) {
do { warning(_("Unexpected key: '") + key + _("'"));
moveNext(); do {
} while (indent > expected_indent); 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 // ----------------------------------------------------------------------------- : Handling basic types
......
...@@ -146,12 +146,16 @@ shared_ptr<T> read_new(Reader& reader) { ...@@ -146,12 +146,16 @@ shared_ptr<T> read_new(Reader& reader) {
return new_shared<T>(); return new_shared<T>();
} }
/// Update the 'index' member of a value for use by IndexMap
template <typename T> void update_index(T&, size_t index) {}
template <typename T> template <typename T>
void Reader::handle(const Char* name, vector<T>& vector) { void Reader::handle(const Char* name, vector<T>& vector) {
String vectorKey = singular_form(name); String vectorKey = singular_form(name);
while (enterBlock(vectorKey)) { while (enterBlock(vectorKey)) {
vector.resize(vector.size() + 1); vector.resize(vector.size() + 1);
handle(vector.back()); handle(vector.back());
update_index(vector.back(), vector.size() - 1); // update index for IndexMap
exitBlock(); exitBlock();
} }
} }
...@@ -169,11 +173,13 @@ void Reader::handle(map<K,V>& m) { ...@@ -169,11 +173,13 @@ void Reader::handle(map<K,V>& m) {
template <typename K, typename V> template <typename K, typename V>
void Reader::handle(IndexMap<K,V>& m) { void Reader::handle(IndexMap<K,V>& m) {
while (indent >= expected_indent) { do {
UInt l = line_number;
for (typename IndexMap<K,V>::iterator it = m.begin() ; it != m.end() ; ++it) { for (typename IndexMap<K,V>::iterator it = m.begin() ; it != m.end() ; ++it) {
handle(get_key_name(*it).c_str(), *it); handle(get_key_name(*it).c_str(), *it);
} }
} if (l == line_number) unknownKey(m);
} while (indent >= expected_indent);
} }
// ----------------------------------------------------------------------------- : Reflection // ----------------------------------------------------------------------------- : Reflection
...@@ -181,11 +187,11 @@ void Reader::handle(IndexMap<K,V>& m) { ...@@ -181,11 +187,11 @@ void Reader::handle(IndexMap<K,V>& m) {
/// Implement reflection as used by Reader /// Implement reflection as used by Reader
#define REFLECT_OBJECT_READER(Cls) \ #define REFLECT_OBJECT_READER(Cls) \
template<> void Reader::handle<Cls>(Cls& object) { \ template<> void Reader::handle<Cls>(Cls& object) { \
while (indent >= expected_indent) { \ do { \
UInt l = line_number; \ UInt l = line_number; \
object.reflect(*this); \ object.reflect(*this); \
if (l == line_number) unknownKey(object); \ if (l == line_number) unknownKey(object); \
} \ } while (indent >= expected_indent); \
} \ } \
void Cls::reflect(Reader& reader) { \ void Cls::reflect(Reader& reader) { \
reflect_impl(reader); \ reflect_impl(reader); \
......
//+----------------------------------------------------------------------------+
//| 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 <util/version.hpp>
#include <util/reflect.hpp>
#include <script/value.hpp>
// ----------------------------------------------------------------------------- : Version
UInt Version::toNumber() const { return version; }
String Version::toString() const {
return String() <<
((version / 10000) % 100) <<
_(".") << ((version / 100) % 100) <<
_(".") << ((version / 1) % 100);
}
Version Version::fromString(const String& version) {
UInt major = 0, minor = 0, build = 0;
wxSscanf(version, _("%u.%u.%u"), &major, &minor, &build);
return Version(major * 10000 + minor * 100 + build);
}
template <> void Reader::handle(Version& v) {
v = Version::fromString(value);
}
template <> void Writer::handle(const Version& v) {
handle(v.toString());
}
template <> void GetDefaultMember::handle(const Version& v) {
handle(v.toNumber());
}
// ----------------------------------------------------------------------------- : Versions
// NOTE: Don't use leading zeroes, they mean octal
const Version app_version = 300; // 0.3.0
const Char* version_suffix = _(" (beta)");
/* Changes:
* 0.2.0 : start of version numbering practice
* 0.2.2 : _("include file")
* 0.2.6 : fix in settings loading
* 0.2.7 : new tag system, different style of close tags
* 0.3.0 : port of code to C++
*/
const Version file_version = 300; // 0.3.0
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment