diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-08-08 16:14:50 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-08-08 16:15:07 +0100 |
commit | bdb5c897087d3588f456c020b3633cbd694003da (patch) | |
tree | ef09420dad64a438e097645850b8596eebe28a97 /lib/output | |
parent | Simplify some bits with concepts (diff) | |
download | mygrate-bdb5c897087d3588f456c020b3633cbd694003da.tar.bz2 mygrate-bdb5c897087d3588f456c020b3633cbd694003da.tar.xz mygrate-bdb5c897087d3588f456c020b3633cbd694003da.zip |
Tests, fixes, improvements to WritePqCopyStream
Diffstat (limited to 'lib/output')
-rw-r--r-- | lib/output/pq/writePqCopyStrm.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/output/pq/writePqCopyStrm.cpp b/lib/output/pq/writePqCopyStrm.cpp index dd402e7..4664e6b 100644 --- a/lib/output/pq/writePqCopyStrm.cpp +++ b/lib/output/pq/writePqCopyStrm.cpp @@ -59,7 +59,7 @@ namespace MyGrate::Output::Pq { fwrite(pos, esc - pos, 1, out); pos = esc; } - while (pos != v.end()) { + while (pos != v.end() && std::iscntrl(*pos)) { fprintf(out, "\\%03o", *pos); pos++; } @@ -74,9 +74,17 @@ namespace MyGrate::Output::Pq { void WritePqCopyStream::operator()(Blob v) const { + static constexpr const auto hex {[] { + std::array<std::array<char, 2>, 256> h {}; + std::array<char, 16> hc {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + for (int x {}; x < 256; x += 1) { + h[x] = {hc[x >> 4], hc[x & 0xF]}; + } + return h; + }()}; fputs("\\\\x", out); std::for_each(v.begin(), v.end(), [this](auto b) { - fprintf(out, "%02hhx", (uint8_t)b); + fwrite(hex[(uint8_t)b].data(), 2, 1, out); }); } } |