/* 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 #include #include #include class codecvt : public std::codecvt { public: enum Encoding { None, UTF8, ANSI }; #ifdef CMAKE_BUILD_WITH_CMAKE codecvt(Encoding e); protected: ~codecvt() CM_OVERRIDE; bool do_always_noconv() const throw() CM_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 CM_OVERRIDE; result do_unshift(mbstate_t& state, char* to, char*, char*& to_next) const CM_OVERRIDE; int do_max_length() const throw() CM_OVERRIDE; int do_encoding() const throw() CM_OVERRIDE; private: typedef struct { bool used; unsigned char totalBytes; unsigned char bytesLeft; char bytes[4]; } State; unsigned int findStateId() const; bool m_noconv; mutable std::vector m_states; mutable unsigned int m_lastState; #if defined(_WIN32) unsigned int m_codepage; #endif #endif }; #endif