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.
| 2112 | // |
| 2113 | // Convert a utf-8 file to utf-16. |
| 2114 | size_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: |
nothing calls this directly
no outgoing calls
no test coverage detected