summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--slicer/slicer/parser.cpp22
-rw-r--r--slicer/slicer/parser.h5
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);