From 645fd792002c01a7a7d2904f8f19b6d81bb84ba5 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 28 Jul 2013 18:05:30 +0100 Subject: [PATCH 01/11] Initial commit to branch in which work on legacy support will take place. --- src/backend/legacy-generator.h | 39 ++++++++++++++++++++++++++++++++++ src/backend/legacy-parser.h | 6 ++++-- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/backend/legacy-generator.h diff --git a/src/backend/legacy-generator.h b/src/backend/legacy-generator.h new file mode 100644 index 00000000..ebf68447 --- /dev/null +++ b/src/backend/legacy-generator.h @@ -0,0 +1,39 @@ +/* BOSS + + A "one-click" program for users that quickly optimises and avoids + detrimental conflicts in their TES IV: Oblivion, Nehrim - At Fate's Edge, + TES V: Skyrim, Fallout 3 and Fallout: New Vegas mod load orders. + + Copyright (C) 2009-2012 BOSS Development Team. + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . + + $Revision: 2188 $, $Date: 2011-01-20 10:05:16 +0000 (Thu, 20 Jan 2011) $ +*/ + +#ifndef __BOSS_LEGACY_GENERATOR__ +#define __BOSS_LEGACY_GENERATOR__ + +// This file holds the code necessary for outputting a list of plugins and a list of global messages as a v2 masterlist. + +#include "metadata.h" +#include "error.h" +#include "game.h" + +namespace boss { + +} diff --git a/src/backend/legacy-parser.h b/src/backend/legacy-parser.h index a62f8c4f..9a21e72d 100644 --- a/src/backend/legacy-parser.h +++ b/src/backend/legacy-parser.h @@ -25,8 +25,10 @@ $Revision: 2188 $, $Date: 2011-01-20 10:05:16 +0000 (Thu, 20 Jan 2011) $ */ -#ifndef __BOSS_GRAMMAR_H__ -#define __BOSS_GRAMMAR_H__ +#ifndef __BOSS_LEGACY_PARSER__ +#define __BOSS_LEGACY_PARSER__ + +// This file holds the code necessary for inputting a v2 masterlist and getting a list of plugins and a list of global messages from it. #ifndef BOOST_SPIRIT_UNICODE #define BOOST_SPIRIT_UNICODE From 968c4390a65abbde00d60550a1fde8cab4bb831e Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 28 Jul 2013 18:24:10 +0100 Subject: [PATCH 02/11] Added tester code to initial BOSS startup, will not be kept when branch is merged, but useful for now. --- src/gui/main.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index b333fbe5..9d879774 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -33,6 +33,7 @@ #include "../backend/generators.h" #include "../backend/network.h" #include "../backend/streams.h" +#include "../backend/legacy-parser.h" #include #include @@ -283,6 +284,31 @@ bool BossGUI::OnInit() { return false; } + //Legacy parser test. +try { + fs::path v2masterlist("../../BOSS/data/boss-skyrim/masterlist.txt"); + list plugins; + list globalMessages; + Loadv2Masterlist(v2masterlist, plugins, globalMessages); + + YAML::Emitter yout; + yout.SetIndent(2); + yout << YAML::BeginMap + << YAML::Key << "globals" << YAML::Value << globalMessages + << YAML::Key << "plugins" << YAML::Value << plugins + << YAML::EndMap; + + boss::ofstream out("foo.txt"); + out << yout.c_str(); + out.close(); + + for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { + it->EvalAllConditions(_game, boss::g_lang_any); + } +} catch (boss::error& e) { + BOOST_LOG_TRIVIAL(error) << "Error using legacy parser: " << e.what(); +} + //Create launcher window. BOOST_LOG_TRIVIAL(debug) << "Opening the main BOSS window."; Launcher * launcher = new Launcher(wxT("BOSS"), _settings, _game, _games); From 412b06bde86c8dd801be6507356fc8e5e37f2481 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 28 Jul 2013 18:57:04 +0100 Subject: [PATCH 03/11] Removed generator, upon further thinking it isn't actually possible. --- src/backend/legacy-generator.h | 39 ---------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/backend/legacy-generator.h diff --git a/src/backend/legacy-generator.h b/src/backend/legacy-generator.h deleted file mode 100644 index ebf68447..00000000 --- a/src/backend/legacy-generator.h +++ /dev/null @@ -1,39 +0,0 @@ -/* BOSS - - A "one-click" program for users that quickly optimises and avoids - detrimental conflicts in their TES IV: Oblivion, Nehrim - At Fate's Edge, - TES V: Skyrim, Fallout 3 and Fallout: New Vegas mod load orders. - - Copyright (C) 2009-2012 BOSS Development Team. - - This file is part of BOSS. - - BOSS is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - BOSS is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with BOSS. If not, see - . - - $Revision: 2188 $, $Date: 2011-01-20 10:05:16 +0000 (Thu, 20 Jan 2011) $ -*/ - -#ifndef __BOSS_LEGACY_GENERATOR__ -#define __BOSS_LEGACY_GENERATOR__ - -// This file holds the code necessary for outputting a list of plugins and a list of global messages as a v2 masterlist. - -#include "metadata.h" -#include "error.h" -#include "game.h" - -namespace boss { - -} From 8582198e7cd7c3e1348f324d46c01459b577c700 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 28 Jul 2013 20:00:18 +0100 Subject: [PATCH 04/11] Issue #28 work. Converted requirement and incompatibility messages are now labelled as such. --- src/backend/legacy-parser.h | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/backend/legacy-parser.h b/src/backend/legacy-parser.h index 9a21e72d..b891f843 100644 --- a/src/backend/legacy-parser.h +++ b/src/backend/legacy-parser.h @@ -69,8 +69,8 @@ namespace boss { add //New Message keywords. ("say",g_message_say) ("tag",g_message_tag) - ("req",g_message_say) - ("inc", g_message_say) + // ("req",g_message_say) + // ("inc", g_message_say) ("dirty",g_message_warn) ("warn",g_message_warn) ("error",g_message_error) @@ -181,7 +181,7 @@ namespace boss { pluginMessages %= ( +qi::eol - >> pluginMessage % +qi::eol + >> ( pluginMessage | pluginReqMessage | pluginIncMessage ) % +qi::eol ) | qi::eps [qi::_1 = noMessages]; pluginMessage = @@ -191,6 +191,30 @@ namespace boss { >> charString) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. ; + pluginReqMessage = + ( + conditionals [phoenix::ref(lastConditional) = qi::_1] + >> reqMessageKeyword + >> ':' + >> charString[qi::_1 = "Requires: " + qi::_1] + ) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. + ; + + pluginIncMessage = + ( + conditionals [phoenix::ref(lastConditional) = qi::_1] + >> incMessageKeyword + >> ':' + >> charString[qi::_1 = "Incompatible with: " + qi::_1] + ) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. + ; + + incMessageKeyword = + unicode::no_case[qi::lit("inc")] [qi::_val = g_message_say]; + + reqMessageKeyword = + unicode::no_case[qi::lit("req")] [qi::_val = g_message_say]; + charString %= qi::lexeme[+(unicode::char_ - qi::eol)]; //String, with no skipper. messageKeyword %= unicode::no_case[masterlistMsgKey]; @@ -318,8 +342,8 @@ namespace boss { qi::rule > listVar, groupLine; qi::rule > listPlugin; qi::rule(), Skipper > pluginMessages; - qi::rule > globalMessage, pluginMessage; - qi::rule messageKeyword; + qi::rule > globalMessage, pluginMessage, pluginReqMessage, pluginIncMessage; + qi::rule messageKeyword, reqMessageKeyword, incMessageKeyword; qi::rule > charString, andOr, conditional, conditionals, ifIfnot, functCondition, variable, file, checksum, version, comparator, regex, language; std::map varConditionMap; From 711fc7799e048ddc04b32293289a97bdc1dccb31 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 28 Jul 2013 21:03:00 +0100 Subject: [PATCH 05/11] Issue #28 work. Implemented a more rigorous conversion method for inc, req and dirty messages, with localised text additions. --- src/backend/legacy-parser.h | 91 +++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/src/backend/legacy-parser.h b/src/backend/legacy-parser.h index b891f843..47619dec 100644 --- a/src/backend/legacy-parser.h +++ b/src/backend/legacy-parser.h @@ -59,6 +59,11 @@ namespace boss { namespace unicode = boost::spirit::unicode; namespace phoenix = boost::phoenix; + //Message types for those that will be converted, but need identifying in the interim. Must not conflict with the values for the global types. + unsigned int message_inc = 1000; + unsigned int message_req = 1001; + unsigned int message_dirty = 1002; + /////////////////////////////// // Keyword structures @@ -69,9 +74,9 @@ namespace boss { add //New Message keywords. ("say",g_message_say) ("tag",g_message_tag) - // ("req",g_message_say) - // ("inc", g_message_say) - ("dirty",g_message_warn) + ("req",message_req) + ("inc", message_inc) + ("dirty",message_dirty) ("warn",g_message_warn) ("error",g_message_error) ; @@ -181,7 +186,7 @@ namespace boss { pluginMessages %= ( +qi::eol - >> ( pluginMessage | pluginReqMessage | pluginIncMessage ) % +qi::eol + >> pluginMessage % +qi::eol ) | qi::eps [qi::_1 = noMessages]; pluginMessage = @@ -191,30 +196,6 @@ namespace boss { >> charString) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. ; - pluginReqMessage = - ( - conditionals [phoenix::ref(lastConditional) = qi::_1] - >> reqMessageKeyword - >> ':' - >> charString[qi::_1 = "Requires: " + qi::_1] - ) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. - ; - - pluginIncMessage = - ( - conditionals [phoenix::ref(lastConditional) = qi::_1] - >> incMessageKeyword - >> ':' - >> charString[qi::_1 = "Incompatible with: " + qi::_1] - ) [phoenix::bind(&LegacyMasterlistGrammar::MakeMessage, this, qi::_val, qi::_1, qi::_2, qi::_3)] //The double >> matters. A single > doesn't work. - ; - - incMessageKeyword = - unicode::no_case[qi::lit("inc")] [qi::_val = g_message_say]; - - reqMessageKeyword = - unicode::no_case[qi::lit("req")] [qi::_val = g_message_say]; - charString %= qi::lexeme[+(unicode::char_ - qi::eol)]; //String, with no skipper. messageKeyword %= unicode::no_case[masterlistMsgKey]; @@ -342,8 +323,8 @@ namespace boss { qi::rule > listVar, groupLine; qi::rule > listPlugin; qi::rule(), Skipper > pluginMessages; - qi::rule > globalMessage, pluginMessage, pluginReqMessage, pluginIncMessage; - qi::rule messageKeyword, reqMessageKeyword, incMessageKeyword; + qi::rule > globalMessage, pluginMessage; + qi::rule messageKeyword; qi::rule > charString, andOr, conditional, conditionals, ifIfnot, functCondition, variable, file, checksum, version, comparator, regex, language; std::map varConditionMap; @@ -641,7 +622,7 @@ namespace boss { //BOSSv2 supports Chinese and German in addition to English, Russian and Spanish, but they aren't used in any of the masterlists so don't bother mapping them. unsigned int langInt; - if (lang == "english") + if (lang == "english" || lang == "chinese" || lang == "german") langInt = g_lang_english; else if (lang == "russian") langInt = g_lang_russian; @@ -650,15 +631,57 @@ namespace boss { else langInt = g_lang_any; - //Also convert warning messages about dirty edits that say "do not clean" to notes. - if (type == g_message_warn && content.find("dirty edits") != std::string::npos) { - std::string search = "do not clean"; + /* Now convert the temporary message types into say or warning messages as appropriate. Translations were obtained from the BOSSv2 translation files. Thanks to the translators for them. */ + + if (type == message_dirty) { + + std::string search; + std::string opener; + if (langInt == g_lang_english || langInt == g_lang_any) { + search = "do not clean"; + opener = "Contains dirty edits: "; + } else if (langInt == g_lang_spanish) { + search = "no se limpia"; + opener = "Contiene ediciones sucia: "; + } else if (langInt == g_lang_russian) { + search = "Не очищать"; + opener = "\"Грязные\" правки: "; + } + const boost::iterator_range ir1(content.begin(), content.end()); const boost::iterator_range ir2(search.begin(), search.end()); if (boost::ifind_first(ir1, ir2)) type = g_message_say; + else + type = g_message_warn; + + content = opener + content; + } else if (type == message_req) { + type = g_message_say; + + std::string opener; + if (langInt == g_lang_english || langInt == g_lang_any) + opener = "Requires: "; + else if (langInt == g_lang_spanish) + opener = "Requiere: "; + else if (langInt == g_lang_russian) + opener = "Требуется: "; + + content = opener + content; + } else if (type == message_inc) { + type = g_message_say; + + std::string opener; + if (langInt == g_lang_english || langInt == g_lang_any) + opener = "Incompatible with: "; + else if (langInt == g_lang_spanish) + opener = "Incompatible con: "; + else if (langInt == g_lang_russian) + opener = "Несовместим с: "; + + content = opener + content; } std::vector mc_vec; From 2cde0c2c5ce14c0dab5515e779a0863077c8ac04 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Mon, 29 Jul 2013 09:41:24 +0100 Subject: [PATCH 06/11] Updated API internally to reflect recent changes. --- src/api/api.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/api.cpp b/src/api/api.cpp index dd6dc142..618fdc26 100644 --- a/src/api/api.cpp +++ b/src/api/api.cpp @@ -251,7 +251,8 @@ BOSS_API unsigned int boss_load_lists (boss_db db, const char * const masterlist temp = tempNode["plugins"].as< std::list >(); } else { boost::filesystem::path p(masterlistPath); - Loadv2Masterlist(p, temp); + std::list filler; + Loadv2Masterlist(p, temp, filler); } } catch (YAML::Exception& e) { extMessageStr = e.what(); From b3a562a60dd1f3c41115497940dc1e785bd58725 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 31 Jul 2013 18:17:10 +0100 Subject: [PATCH 07/11] Fixed discrepancy between YAML generator output and parser's expected input. --- src/backend/generators.h | 5 +---- src/gui/main.cpp | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/backend/generators.h b/src/backend/generators.h index b8a988ef..2d3737ff 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -588,10 +588,7 @@ namespace YAML { else out << Key << "type" << Value << "error"; - if (rhs.Content().size() == 1) - out << Key << "content" << Value << rhs.Content().front(); - else - out << Key << "content" << Value << rhs.Content(); + out << Key << "content" << Value << rhs.Content(); if (!rhs.Condition().empty()) out << Key << "condition" << Value << rhs.Condition(); diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 9d879774..f9de10e9 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -298,7 +298,7 @@ try { << YAML::Key << "plugins" << YAML::Value << plugins << YAML::EndMap; - boss::ofstream out("foo.txt"); + boss::ofstream out(_game.MasterlistPath()); out << yout.c_str(); out.close(); From 371c2f162da9612ec0eea09f07e401f65254d5b0 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 31 Jul 2013 19:18:43 +0100 Subject: [PATCH 08/11] Fixed issue #34. --- src/backend/parsers.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/backend/parsers.h b/src/backend/parsers.h index f073c33f..96933534 100644 --- a/src/backend/parsers.h +++ b/src/backend/parsers.h @@ -113,14 +113,14 @@ namespace YAML { Node node; node["str"] = rhs.Str(); node["lang"] = boss::GetLangString(rhs.Language()); - + return node; } static bool decode(const Node& node, boss::MessageContent& rhs) { - if (!node["str"] || !node["lang"]) + if (!node.IsMap() || !node["str"] || !node["lang"]) return false; - + std::string str = node["str"].as(); unsigned int lang = boss::GetLangNum(node["lang"].as()); @@ -143,7 +143,7 @@ namespace YAML { node["type"] = "warn"; else node["type"] = "error"; - + return node; } @@ -177,10 +177,11 @@ namespace YAML { if (it->Language() == boss::g_lang_english) found = true; } - if (!found) - return false; + //Commented out because the auto-converted masterlist has localisations as separate messages and so will always fail. + // if (!found) + // return false; } - + std::string condition; if (node["condition"]) condition = node["condition"].as(); @@ -242,7 +243,7 @@ namespace YAML { rhs = boss::Tag(tag.substr(1), false, condition); else rhs = boss::Tag(tag, true, condition); - + return true; } }; From 3bbf88c92ba5380ce1771682f6f48c17236257bf Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 31 Jul 2013 21:57:27 +0100 Subject: [PATCH 09/11] Fixed issue #33. --- src/api/api.cpp | 24 ++++++++++++++++++------ src/backend/legacy-parser.h | 5 +---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/api/api.cpp b/src/api/api.cpp index 618fdc26..b042ff02 100644 --- a/src/api/api.cpp +++ b/src/api/api.cpp @@ -130,6 +130,21 @@ char * ToNewCString(std::string str) { return strcpy(p, str.c_str()); } +bool IsDirtyMessage(std::string message) { + const std::string local[3] = { + "Contains dirty edits: ", + "Contiene ediciones sucia: ", + "\"Грязные\" правки: " + }; + + for (int i=0; i < 3; ++i) { + if (boost::icontains(message, local[i])) + return true; + } + + return false; +} + ////////////////////////////// // Error Handling Functions ////////////////////////////// @@ -605,10 +620,10 @@ BOSS_API unsigned int boss_get_dirty_message (boss_db db, const char * const plu pluginMessages.insert(pluginMessages.end(), temp.begin(), temp.end()); } - //Now discard any that aren't warnings about dirty edits. + //Now discard any that aren't about dirty edits. std::list::iterator it=pluginMessages.begin(); while (it != pluginMessages.end()) { - if (it->ChooseContent(boss::g_lang_any).Str().find("dirty edits") == std::string::npos) + if (IsDirtyMessage(it->ChooseContent(boss::g_lang_any).Str())) it = pluginMessages.erase(it); } @@ -654,10 +669,7 @@ BOSS_API unsigned int boss_write_minimal_list (boss_db db, const char * const ou std::list messages = it->Messages(), newMessages; for (std::list::iterator messageIter = messages.begin(); messageIter != messages.end(); ++messageIter) { if (messageIter->Type() == boss_message_warn) { - const std::string content = messageIter->ChooseContent(boss::g_lang_any).Str(); - if (boost::contains(content, "Do not clean")) - newMessages.push_back(*messageIter); - else if (boost::contains(content, "Contains dirty edits")) + if (IsDirtyMessage(messageIter->ChooseContent(boss::g_lang_any).Str())) newMessages.push_back(*messageIter); } } diff --git a/src/backend/legacy-parser.h b/src/backend/legacy-parser.h index 47619dec..469266d7 100644 --- a/src/backend/legacy-parser.h +++ b/src/backend/legacy-parser.h @@ -649,10 +649,7 @@ namespace boss { opener = "\"Грязные\" правки: "; } - const boost::iterator_range ir1(content.begin(), content.end()); - const boost::iterator_range ir2(search.begin(), search.end()); - - if (boost::ifind_first(ir1, ir2)) + if (boost::icontains(content, search)) type = g_message_say; else type = g_message_warn; From 8c2b1d8bc771b6502bdd8ec38eac3d21776cee7a Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Thu, 1 Aug 2013 09:15:02 +0100 Subject: [PATCH 10/11] Removed legacy parser test from main.cpp. --- src/gui/main.cpp | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index f9de10e9..431e7b59 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -284,31 +284,6 @@ bool BossGUI::OnInit() { return false; } - //Legacy parser test. -try { - fs::path v2masterlist("../../BOSS/data/boss-skyrim/masterlist.txt"); - list plugins; - list globalMessages; - Loadv2Masterlist(v2masterlist, plugins, globalMessages); - - YAML::Emitter yout; - yout.SetIndent(2); - yout << YAML::BeginMap - << YAML::Key << "globals" << YAML::Value << globalMessages - << YAML::Key << "plugins" << YAML::Value << plugins - << YAML::EndMap; - - boss::ofstream out(_game.MasterlistPath()); - out << yout.c_str(); - out.close(); - - for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { - it->EvalAllConditions(_game, boss::g_lang_any); - } -} catch (boss::error& e) { - BOOST_LOG_TRIVIAL(error) << "Error using legacy parser: " << e.what(); -} - //Create launcher window. BOOST_LOG_TRIVIAL(debug) << "Opening the main BOSS window."; Launcher * launcher = new Launcher(wxT("BOSS"), _settings, _game, _games); From 90172820ce102c959688a53bc1f48dc52f0ab719 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Thu, 1 Aug 2013 09:19:17 +0100 Subject: [PATCH 11/11] Forgot to remove header include. --- src/gui/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 431e7b59..b333fbe5 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -33,7 +33,6 @@ #include "../backend/generators.h" #include "../backend/network.h" #include "../backend/streams.h" -#include "../backend/legacy-parser.h" #include #include