MCPcopy Create free account
hub / github.com/dirkvranckaert/AndroidDecompiler / Utf8ToUtf16

Method Utf8ToUtf16

astyle/src/astyle_main.cpp:2114–2198  ·  view source on GitHub ↗

Adapted from SciTE Utf8_16.cxx. Copyright (C) 2002 Scott Kirkwood. Modified for Artistic Style by Jim Pattee. Convert a utf-8 file to utf-16.

Source from the content-addressed store, hash-verified

2112//
2113// Convert a utf-8 file to utf-16.
2114size_t ASConsole::Utf8ToUtf16(char* utf8In, size_t inLen, FileEncoding encoding, char* utf16Out) const
2115{
2116 typedef unsigned short utf16; // 16 bits
2117 typedef unsigned char ubyte; // 8 bits
2118 enum { SURROGATE_LEAD_FIRST = 0xD800 };
2119 enum { SURROGATE_LEAD_LAST = 0xDBFF };
2120 enum { SURROGATE_TRAIL_FIRST = 0xDC00 };
2121 enum { SURROGATE_TRAIL_LAST = 0xDFFF };
2122 enum { SURROGATE_FIRST_VALUE = 0x10000 };
2123 enum eState { eStart, eSecondOf4Bytes, ePenultimate, eFinal };
2124
2125 int nCur = 0;
2126 ubyte* pRead = reinterpret_cast<ubyte*>(utf8In);
2127 utf16* pCur = reinterpret_cast<utf16*>(utf16Out);
2128 const ubyte* pEnd = pRead + inLen;
2129 const utf16* pCurStart = pCur;
2130 eState eState = eStart;
2131
2132 // the BOM will automatically be converted to utf-16
2133 while (pRead < pEnd)
2134 {
2135 switch (eState)
2136 {
2137 case eStart:
2138 if ((0xF0 & *pRead) == 0xF0)
2139 {
2140 nCur = (0x7 & *pRead) << 18;
2141 eState = eSecondOf4Bytes;
2142 }
2143 else if ((0xE0 & *pRead) == 0xE0)
2144 {
2145 nCur = (~0xE0 & *pRead) << 12;
2146 eState = ePenultimate;
2147 }
2148 else if ((0xC0 & *pRead) == 0xC0)
2149 {
2150 nCur = (~0xC0 & *pRead) << 6;
2151 eState = eFinal;
2152 }
2153 else
2154 {
2155 nCur = *pRead;
2156 eState = eStart;
2157 }
2158 break;
2159 case eSecondOf4Bytes:
2160 nCur |= (0x3F & *pRead) << 12;
2161 eState = ePenultimate;
2162 break;
2163 case ePenultimate:
2164 nCur |= (0x3F & *pRead) << 6;
2165 eState = eFinal;
2166 break;
2167 case eFinal:
2168 nCur |= (0x3F & *pRead);
2169 eState = eStart;
2170 break;
2171 default:

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected