summaryrefslogtreecommitdiffstats
path: root/Source/cm_codecvt.hxx
diff options
context:
space:
mode:
authorDāvis Mosāns <davispuh@gmail.com>2016-10-05 12:56:52 (GMT)
committerBrad King <brad.king@kitware.com>2016-10-06 14:55:59 (GMT)
commitbb1d3370cedceec48c82a523cf35df2207c7db17 (patch)
treea546594957a9d4dce4f22636cb92da48f74ad2b2 /Source/cm_codecvt.hxx
parentaa57f35ff539a1d43d93e373048f70ce7fd04852 (diff)
downloadCMake-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.hxx57
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