diff options
author | Dāvis Mosāns <davispuh@gmail.com> | 2016-10-05 12:56:52 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-10-06 14:55:59 (GMT) |
commit | bb1d3370cedceec48c82a523cf35df2207c7db17 (patch) | |
tree | a546594957a9d4dce4f22636cb92da48f74ad2b2 /Source/cm_codecvt.hxx | |
parent | aa57f35ff539a1d43d93e373048f70ce7fd04852 (diff) | |
download | CMake-bb1d3370cedceec48c82a523cf35df2207c7db17.zip CMake-bb1d3370cedceec48c82a523cf35df2207c7db17.tar.gz CMake-bb1d3370cedceec48c82a523cf35df2207c7db17.tar.bz2 |
codecvt: Add class for encoding conversion
Add a `codecvt` class that can be used as facet for locale so that it's
possible to convert from internal UTF-8 encoding to other encodings such
as Windows ANSI codepage.
Diffstat (limited to 'Source/cm_codecvt.hxx')
-rw-r--r-- | Source/cm_codecvt.hxx | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Source/cm_codecvt.hxx b/Source/cm_codecvt.hxx new file mode 100644 index 0000000..5f16bd8 --- /dev/null +++ b/Source/cm_codecvt.hxx @@ -0,0 +1,57 @@ +/* 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 <vector> + +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() 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<State> m_states; + mutable unsigned int m_lastState; +#if defined(_WIN32) + unsigned int m_codepage; +#endif + +#endif +}; + +#endif |