123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #ifndef cm_codecvt_hxx
- #define cm_codecvt_hxx
- #include "cmConfigure.h" // IWYU pragma: keep
- #include <locale>
- #include <wchar.h>
- class codecvt : public std::codecvt<char, char, mbstate_t>
- {
- public:
- enum Encoding
- {
- None,
- UTF8,
- ANSI
- };
- #ifdef CMAKE_BUILD_WITH_CMAKE
- codecvt(Encoding e);
- protected:
- ~codecvt() override;
- bool do_always_noconv() const throw() override;
- result do_out(mbstate_t& state, const char* from, const char* from_end,
- const char*& from_next, char* to, char* to_end,
- char*& to_next) const override;
- result do_unshift(mbstate_t& state, char* to, char*,
- char*& to_next) const override;
- int do_max_length() const throw() override;
- int do_encoding() const throw() override;
- private:
- // The mbstate_t argument to do_out and do_unshift is responsible
- // for storing state between calls. We cannot control the type
- // since we want to imbue on standard streams. However, we do
- // know that it is a trivial type. Define our own type to overlay
- // on it safely with no alignment requirements.
- struct State
- {
- // Buffer bytes we have consumed from a partial codepoint.
- char partial[3];
- // Number of bytes we have buffered from a partial codepoint.
- unsigned char buffered : 4;
- // Size of the current codepoint in bytes.
- unsigned char size : 4;
- };
- bool m_noconv;
- #if defined(_WIN32)
- unsigned int m_codepage;
- result Decode(mbstate_t& state, int need, const char*& from_next,
- char*& to_next, char* to_end) const;
- result DecodePartial(mbstate_t& state, char*& to_next, char* to_end) const;
- void BufferPartial(mbstate_t& state, int need, const char*& from_next) const;
- #endif
- #endif
- };
- #endif
|