From 439dbfce6b00f2a14f7efcb792cab13b97539d66 Mon Sep 17 00:00:00 2001 From: twanvl Date: Mon, 25 Dec 2006 16:52:07 +0000 Subject: [PATCH] rewritten retrying part of reader, it is now implemented how it should have been from the start. git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@175 0fc631ac-6414-0410-93d0-97cfa31319b6 --- data/en.mse-locale/locale | 2 +- src/data/format/clipboard.cpp | 2 +- src/data/game.cpp | 2 +- src/data/set.cpp | 2 +- src/data/settings.cpp | 2 +- src/data/stylesheet.cpp | 2 +- src/gui/symbol/window.cpp | 4 ++-- src/render/text/viewer.cpp | 1 + src/render/value/choice.cpp | 1 + src/script/functions.cpp | 2 +- src/util/alignment.cpp | 2 +- src/util/io/package.cpp | 2 +- src/util/io/package.hpp | 2 +- src/util/io/reader.cpp | 34 +++++++++++++++------------ src/util/io/reader.hpp | 43 +++++++++++++++++++++-------------- src/util/version.cpp | 2 +- 16 files changed, 61 insertions(+), 44 deletions(-) diff --git a/data/en.mse-locale/locale b/data/en.mse-locale/locale index 87333d9d..275328e7 100644 --- a/data/en.mse-locale/locale +++ b/data/en.mse-locale/locale @@ -1,7 +1,7 @@ full name: English ############################################################## Menu items -menu +menu: file: &File new set: &New... Ctrl+N open set: &Open... Ctrl+O diff --git a/src/data/format/clipboard.cpp b/src/data/format/clipboard.cpp index 560c7f98..14d2b4b9 100644 --- a/src/data/format/clipboard.cpp +++ b/src/data/format/clipboard.cpp @@ -31,7 +31,7 @@ void deserialize_from_clipboard(T& object, Package& package, const String& data) shared_ptr stream( new wxStringInputStream(data) ); Reader reader(stream, _("clipboard")); WITH_DYNAMIC_ARG(clipboard_package, &package); - reader.handle(object); + reader.handle_greedy(object); } // ----------------------------------------------------------------------------- : CardDataObject diff --git a/src/data/game.cpp b/src/data/game.cpp index 9c552df4..3f110570 100644 --- a/src/data/game.cpp +++ b/src/data/game.cpp @@ -76,7 +76,7 @@ void addStatsDimensionsForFields(); // special behaviour of reading/writing GamePs: only read/write the name void Reader::handle(GameP& game) { - game = Game::byName(value); + game = Game::byName(getValue()); } void Writer::handle(const GameP& game) { if (game) handle(game->name()); diff --git a/src/data/set.cpp b/src/data/set.cpp index d76bfd23..ef1ff370 100644 --- a/src/data/set.cpp +++ b/src/data/set.cpp @@ -223,7 +223,7 @@ IndexMap& Set::stylingDataFor(const StyleSheet& stylesheet) { // we delayed the reading of the data, read it now styling->data.init(stylesheet.styling_fields); Reader reader(new_shared1(styling->unread_data), _("styling data of ") + stylesheet.stylesheetName()); - reader.handle(styling->data); + reader.handle_greedy(styling->data); styling->unread_data.clear(); } return styling->data; diff --git a/src/data/settings.cpp b/src/data/settings.cpp index e4710202..02351cd4 100644 --- a/src/data/settings.cpp +++ b/src/data/settings.cpp @@ -170,7 +170,7 @@ void Settings::read() { shared_ptr file = new_shared1(filename); if (!file->Ok()) return; // failure is not an error Reader reader(file, filename); - reader.handle(*this); + reader.handle_greedy(*this); } } diff --git a/src/data/stylesheet.cpp b/src/data/stylesheet.cpp index d32477c5..62d80cb2 100644 --- a/src/data/stylesheet.cpp +++ b/src/data/stylesheet.cpp @@ -87,7 +87,7 @@ void Reader::handle(StyleSheetP& stylesheet) { if (!game_for_reading()) { throw InternalError(_("game_for_reading not set")); } - stylesheet = StyleSheet::byGameAndName(*game_for_reading(), value); + stylesheet = StyleSheet::byGameAndName(*game_for_reading(), getValue()); } void Writer::handle(const StyleSheetP& stylesheet) { if (stylesheet) handle(stylesheet->stylesheetName()); diff --git a/src/gui/symbol/window.cpp b/src/gui/symbol/window.cpp index 79abb4ab..93436c6a 100644 --- a/src/gui/symbol/window.cpp +++ b/src/gui/symbol/window.cpp @@ -29,7 +29,7 @@ SymbolWindow::SymbolWindow(Window* parent, const String& filename) { // open file Reader reader(filename); SymbolP symbol; - reader.handle(symbol); + reader.handle_greedy(symbol); init(parent, symbol); } @@ -151,7 +151,7 @@ void SymbolWindow::onFileOpen(wxCommandEvent& ev) { //% symbol = importSymbol(wxImage(name)); } else { Reader reader(new_shared1(name), name); - reader.handle(symbol); + reader.handle_greedy(symbol); } // show... parts->setSymbol(symbol); diff --git a/src/render/text/viewer.cpp b/src/render/text/viewer.cpp index fdbb4d8a..b25884a2 100644 --- a/src/render/text/viewer.cpp +++ b/src/render/text/viewer.cpp @@ -174,6 +174,7 @@ struct CompareTop { }; size_t TextViewer::indexAt(const RealPoint& pos) const { // 1. find the line + if (lines.empty()) return 0; vector::const_iterator l = lower_bound(lines.begin(), lines.end(), pos.y, CompareTop()); if (l != lines.begin()) l--; assert(l != lines.end()); diff --git a/src/render/value/choice.cpp b/src/render/value/choice.cpp index 437f7983..0f104d07 100644 --- a/src/render/value/choice.cpp +++ b/src/render/value/choice.cpp @@ -14,6 +14,7 @@ void ChoiceValueViewer::draw(RotatedDC& dc) { drawFieldBorder(dc); + if (style().render_style & RENDER_HIDDEN) return; if (value().value().empty()) return; double margin = 0; if (style().render_style & RENDER_IMAGE) { diff --git a/src/script/functions.cpp b/src/script/functions.cpp index 10c4f859..09c2dfbb 100644 --- a/src/script/functions.cpp +++ b/src/script/functions.cpp @@ -495,7 +495,7 @@ SCRIPT_FUNCTION_DEP(combined_editor) { pos = value.find(_(" void Reader::handle(Alignment& align) { - align = from_string(value); + align = from_string(getValue()); } template <> void Writer::handle(const Alignment& align) { handle(to_string(align)); diff --git a/src/util/io/package.cpp b/src/util/io/package.cpp index ff6037dd..5a38ccec 100644 --- a/src/util/io/package.cpp +++ b/src/util/io/package.cpp @@ -424,7 +424,7 @@ void Packaged::open(const String& package) { Package::open(package); Reader reader(openIn(typeName()), absoluteFilename() + _("/") + typeName()); try { - reader.handle(*this); + reader.handle_greedy(*this); validate(reader.file_app_version); } catch (const ParseError& err) { throw FileParseError(err.what(), absoluteFilename() + _("/") + typeName()); // more detailed message diff --git a/src/util/io/package.hpp b/src/util/io/package.hpp index d6d2d50a..88ca9781 100644 --- a/src/util/io/package.hpp +++ b/src/util/io/package.hpp @@ -117,7 +117,7 @@ class Package { void readFile(const String& file, T& obj) { Reader reader(openIn(file), absoluteFilename() + _("/") + file); try { - reader.handle(obj); + reader.handle_greedy(obj); } catch (const ParseError& err) { throw FileParseError(err.what(), absoluteFilename() + _("/") + file); // more detailed message } diff --git a/src/util/io/reader.cpp b/src/util/io/reader.cpp index e6322a9d..0acd5230 100644 --- a/src/util/io/reader.cpp +++ b/src/util/io/reader.cpp @@ -81,6 +81,7 @@ void Reader::exitBlock() { while (indent > expected_indent) { moveNext(); } + handled = true; } void Reader::moveNext() { @@ -110,12 +111,12 @@ void Reader::readLine() { } // read key / value size_t pos = line.find_first_of(_(':'), indent); - if (!pos || line.GetChar(indent) == _('#')) { + if (trim(line).empty() || line.GetChar(indent) == _('#')) { // empty line or comment key.clear(); return; } - if (key.empty() && input->Eof()) { + if (input->Eof()) { // end of file indent = -1; return; @@ -147,9 +148,10 @@ void Reader::unknownKey() { // ----------------------------------------------------------------------------- : Handling basic types -template <> void Reader::handle(String& s) { +const String& Reader::getValue() { + handled = true; if (!multi_line_str.empty()) { - s = multi_line_str; + return multi_line_str; } else if (value.empty()) { // a multiline string bool first = true; @@ -161,50 +163,54 @@ template <> void Reader::handle(String& s) { multi_line_str += line.substr(expected_indent); // strip expected indent readLine(); } - // moveNext(), but without emptying multiLineStr + // moveNext(), but without emptying multi_line_str just_opened = false; while (key.empty() && !input->Eof()) { readLine(); } - s = multi_line_str; + return multi_line_str; } else { - s = value; + return value; } } + +template <> void Reader::handle(String& s) { + s = getValue(); +} template <> void Reader::handle(int& i) { long l = 0; - value.ToLong(&l); + getValue().ToLong(&l); i = l; } template <> void Reader::handle(unsigned int& i) { long l = 0; - value.ToLong(&l); + getValue().ToLong(&l); i = abs(l); // abs, because it will seem strange if -1 comes out as MAX_INT } template <> void Reader::handle(double& d) { - value.ToDouble(&d); + getValue().ToDouble(&d); } template <> void Reader::handle(bool& b) { - b = (value==_("true") || value==_("1") || value==_("yes")); + b = (getValue()==_("true") || getValue()==_("1") || getValue()==_("yes")); } // ----------------------------------------------------------------------------- : Handling less basic util types template <> void Reader::handle(Vector2D& vec) { - if (!wxSscanf(value.c_str(), _("(%lf,%lf)"), &vec.x, &vec.y)) { + if (!wxSscanf(getValue().c_str(), _("(%lf,%lf)"), &vec.x, &vec.y)) { throw ParseError(_("Expected (x,y)")); } } template <> void Reader::handle(Color& col) { UInt r,g,b; - if (wxSscanf(value.c_str(),_("rgb(%u,%u,%u)"),&r,&g,&b)) { + if (wxSscanf(getValue().c_str(),_("rgb(%u,%u,%u)"),&r,&g,&b)) { col.Set(r, g, b); } } template <> void Reader::handle(FileName& f) { if (clipboard_package()) { - String str; handle(str); + String str = getValue(); if (!str.empty()) { // copy file into current package try { diff --git a/src/util/io/reader.hpp b/src/util/io/reader.hpp index 25aa3e99..b4eb1e7c 100644 --- a/src/util/io/reader.hpp +++ b/src/util/io/reader.hpp @@ -62,11 +62,23 @@ class Reader { void showWarnings(); // --------------------------------------------------- : Handling objects + /// Handle an object that can read as much as it can eat + template + void handle_greedy(T& object) { + do { +// UInt l = line_number; + handled = false; + handle(object); +// if (l == line_number && !handled) unknownKey(object); + if (!handled) unknownKey(object); + } while (indent >= expected_indent); + } + /// Handle an object: read it if it's name matches template void handle(const Char* name, T& object) { if (enterBlock(name)) { - handle(object); + handle_greedy(object); exitBlock(); } } @@ -100,6 +112,8 @@ class Reader { String key, value; /// A string spanning multiple lines String multi_line_str; + /// Has the current line been handled? + bool handled; /// Indentation of the last line we read int indent; /// Indentation of the block we are in @@ -132,13 +146,16 @@ class Reader { /// Reads the next line from the input, and stores it in line/key/value/indent void readLine(); + /// Return the value on the current line + const String& getValue(); + /// No line was read, because nothing mathes the current key /** Maybe the key is "include file" */ template void unknownKey(T& v) { if (key == _("include file")) { Reader reader(value); - reader.handle(v); + reader.handle_greedy(v); moveNext(); } else { unknownKey(); @@ -166,7 +183,7 @@ void Reader::handle(const Char* name, vector& vector) { String vectorKey = singular_form(name); while (enterBlock(vectorKey)) { vector.resize(vector.size() + 1); - handle(vector.back()); + handle_greedy(vector.back()); update_index(vector.back(), vector.size() - 1); // update index for IndexMap exitBlock(); } @@ -187,20 +204,16 @@ void Reader::handle(map& m) { just_opened = true; expected_indent += 1; // now read the value - handle(m[key]); + handle_greedy(m[key]); exitBlock(); } } template void Reader::handle(IndexMap& m) { - //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); + for (typename IndexMap::iterator it = m.begin() ; it != m.end() ; ++it) { + handle(get_key_name(*it).c_str(), *it); + } } // ----------------------------------------------------------------------------- : Reflection @@ -208,11 +221,7 @@ void Reader::handle(IndexMap& m) { /// Implement reflection as used by Reader #define REFLECT_OBJECT_READER(Cls) \ template<> void Reader::handle(Cls& object) { \ - do { \ - UInt l = line_number; \ - object.reflect(*this); \ - if (l == line_number) unknownKey(object); \ - } while (indent >= expected_indent); \ + object.reflect(*this); \ } \ void Cls::reflect(Reader& reader) { \ reflect_impl(reader); \ @@ -223,7 +232,7 @@ void Reader::handle(IndexMap& m) { /// Implement enum reflection as used by Reader #define REFLECT_ENUM_READER(Enum) \ template<> void Reader::handle(Enum& enum_) { \ - EnumReader reader(value); \ + EnumReader reader(getValue()); \ reflect_ ## Enum(enum_, reader); \ if (!reader.isDone()) { \ /* warning: unknown value */ \ diff --git a/src/util/version.cpp b/src/util/version.cpp index de34c738..3701dfa8 100644 --- a/src/util/version.cpp +++ b/src/util/version.cpp @@ -29,7 +29,7 @@ Version Version::fromString(const String& version) { template <> void Reader::handle(Version& v) { - v = Version::fromString(value); + v = Version::fromString(getValue()); } template <> void Writer::handle(const Version& v) { handle(v.toString());