16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Copyright (C) 2005-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucsdet.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csdetect.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csmatch.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csrsbcs.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csrmbcs.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csrutf8.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csrucode.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "csr2022.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_USE
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NEW_ARRAY(type,count) (type *) uprv_malloc((count) * sizeof(type))
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELETE_ARRAY(array) uprv_free((void *) (array))
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UCharsetDetector * U_EXPORT2
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_open(UErrorCode   *status)
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharsetDetector* csd = new CharsetDetector(*status);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete csd;
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        csd = NULL;
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UCharsetDetector *) csd;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_close(UCharsetDetector *ucsd)
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharsetDetector *csd = (CharsetDetector *) ucsd;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete csd;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_setText(UCharsetDetector *ucsd, const char *textIn, int32_t len, UErrorCode *status)
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((CharsetDetector *) ucsd)->setText(textIn, len);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getName(const UCharsetMatch *ucsm, UErrorCode *status)
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetMatch *) ucsm)->getName();
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getConfidence(const UCharsetMatch *ucsm, UErrorCode *status)
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetMatch *) ucsm)->getConfidence();
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getLanguage(const UCharsetMatch *ucsm, UErrorCode *status)
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetMatch *) ucsm)->getLanguage();
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const UCharsetMatch * U_EXPORT2
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_detect(UCharsetDetector *ucsd, UErrorCode *status)
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (const UCharsetMatch *) ((CharsetDetector *) ucsd)->detect(*status);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_setDeclaredEncoding(UCharsetDetector *ucsd, const char *encoding, int32_t length, UErrorCode *status)
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((CharsetDetector *) ucsd)->setDeclaredEncoding(encoding,length);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const UCharsetMatch**
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_detectAll(UCharsetDetector *ucsd,
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 int32_t *maxMatchesFound, UErrorCode *status)
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharsetDetector *csd = (CharsetDetector *) ucsd;
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (const UCharsetMatch**)csd->detectAll(*maxMatchesFound,*status);
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// U_CAPI  const char * U_EXPORT2
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ucsdet_getDetectableCharsetName(const UCharsetDetector *csd, int32_t index, UErrorCode *status)
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// {
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     if(U_FAILURE(*status)) {
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//         return 0;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     }
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     return csd->getCharsetName(index,*status);
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// U_CAPI  int32_t U_EXPORT2
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ucsdet_getDetectableCharsetsCount(const UCharsetDetector *csd, UErrorCode *status)
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     if(U_FAILURE(*status)) {
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//         return -1;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     }
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     return UCharsetDetector::getDetectableCount();
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// }
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI  UBool U_EXPORT2
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_isInputFilterEnabled(const UCharsetDetector *ucsd)
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // todo: could use an error return...
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucsd == NULL) {
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetDetector *) ucsd)->getStripTagsFlag();
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI  UBool U_EXPORT2
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_enableInputFilter(UCharsetDetector *ucsd, UBool filter)
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // todo: could use an error return...
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucsd == NULL) {
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharsetDetector *csd = (CharsetDetector *) ucsd;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool prev = csd->getStripTagsFlag();
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    csd->setStripTagsFlag(filter);
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return prev;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI  int32_t U_EXPORT2
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getUChars(const UCharsetMatch *ucsm,
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 UChar *buf, int32_t cap, UErrorCode *status)
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetMatch *) ucsm)->getUChars(buf, cap, status);
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_setDetectableCharset(UCharsetDetector *ucsd, const char *encoding, UBool enabled, UErrorCode *status)
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((CharsetDetector *)ucsd)->setDetectableCharset(encoding, enabled, *status);
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI  UEnumeration * U_EXPORT2
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getAllDetectableCharsets(const UCharsetDetector * /*ucsd*/, UErrorCode *status)
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return CharsetDetector::getAllDetectableCharsets(*status);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_DRAFT UEnumeration * U_EXPORT2
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgucsdet_getDetectableCharsets(const UCharsetDetector *ucsd,  UErrorCode *status)
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((CharsetDetector *)ucsd)->getDetectableCharsets(*status);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
206