From 5ec2efb68677ccb5fd91c295cf6ae6039652ac73 Mon Sep 17 00:00:00 2001 From: Rebecca Turner Date: Fri, 22 Mar 2024 16:41:42 -0700 Subject: Move `DebugChar` into its own file Change-Id: Ia40549e5d0b78ece8dd0722c3a5a032b9915f24b --- src/libutil/escape-char.cc | 22 ++++++++++++++++++++++ src/libutil/escape-char.hh | 22 ++++++++++++++++++++++ src/libutil/meson.build | 2 ++ 3 files changed, 46 insertions(+) create mode 100644 src/libutil/escape-char.cc create mode 100644 src/libutil/escape-char.hh (limited to 'src/libutil') diff --git a/src/libutil/escape-char.cc b/src/libutil/escape-char.cc new file mode 100644 index 000000000..132260286 --- /dev/null +++ b/src/libutil/escape-char.cc @@ -0,0 +1,22 @@ +#include +#include +#include + +#include "escape-char.hh" + +namespace nix { + +std::ostream & operator<<(std::ostream & s, MaybeHexEscapedChar c) +{ + boost::io::ios_flags_saver _ifs(s); + + if (isprint(c.c)) { + s << static_cast(c.c); + } else { + s << "\\x" << std::hex << std::setfill('0') << std::setw(2) + << (static_cast(c.c) & 0xff); + } + return s; +} + +} // namespace nix diff --git a/src/libutil/escape-char.hh b/src/libutil/escape-char.hh new file mode 100644 index 000000000..c7bae7ec0 --- /dev/null +++ b/src/libutil/escape-char.hh @@ -0,0 +1,22 @@ +#pragma once +#include + +namespace nix { + +/** + * A struct that prints a debug representation of a character, like `\x1f` for + * non-printable characters, or the character itself for other characters. + * + * Note that these are suitable for human readable output, but further care is + * necessary to include them in C++ strings to avoid running into adjacent + * hex-like characters. (`"puppy\x1bdoggy"` parses as `"puppy" "\x1bd" "oggy"` + * and errors because 0x1bd is too big for a `char`.) + */ +struct MaybeHexEscapedChar +{ + char c; +}; + +std::ostream & operator<<(std::ostream & s, MaybeHexEscapedChar c); + +} // namespace nix diff --git a/src/libutil/meson.build b/src/libutil/meson.build index 8e4b5211d..cdfda3cf5 100644 --- a/src/libutil/meson.build +++ b/src/libutil/meson.build @@ -8,6 +8,7 @@ libutil_sources = files( 'config.cc', 'english.cc', 'error.cc', + 'escape-char.cc', 'exit.cc', 'experimental-features.cc', 'filesystem.cc', @@ -49,6 +50,7 @@ libutil_headers = files( 'config.hh', 'english.hh', 'error.hh', + 'escape-char.hh', 'exit.hh', 'experimental-features.hh', 'experimental-features-json.hh', -- cgit v1.2.3