19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <objmng/drm_i18n.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_GB2312_HIGH_BYTE(c) ((c) >= 0xA1 && (c) <= 0xF7) 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_GB2312_LOW_BYTE(c) ((c) >= 0xA1 && (c) <= 0xFE) 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_GBK_HIGH_BYTE(c) ((c) >= 0x81 && (c) <= 0xFE) 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_GBK_LOW_BYTE(c) ((c) >= 0x40 && (c) <= 0xFE && (c) != 0x7F) 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_BIG5_HIGH_BYTE(c) ((c) >= 0xA1 && (c) <= 0xF9) 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_BIG5_LOW_BYTE(c) (((c) >= 0x40 && (c) <= 0x7E) \ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || ((c) >= 0xA1 && (c) <= 0xFE)) 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IS_ASCII(c) ((c) <= 127) 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define INVALID_UNICODE 0xFFFD 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define I18N_LATIN1_SUPPORT 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define I18N_UTF8_UTF16_SUPPORT 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Simply convert ISO 8859-1 (latin1) to unicode 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t latin1ToWcs(const uint8_t *mbs, int32_t mbsLen, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert one unicode char to ISO 8859-1 (latin1) byte 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t wcToLatin1(uint16_t wc, uint8_t * mbs, int32_t bufSize); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert UTF-8 to unicode 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t utf8ToWcs(const uint8_t *mbs, int32_t mbsLen, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert one unicode char to UTF-8 bytes 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t wcToUtf8(uint16_t wc, uint8_t * mbs, int32_t bufSize); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert UTF-16 BE to unicode 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t utf16beToWcs(const uint8_t *mbs, int32_t mbsLen, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert one unicode char to UTF-16 BE bytes 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t wcToUtf16be(uint16_t wc, uint8_t * mbs, int32_t bufSize); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert UTF-16 LE to unicode 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t utf16leToWcs(const uint8_t *mbs, int32_t mbsLen, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert one unicode char to UTF-16 LE bytes 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t wcToUtf16le(uint16_t wc, uint8_t * mbs, int32_t bufSize); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * see drm_i18n.h 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t DRM_i18n_mbsToWcs(DRM_Charset_t charset, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint8_t *mbs, int32_t mbsLen, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (charset) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_GB2312_SUPPORT 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_GB2312: 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gb2312ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_GBK_SUPPORT 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_GBK: 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gbkToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_BIG5_SUPPORT 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_BIG5: 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return big5ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_LATIN1_SUPPORT 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN1: 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return latin1ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_ISO8859X_SUPPORT 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN2: 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN3: 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN4: 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_CYRILLIC: 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_ARABIC: 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_GREEK: 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_HEBREW: 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN5: 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN6: 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_THAI: 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN7: 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN8: 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN9: 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN10: 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return iso8859xToWcs(charset, mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_UTF8_UTF16_SUPPORT 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF8: 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return utf8ToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF16BE: 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return utf16beToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF16LE: 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return utf16leToWcs(mbs, mbsLen, wcsBuf, bufSizeInWideChar, bytesConsumed); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * see drm_i18n.h 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t DRM_i18n_wcsToMbs(DRM_Charset_t charset, 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint16_t *wcs, int32_t wcsLen, 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *mbsBuf, int32_t bufSizeInByte) 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t (* wcToMbFunc)(uint16_t, uint8_t *, int32_t); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t charIndex = 0; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t numMultiBytes = 0; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (charset) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_LATIN1_SUPPORT 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN1: 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wcToMbFunc = wcToLatin1; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_UTF8_UTF16_SUPPORT 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF8: 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wcToMbFunc = wcToUtf8; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF16BE: 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wcToMbFunc = wcToUtf16be; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_UTF16LE: 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wcToMbFunc = wcToUtf16le; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_ISO8859X_SUPPORT 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN2: 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN3: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN4: 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_CYRILLIC: 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_ARABIC: 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_GREEK: 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_HEBREW: 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN5: 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN6: 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_THAI: 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN7: 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN8: 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN9: 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DRM_CHARSET_LATIN10: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wcsToIso8859x(charset, wcs, wcsLen, mbsBuf, bufSizeInByte); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbsBuf) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (numMultiBytes < bufSizeInByte && charIndex < wcsLen) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values here */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mbLen = wcToMbFunc(wcs[charIndex], 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &mbsBuf[numMultiBytes], bufSizeInByte - numMultiBytes); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numMultiBytes + mbLen > bufSizeInByte) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Insufficient buffer. Don't update numMultiBytes */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project charIndex++; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numMultiBytes += mbLen; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (charIndex < wcsLen) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values here */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numMultiBytes += wcToMbFunc(wcs[charIndex], NULL, 0); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project charIndex++; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numMultiBytes; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_LATIN1_SUPPORT 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t latin1ToWcs(const uint8_t *mbs, int32_t mbsLen, 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed) 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t charsToConvert; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wcsBuf == NULL) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mbsLen; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = charsToConvert = mbsLen > bufSizeInWideChar ? bufSizeInWideChar : mbsLen; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len < 0) 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (len--) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wcsBuf++ = *mbs++; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bytesConsumed) 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *bytesConsumed = charsToConvert; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return charsToConvert; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t wcToLatin1(uint16_t wc, uint8_t * mbs, int32_t bufSize) 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t ch; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wc < 0x100) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ch = (uint8_t)(wc & 0xff); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ch = '?'; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && bufSize > 0) 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = ch; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* I18N_LATIN1_SUPPORT */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef I18N_UTF8_UTF16_SUPPORT 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t utf8ToWcs(const uint8_t *mbs, int32_t mbsLen, 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed) 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t charsConverted = 0; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i = 0; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t wideChar; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wcsBuf == NULL) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* No conversion but we're still going to calculate bytesConsumed */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bufSizeInWideChar = mbsLen * 2; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while((i < mbsLen) && (charsConverted < bufSizeInWideChar)) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t ch = mbs[i]; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t ch2, ch3, ch4; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = -1; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(IS_ASCII(ch)) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = ch; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((ch & 0xc0) == 0xc0) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int utfStart = i; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((ch & 0xe0) == 0xc0) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2 byte sequence */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i + 1 < mbsLen && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = (uint16_t)(((ch & 0x1F) << 6) | (ch2 & 0x3F)); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i += 2; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* skip incomplete sequence */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((ch & 0xf0) == 0xe0) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3 byte sequence */ 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i + 2 < mbsLen 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((ch3 = mbs[i + 2]) & 0xc0) == 0x80) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = (uint16_t)(((ch & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F)); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i += 3; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* skip incomplete sequence (up to 2 bytes) */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < mbsLen && (mbs[i] & 0xc0) == 0x80) 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((ch & 0xf8) == 0xf0) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4 byte sequence */ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i + 3 < mbsLen 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((ch2 = mbs[i + 1]) & 0xc0) == 0x80 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((ch3 = mbs[i + 2]) & 0xc0) == 0x80 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((ch4 = mbs[i + 3]) & 0xc0) == 0x80) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* FIXME: we do NOT support U+10000 - U+10FFFF for now. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * leave it as 0xFFFD. */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = INVALID_UNICODE; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i += 4; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* skip incomplete sequence (up to 3 bytes) */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < mbsLen && (mbs[i] & 0xc0) == 0x80) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < mbsLen && (mbs[i] & 0xc0) == 0x80) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* invalid */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= mbsLen && wideChar == -1) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Possible incomplete UTF-8 sequence at the end of mbs. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Leave it to the caller. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = utfStart; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* invalid */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(wcsBuf) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wideChar == -1) 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wideChar = INVALID_UNICODE; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wcsBuf[charsConverted] = (uint16_t)wideChar; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project charsConverted++; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bytesConsumed) 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *bytesConsumed = i; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return charsConverted; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t wcToUtf8(uint16_t wc, uint8_t * mbs, int32_t bufSize) 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wc <= 0x7f) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && (bufSize >= 1)) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = (uint8_t)wc; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (wc <= 0x7ff) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && (bufSize >= 2)) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs++ = (uint8_t)((wc >> 6) | 0xc0); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = (uint8_t)((wc & 0x3f) | 0x80); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 2; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && (bufSize >= 3)) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs++ = (uint8_t)((wc >> 12) | 0xe0); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs++ = (uint8_t)(((wc >> 6) & 0x3f)| 0x80); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = (uint8_t)((wc & 0x3f) | 0x80); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 3; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t utf16beToWcs(const uint8_t *mbs, int32_t mbsLen, 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed) 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t charsToConvert; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wcsBuf == NULL) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mbsLen / 2; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = charsToConvert = (mbsLen / 2) > bufSizeInWideChar ? bufSizeInWideChar : (mbsLen / 2); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (len--) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values */ 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wcsBuf++ = (uint16_t)((*mbs << 8) | *(mbs + 1)); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mbs += 2; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bytesConsumed) 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *bytesConsumed = charsToConvert * 2; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return charsToConvert; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t wcToUtf16be(uint16_t wc, uint8_t * mbs, int32_t bufSize) 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && bufSize >= 2) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = (uint8_t)(wc >> 8); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *(mbs + 1) = (uint8_t)(wc & 0xff); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 2; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t utf16leToWcs(const uint8_t *mbs, int32_t mbsLen, 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *wcsBuf, int32_t bufSizeInWideChar, 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t *bytesConsumed) 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t charsToConvert; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wcsBuf == NULL) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mbsLen / 2; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project len = charsToConvert = (mbsLen / 2) > bufSizeInWideChar ? bufSizeInWideChar : (mbsLen / 2); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (len--) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *wcsBuf++ = (uint16_t)(*mbs | (*(mbs + 1) << 8)); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mbs += 2; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bytesConsumed) 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *bytesConsumed = charsToConvert * 2; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return charsToConvert; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t wcToUtf16le(uint16_t wc, uint8_t * mbs, int32_t bufSize) 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mbs && bufSize >= 2) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* TODO: handle surrogate pair values */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mbs = (uint8_t)(wc & 0xff); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *(mbs + 1) = (uint8_t)(wc >> 8); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 2; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* I18N_UTF8_UTF16_SUPPORT */ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 445