diff options
author | Hugo Sales <hdcs333@gmail.com> | 2019-07-21 21:46:58 +0300 |
---|---|---|
committer | Hugo Sales <hdcs333@gmail.com> | 2019-07-21 21:46:58 +0300 |
commit | b3fbc7f1915195c61c36cfcdd7c2419c14d52fa7 (patch) | |
tree | c1dfd1121c058d9bce7c5ea5c7e53f892fdb7cc0 | |
parent | e42a7de76720722014cce359ccbb98293e9521e6 (diff) |
[Fast import/export] Fixed segfault on some filessoc-2019-fast-io
-rw-r--r-- | source/blender/editors/io/intern/obj_import.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/source/blender/editors/io/intern/obj_import.cpp b/source/blender/editors/io/intern/obj_import.cpp index f8836f6bd09..90a10eaae2e 100644 --- a/source/blender/editors/io/intern/obj_import.cpp +++ b/source/blender/editors/io/intern/obj_import.cpp @@ -69,19 +69,15 @@ extern "C" { #include "common.hpp" #include "iterators.hpp" -// struct float3 { -// float x, y, z; -// }; -// BOOST_FUSION_ADAPT_STRUCT(float3, (float, x)(float, y)(float, z)) - BOOST_FUSION_DEFINE_STRUCT((), obj_face, (int, vx)(int, uv)(int, no)) BOOST_FUSION_DEFINE_STRUCT((), float3, (float, x)(float, y)(float, z)) BOOST_FUSION_DEFINE_STRUCT((), float2, (float, u)(float, v)) namespace { -namespace qi = boost::spirit::qi; namespace ph = boost::phoenix; + +namespace qi = boost::spirit::qi; template<typename Result> using rule = qi::rule<const char *, Result>; template<typename Inner> using vec = std::vector<Inner>; @@ -147,18 +143,21 @@ void OBJ_import_start(bContext *C, ImportSettings *const settings) OBJImport import{settings}; boost::iostreams::mapped_file mmap(settings->filepath, boost::iostreams::mapped_file::readonly); - const char *const start = mmap.const_data(); - const char *const last = start + mmap.size() - 1; - const char *first = start; + const char *const begin = mmap.const_data(); + const char *const end = begin + mmap.size() - 1; + const char *curr = begin; /* clang-format off */ + using ign = qi::unused_type; + // Components - auto token = qi::lexeme[+(qi::graph)]; - auto rest = qi::omit[*(qi::char_ - qi::eol)] >> qi::eol; - auto comment = qi::lit("#") >> rest; - rule<float3()> rule3f = qi::float_ >> qi::float_ >> qi::float_; - rule<float2()> rule2f = qi::float_ >> qi::float_; + rule<ign()> rest = *qi::omit[qi::char_ - qi::eol]; + rule<ign()> comment = '#' >> rest; + rule<str()> token = qi::lexeme[+(qi::graph)]; + rule<float()> rulef = qi::float_ | qi::as<float>()[qi::int_]; + rule<float2()> rule2f = rulef >> rulef; + rule<float3()> rule3f = qi::float_ >> qi::float_ >> qi::float_; //rulef >> rulef >> rulef; rule<obj_face> rule_obj_face = qi::int_ >> -('/' >> -qi::int_) >> -('/' >> qi::int_); rule<int()> on_off = qi::lit("off")[qi::_val = 0] | qi::lit("on")[qi::_val = 1] | @@ -193,8 +192,9 @@ void OBJ_import_start(bContext *C, ImportSettings *const settings) #undef BIND /* clang-format on */ - if (!result || first != last) { - std::cerr << "Couldn't parse near: " << first; + if (!result || curr != end) { + std::cerr << "Couldn't parse near: " << curr; + return; } if (import.meshes.size() >= 2) { |