ustr_cnv.c revision 27f654740f2a26ad62a5c155af9199af9e69b889
10f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes/* 20f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes******************************************************************************* 30f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* 40f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* Copyright (C) 1998-2010, International Business Machines 50f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* Corporation and others. All Rights Reserved. 60f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* 70f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes******************************************************************************* 80f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* file name: ustr_cnv.c 90f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* encoding: US-ASCII 100f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* tab size: 8 (not used) 110f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* indentation:4 120f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* 130f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* created on: 2004aug24 140f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* created by: Markus W. Scherer 150f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* 160f3c55331439970e01af67f80ac117c473bc04cfElliott Hughes* Character conversion functions moved here from ustring.c 175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee*/ 185bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 190703060875166106af3d490c6c264611aea67ec8jeffhao#include "unicode/utypes.h" 205bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 215bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#if !UCONFIG_NO_CONVERSION 225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "unicode/ustring.h" 245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "unicode/ucnv.h" 255bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "cstring.h" 265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee#include "cmemory.h" 2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "umutex.h" 2857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "ustr_cnv.h" 2957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 3057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/* mutexed access to a shared default converter ----------------------------- */ 3157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeestatic UConverter *gDefaultConverter = NULL; 335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeU_CAPI UConverter* U_EXPORT2 35fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhaou_getDefaultConverter(UErrorCode *status) 365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee{ 3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers UConverter *converter = NULL; 38fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao 39fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao if (gDefaultConverter != NULL) { 40fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao umtx_lock(NULL); 41fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao 42fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao /* need to check to make sure it wasn't taken out from under us */ 43fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao if (gDefaultConverter != NULL) { 44fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao converter = gDefaultConverter; 45fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao gDefaultConverter = NULL; 46fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao } 47fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao umtx_unlock(NULL); 48fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao } 49fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao 505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee /* if the cache was empty, create a converter */ 515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(converter == NULL) { 525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee converter = ucnv_open(NULL, status); 535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(U_FAILURE(*status)) { 545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee ucnv_close(converter); 555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee converter = NULL; 56fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao } 575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 585bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 594eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao return converter; 604eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao} 614eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao 624eb68edeecc4d6641bcca2a40620631335e7cadcjeffhaoU_CAPI void U_EXPORT2 634eb68edeecc4d6641bcca2a40620631335e7cadcjeffhaou_releaseDefaultConverter(UConverter *converter) 644eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao{ 654eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao if(gDefaultConverter == NULL) { 664eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao if (converter != NULL) { 674eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao ucnv_reset(converter); 68fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao } 69fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao umtx_lock(NULL); 705bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 715bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(gDefaultConverter == NULL) { 725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee gDefaultConverter = converter; 73fc6a30e2fa8f0d44e6c95bbeb5deca4b499f67cejeffhao converter = NULL; 744eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao } 754eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao umtx_unlock(NULL); 765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 785bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(converter != NULL) { 794eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao ucnv_close(converter); 807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 814eb68edeecc4d6641bcca2a40620631335e7cadcjeffhao} 825bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 835bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeU_CAPI void U_EXPORT2 845bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeu_flushDefaultConverter() 855bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee{ 865bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee UConverter *converter = NULL; 87fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao 885bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if (gDefaultConverter != NULL) { 895bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee umtx_lock(NULL); 900703060875166106af3d490c6c264611aea67ec8jeffhao 917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao /* need to check to make sure it wasn't taken out from under us */ 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (gDefaultConverter != NULL) { 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao converter = gDefaultConverter; 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao gDefaultConverter = NULL; 957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao umtx_unlock(NULL); 977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao /* if the cache was populated, flush it */ 1007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(converter != NULL) { 1017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_close(converter); 102fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao } 1035bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee} 1045bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1055bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* conversions between char* and UChar* ------------------------------------- */ 1077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* maximum string length for u_uastrcpy() and u_austrcpy() implementations */ 1097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao#define MAX_STRLEN 0x0FFFFFFF 1107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1115bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee/* 1125bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee returns the minimum of (the length of the null-terminated string) and n. 1135bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee*/ 1145bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeestatic int32_t u_astrnlen(const char *s1, int32_t n) 1155bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee{ 1165bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee int32_t len = 0; 1175bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 1187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (s1) 1197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao { 1207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao while (n-- && *(s1++)) 1217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao { 1225bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee len++; 1235bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1245bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return len; 1265bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee} 1277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1285bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeU_CAPI UChar* U_EXPORT2 1297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaou_uastrncpy(UChar *ucs1, 1305bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee const char *s2, 1315bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee int32_t n) 1325bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee{ 1335bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee UChar *target = ucs1; 1345bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee UErrorCode err = U_ZERO_ERROR; 1355bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee UConverter *cnv = u_getDefaultConverter(&err); 1365bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(U_SUCCESS(err) && cnv != NULL) { 1377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_reset(cnv); 1385bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee ucnv_toUnicode(cnv, 1397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao &target, 1405bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee ucs1+n, 1415bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee &s2, 1425bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee s2+u_astrnlen(s2, n), 1435bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee NULL, 1445bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee TRUE, 1455bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee &err); 1465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee ucnv_reset(cnv); /* be good citizens */ 1477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao u_releaseDefaultConverter(cnv); 1485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { 1497fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao *ucs1 = 0; /* failure */ 1505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(target < (ucs1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ 1525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee *target = 0; /* terminate */ 1535bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } else { 1555bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee *ucs1 = 0; 1565bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1575bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee return ucs1; 1587fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1595bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 16057b86d47b66322693a070185fadfb43cb9c12eabIan RogersU_CAPI UChar* U_EXPORT2 1615bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbeeu_uastrcpy(UChar *ucs1, 162fa147e22a73c6df166b08a2f71f9c9b52b09d17cjeffhao const char *s2 ) 1637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao{ 1645bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee UErrorCode err = U_ZERO_ERROR; 1657fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao UConverter *cnv = u_getDefaultConverter(&err); 1667fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(U_SUCCESS(err) && cnv != NULL) { 1677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_toUChars(cnv, 1687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucs1, 1695bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee MAX_STRLEN, 1707fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao s2, 1717fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao (int32_t)uprv_strlen(s2), 1725bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee &err); 1735bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee u_releaseDefaultConverter(cnv); 1745bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee if(U_FAILURE(err)) { 1757fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao *ucs1 = 0; 1765bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1775bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } else { 17857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *ucs1 = 0; 1795bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 1807fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return ucs1; 1817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 1847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao returns the minimum of (the length of the null-terminated string) and n. 1857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao*/ 1867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaostatic int32_t u_ustrnlen(const UChar *ucs1, int32_t n) 1877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao{ 1887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t len = 0; 1897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 1907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if (ucs1) 1917fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao { 1927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao while (n-- && *(ucs1++)) 1937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao { 1947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao len++; 1957fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1967fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 1977fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return len; 1987fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 1997fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2007fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoU_CAPI char* U_EXPORT2 2017fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaou_austrncpy(char *s1, 2027fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const UChar *ucs2, 2037fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t n) 2047fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao{ 2057fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao char *target = s1; 2067fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao UErrorCode err = U_ZERO_ERROR; 2077fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao UConverter *cnv = u_getDefaultConverter(&err); 2087fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(U_SUCCESS(err) && cnv != NULL) { 2097fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_reset(cnv); 2107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_fromUnicode(cnv, 2117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao &target, 2127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao s1+n, 2137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao &ucs2, 2147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucs2+u_ustrnlen(ucs2, n), 2157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao NULL, 2167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao TRUE, 2177fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao &err); 2187fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucnv_reset(cnv); /* be good citizens */ 2197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao u_releaseDefaultConverter(cnv); 2207fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(U_FAILURE(err) && (err != U_BUFFER_OVERFLOW_ERROR) ) { 2217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao *s1 = 0; /* failure */ 2227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 2237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(target < (s1+n)) { /* U_BUFFER_OVERFLOW_ERROR isn't an err, just means no termination will happen. */ 2247fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao *target = 0; /* terminate */ 2257fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 2267fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } else { 2277fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao *s1 = 0; 2287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 2297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return s1; 2307fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} 2317fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 2327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaoU_CAPI char* U_EXPORT2 2337fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaou_austrcpy(char *s1, 2347fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao const UChar *ucs2 ) 2357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao{ 2367fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao UErrorCode err = U_ZERO_ERROR; 2377fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao UConverter *cnv = u_getDefaultConverter(&err); 2387fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao if(U_SUCCESS(err) && cnv != NULL) { 2397fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao int32_t len = ucnv_fromUChars(cnv, 2407fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao s1, 2417fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MAX_STRLEN, 2427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao ucs2, 2437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao -1, 2447fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao &err); 2457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao u_releaseDefaultConverter(cnv); 2465bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee s1[len] = 0; 2475bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } else { 2485bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee *s1 = 0; 2495bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee } 2505bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee return s1; 2515bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee} 2525bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee 25357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#endif 2545bc5a7b9d9adcfb50e18bd3776d3875ad7a4ae8cbuzbee