From 43f4e9b30bbb485c3a074c02e028323c22405649 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 22 Jun 2023 12:15:10 +0200 Subject: [PATCH] Improved version extraction from clang_getClangVersion() --- src/compile_commands.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/compile_commands.cpp b/src/compile_commands.cpp index da5d565..fbefc41 100644 --- a/src/compile_commands.cpp +++ b/src/compile_commands.cpp @@ -84,21 +84,23 @@ std::vector CompileCommands::get_arguments(const boost::filesystem: } } - static auto resource_path = []() -> std::string { + static std::string resource_path = []() -> std::string { // Try based on clang_getClangVersion first, even though its format is not guaranteed to be stable. auto clang_version = clangmm::to_string(clang_getClangVersion()); - std::string version; - for(auto it = clang_version.rbegin(); it != clang_version.rend() && ((*it >= '0' && *it <= '9') || *it == '.'); ++it) - version.insert(version.begin(), *it); - while(!version.empty() && version.front() != '.' && version.back() != '.') { - auto path = boost::filesystem::path(LIBCLANG_LIBRARY_DIR) / "clang" / version; - boost::system::error_code ec; - if(boost::filesystem::is_directory(path / "include", ec)) - return path.string(); - auto pos = version.rfind('.'); - if(pos == std::string::npos) - break; - version.erase(pos); + std::regex clang_version_regex("([0-9]+\\.[0-9]+\\.[0-9]+)"); + std::smatch sm; + if(std::regex_search(clang_version, sm, clang_version_regex)) { + auto version = sm[1].str(); + while(!version.empty() && version.front() != '.' && version.back() != '.') { + auto path = boost::filesystem::path(LIBCLANG_LIBRARY_DIR) / "clang" / version; + boost::system::error_code ec; + if(boost::filesystem::is_directory(path / "include", ec)) + return path.string(); + auto pos = version.rfind('.'); + if(pos == std::string::npos) + break; + version.erase(pos); + } } boost::system::error_code ec;