diff options
-rw-r--r-- | slicer/slicer/parser.cpp | 22 | ||||
-rw-r--r-- | slicer/slicer/parser.h | 5 |
2 files changed, 21 insertions, 6 deletions
diff --git a/slicer/slicer/parser.cpp b/slicer/slicer/parser.cpp index 607ff36..ab0bc88 100644 --- a/slicer/slicer/parser.cpp +++ b/slicer/slicer/parser.cpp @@ -5,11 +5,13 @@ #include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/trim.hpp> +#include <boost/algorithm/string/split.hpp> #include <Slice/CPlusPlusUtil.h> #include <boost/shared_ptr.hpp> #include <boost/filesystem/convenience.hpp> #include <mutex> #include <fprintbf.h> +#include <safeMapFind.h> namespace fs = boost::filesystem; @@ -527,13 +529,13 @@ namespace Slicer { auto conversions = metaDataValues("slicer:conversion:", dm); for (const auto & conversion : conversions) { auto split = metaDataSplit(conversion); - if (split.size() != 3) { - throw std::runtime_error("conversion needs 3 parts type:toModelFunc:toExchangeFunc"); + if (split.size() < 3) { + throw std::runtime_error("conversion needs at least 3 parts type:toModelFunc:toExchangeFunc[:options]"); } - for (auto & p : split) { - boost::algorithm::replace_all(p, ".", "::"); + for (auto & pi : {0, 1, 2}) { + boost::algorithm::replace_all(split[pi], ".", "::"); } - rtn.push_back(ConversionSpec({split[0], split[1], split[2]})); + rtn.push_back(split); } return rtn; } @@ -597,5 +599,15 @@ namespace Slicer { return s.Components(); } + + Slicer::ConversionSpec::ConversionSpec(const Slicer::Args & s) : + ExchangeType(s[0]), + ConvertToModelFunc(s[1]), + ConvertToExchangeFunc(s[2]) + { + if (s.size() >= 4) { + boost::algorithm::split(Options, s[3], boost::algorithm::is_any_of(","), boost::algorithm::token_compress_off); + } + } }; diff --git a/slicer/slicer/parser.h b/slicer/slicer/parser.h index 744ffa7..322476f 100644 --- a/slicer/slicer/parser.h +++ b/slicer/slicer/parser.h @@ -11,14 +11,17 @@ namespace Slicer { class DLL_PUBLIC Slicer : public Slice::ParserVisitor { public: + typedef std::vector<std::string> Args; class ConversionSpec { public: + ConversionSpec(const Args &); + std::string ExchangeType; std::string ConvertToModelFunc; std::string ConvertToExchangeFunc; + Args Options; }; typedef std::vector<ConversionSpec> Conversions; - typedef std::vector<std::string> Args; Slicer(FILE * c); |