diff options
Diffstat (limited to 'src/boosty.h')
-rw-r--r-- | src/boosty.h | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/src/boosty.h b/src/boosty.h index 6ec417a..82c765b 100644 --- a/src/boosty.h +++ b/src/boosty.h @@ -10,9 +10,8 @@ versions of boost found on popular versions of linux, circa early 2012. design - hope that the user is compiling with boost>1.46 + filesystem v3 - if not, fall back to older deprecated functions, and rely on - testing to find bugs. implement the minimum needed by OpenSCAD and no more. + the boost filsystem changed around 1.46-1.48. we do a large #ifdef + based on boost version that wraps various functions appropriately. in a few years, this file should be deleted as unnecessary. see also @@ -27,7 +26,9 @@ #include <string> #include <boost/version.hpp> #include <boost/filesystem.hpp> +#include <boost/algorithm/string.hpp> namespace fs = boost::filesystem; +#include "printutils.h" namespace boosty { @@ -77,6 +78,67 @@ inline std::string extension_str( fs::path p) #endif + + + + +#if BOOST_VERSION >= 104800 + +inline fs::path canonical( fs::path p, fs::path p2 ) +{ + return fs::canonical( p, p2 ); +} + +inline fs::path canonical( fs::path p ) +{ + return fs::canonical( p ); +} + +#else + +inline fs::path canonical( fs::path p, fs::path p2 ) +{ +#if defined (__WIN32__) || defined(__APPLE__) +#error you should be using a newer version of boost on win/mac +#endif + // based on the code in boost + fs::path result; + if (p=="") p=p2; + std::string result_s; + std::vector<std::string> resultv, pieces; + std::vector<std::string>::iterator pi; + std::string tmps = boosty::stringy( p ); + boost::split( pieces, tmps, boost::is_any_of("/") ); + for ( pi = pieces.begin(); pi != pieces.end(); ++pi ) + { + if (*pi == "..") + resultv.erase( resultv.end() ); + else + resultv.push_back( *pi ); + } + for ( pi = resultv.begin(); pi != resultv.end(); ++pi ) + { + if ((*pi).length()>0) result_s = result_s + "/" + *pi; + } + result = fs::path( result_s ); + if (fs::is_symlink(result)) + { + PRINT("WARNING: canonical() wrapper can't do symlinks. rebuild openscad with boost >=1.48"); + PRINT("WARNING: or don't use symbolic links"); + } + return result; +} + +inline fs::path canonical( fs::path p ) +{ + return canonical( p, fs::current_path() ); +} + +#endif + + + + } // namespace #endif |