#pragma once #include #include // #include #include #include #include "file.h" inline std::string klammertext_home_var = "KLAMMERTEXT_HOME"; class Locator { public: explicit Locator(const std::source_location location = std::source_location::current()) // std::source_location::file_name() can return nullptr on some // toolchains (e.g. Homebrew GCC on macOS); guard against // fs::path(nullptr) -> strlen(NULL). : m_filename(location.file_name() ? fs::absolute(location.file_name()) : fs::path{}) , m_line(int(location.line())) , m_chr(int(location.column())) {}; Locator(fs::path filename, int line, int chr); std::string str(bool relative = false) const; std::string desc(bool relative = false) const; std::string abbrev(bool include_chr=true) const; std::string m_filename {}; int m_line; int m_chr; //std::string m_desc {}; }; std::ostream &nformat(std::ostream &os); std::string locator_range( const Locator& start_loc, const Locator& end_loc, std::map& relpath); Locator current_locator( const std::source_location location = std::source_location::current()); std::string locator_summary(std::vector locators); inline std::string showloc(Locator loc=Locator()) { return loc.abbrev(false) + " "; }