1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
5 #include "cmConfigure.h" // IWYU pragma: keep
10 class codecvt : public std::codecvt<char, char, mbstate_t>
21 #ifndef CMAKE_BOOTSTRAP
27 bool do_always_noconv() const noexcept override;
28 result do_out(mbstate_t& state, const char* from, const char* from_end,
29 const char*& from_next, char* to, char* to_end,
30 char*& to_next) const override;
31 result do_unshift(mbstate_t& state, char* to, char*,
32 char*& to_next) const override;
33 int do_max_length() const noexcept override;
34 int do_encoding() const noexcept override;
37 // The mbstate_t argument to do_out and do_unshift is responsible
38 // for storing state between calls. We cannot control the type
39 // since we want to imbue on standard streams. However, we do
40 // know that it is a trivial type. Define our own type to overlay
41 // on it safely with no alignment requirements.
44 // Buffer bytes we have consumed from a partial codepoint.
47 // Number of bytes we have buffered from a partial codepoint.
48 unsigned char buffered : 4;
50 // Size of the current codepoint in bytes.
51 unsigned char size : 4;
56 unsigned int m_codepage;
57 result Decode(mbstate_t& state, int need, const char*& from_next,
58 char*& to_next, char* to_end) const;
59 result DecodePartial(mbstate_t& state, char*& to_next, char* to_end) const;
60 void BufferPartial(mbstate_t& state, int need, const char*& from_next) const;