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