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