Assembled from klammertext-dev f344a37d772c. The commands, the library,
the Standard Klammer Set, the reflection klammerset and the Python
binding build and run natively on Windows (MSYS2 UCRT64 gcc, python.org
Python), and both test tiers pass there. doc/install/windows_source_install.md
is the fifth install guide: a source install parallel to the Linux and
macOS ones, verified by following it on a pristine Windows 11.
Behaviour on every system: paths Klammertext prints use forward slashes;
output is LF; the command line is UTF-8 on Windows; @eval :shell is a
POSIX shell command everywhere -- on Windows it runs the sh Klammertext
ships, BusyBox for Windows (win/busybox/, GPLv2, with its licence and the
source pointer). KLAMMERTEXT_FONTS and KLAMMERTEXT_KLAMMERSETS are lists in
the system's PATH convention (';' on Windows). On Linux and macOS nothing
observable changes.
68 lines
2.5 KiB
C++
68 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
// #include <filesystem>
|
|
#include <source_location>
|
|
#include <map>
|
|
|
|
#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()).generic_string() : std::string{})
|
|
, m_line(int(location.line()))
|
|
, m_chr(int(location.column()))
|
|
{};
|
|
Locator(const fs::path& filename, int line, int chr);
|
|
// "No location": for errors with no document position -- command-line
|
|
// argument errors, lookups made on the command's behalf. NOT the same
|
|
// as Locator(): the default constructor captures the C++ CALL SITE via
|
|
// std::source_location (and a defaulted Locator parameter captures the
|
|
// CALLER), which is what leaked "argv.cpp, line 597" into user-facing
|
|
// errors (found by the error gallery, 2026-08-22). Locator() is for
|
|
// logging; errors either carry a real document location or this.
|
|
static Locator none() { return Locator(fs::path{}, -1, -1); }
|
|
// The inverse of str(): "[<file>:<line>.<column>]" back to a Locator.
|
|
// A klammer implementation receives its position as the STATE value
|
|
// K_loc, which is that string; without this it can only pass a
|
|
// default-constructed Locator, which captures the C++ source location
|
|
// and prints a file no user can act on. Anything unparseable gives
|
|
// none() -- a missing location beats a wrong one.
|
|
static Locator from_string(const std::string& s);
|
|
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<std::string, std::string>& relpath);
|
|
|
|
Locator current_locator(
|
|
const std::source_location location = std::source_location::current());
|
|
|
|
std::string locator_summary(std::vector<Locator> locators);
|
|
|
|
inline
|
|
std::string showloc(Locator loc=Locator()) {
|
|
return loc.abbrev(false) + " ";
|
|
}
|
|
|