12e5b6d6dSopenharmony_ci// © 2016 and later: Unicode, Inc. and others. 22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html 32e5b6d6dSopenharmony_ci/* 42e5b6d6dSopenharmony_ci********************************************************************** 52e5b6d6dSopenharmony_ci* Copyright (c) 2002-2014, International Business Machines 62e5b6d6dSopenharmony_ci* Corporation and others. All Rights Reserved. 72e5b6d6dSopenharmony_ci********************************************************************** 82e5b6d6dSopenharmony_ci* Author: Alan Liu 92e5b6d6dSopenharmony_ci* Created: November 11 2002 102e5b6d6dSopenharmony_ci* Since: ICU 2.4 112e5b6d6dSopenharmony_ci********************************************************************** 122e5b6d6dSopenharmony_ci*/ 132e5b6d6dSopenharmony_ci#include "utypeinfo.h" // for 'typeid' to work 142e5b6d6dSopenharmony_ci 152e5b6d6dSopenharmony_ci#include "unicode/ustring.h" 162e5b6d6dSopenharmony_ci#include "unicode/strenum.h" 172e5b6d6dSopenharmony_ci#include "unicode/putil.h" 182e5b6d6dSopenharmony_ci#include "uenumimp.h" 192e5b6d6dSopenharmony_ci#include "ustrenum.h" 202e5b6d6dSopenharmony_ci#include "cstring.h" 212e5b6d6dSopenharmony_ci#include "cmemory.h" 222e5b6d6dSopenharmony_ci#include "uassert.h" 232e5b6d6dSopenharmony_ci 242e5b6d6dSopenharmony_ciU_NAMESPACE_BEGIN 252e5b6d6dSopenharmony_ci// StringEnumeration implementation ---------------------------------------- *** 262e5b6d6dSopenharmony_ci 272e5b6d6dSopenharmony_ciStringEnumeration::StringEnumeration() 282e5b6d6dSopenharmony_ci : chars(charsBuffer), charsCapacity(sizeof(charsBuffer)) { 292e5b6d6dSopenharmony_ci} 302e5b6d6dSopenharmony_ci 312e5b6d6dSopenharmony_ciStringEnumeration::~StringEnumeration() { 322e5b6d6dSopenharmony_ci if (chars != NULL && chars != charsBuffer) { 332e5b6d6dSopenharmony_ci uprv_free(chars); 342e5b6d6dSopenharmony_ci } 352e5b6d6dSopenharmony_ci} 362e5b6d6dSopenharmony_ci 372e5b6d6dSopenharmony_ci// StringEnumeration base class clone() default implementation, does not clone 382e5b6d6dSopenharmony_ciStringEnumeration * 392e5b6d6dSopenharmony_ciStringEnumeration::clone() const { 402e5b6d6dSopenharmony_ci return NULL; 412e5b6d6dSopenharmony_ci} 422e5b6d6dSopenharmony_ci 432e5b6d6dSopenharmony_ciconst char * 442e5b6d6dSopenharmony_ciStringEnumeration::next(int32_t *resultLength, UErrorCode &status) { 452e5b6d6dSopenharmony_ci const UnicodeString *s=snext(status); 462e5b6d6dSopenharmony_ci if(U_SUCCESS(status) && s!=NULL) { 472e5b6d6dSopenharmony_ci unistr=*s; 482e5b6d6dSopenharmony_ci ensureCharsCapacity(unistr.length()+1, status); 492e5b6d6dSopenharmony_ci if(U_SUCCESS(status)) { 502e5b6d6dSopenharmony_ci if(resultLength!=NULL) { 512e5b6d6dSopenharmony_ci *resultLength=unistr.length(); 522e5b6d6dSopenharmony_ci } 532e5b6d6dSopenharmony_ci unistr.extract(0, INT32_MAX, chars, charsCapacity, US_INV); 542e5b6d6dSopenharmony_ci return chars; 552e5b6d6dSopenharmony_ci } 562e5b6d6dSopenharmony_ci } 572e5b6d6dSopenharmony_ci 582e5b6d6dSopenharmony_ci return NULL; 592e5b6d6dSopenharmony_ci} 602e5b6d6dSopenharmony_ci 612e5b6d6dSopenharmony_ciconst UChar * 622e5b6d6dSopenharmony_ciStringEnumeration::unext(int32_t *resultLength, UErrorCode &status) { 632e5b6d6dSopenharmony_ci const UnicodeString *s=snext(status); 642e5b6d6dSopenharmony_ci if(U_SUCCESS(status) && s!=NULL) { 652e5b6d6dSopenharmony_ci unistr=*s; 662e5b6d6dSopenharmony_ci if(resultLength!=NULL) { 672e5b6d6dSopenharmony_ci *resultLength=unistr.length(); 682e5b6d6dSopenharmony_ci } 692e5b6d6dSopenharmony_ci return unistr.getTerminatedBuffer(); 702e5b6d6dSopenharmony_ci } 712e5b6d6dSopenharmony_ci 722e5b6d6dSopenharmony_ci return NULL; 732e5b6d6dSopenharmony_ci} 742e5b6d6dSopenharmony_ci 752e5b6d6dSopenharmony_ciconst UnicodeString * 762e5b6d6dSopenharmony_ciStringEnumeration::snext(UErrorCode &status) { 772e5b6d6dSopenharmony_ci int32_t length; 782e5b6d6dSopenharmony_ci const char *s=next(&length, status); 792e5b6d6dSopenharmony_ci return setChars(s, length, status); 802e5b6d6dSopenharmony_ci} 812e5b6d6dSopenharmony_ci 822e5b6d6dSopenharmony_civoid 832e5b6d6dSopenharmony_ciStringEnumeration::ensureCharsCapacity(int32_t capacity, UErrorCode &status) { 842e5b6d6dSopenharmony_ci if(U_SUCCESS(status) && capacity>charsCapacity) { 852e5b6d6dSopenharmony_ci if(capacity<(charsCapacity+charsCapacity/2)) { 862e5b6d6dSopenharmony_ci // avoid allocation thrashing 872e5b6d6dSopenharmony_ci capacity=charsCapacity+charsCapacity/2; 882e5b6d6dSopenharmony_ci } 892e5b6d6dSopenharmony_ci if(chars!=charsBuffer) { 902e5b6d6dSopenharmony_ci uprv_free(chars); 912e5b6d6dSopenharmony_ci } 922e5b6d6dSopenharmony_ci chars=(char *)uprv_malloc(capacity); 932e5b6d6dSopenharmony_ci if(chars==NULL) { 942e5b6d6dSopenharmony_ci chars=charsBuffer; 952e5b6d6dSopenharmony_ci charsCapacity=sizeof(charsBuffer); 962e5b6d6dSopenharmony_ci status=U_MEMORY_ALLOCATION_ERROR; 972e5b6d6dSopenharmony_ci } else { 982e5b6d6dSopenharmony_ci charsCapacity=capacity; 992e5b6d6dSopenharmony_ci } 1002e5b6d6dSopenharmony_ci } 1012e5b6d6dSopenharmony_ci} 1022e5b6d6dSopenharmony_ci 1032e5b6d6dSopenharmony_ciUnicodeString * 1042e5b6d6dSopenharmony_ciStringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) { 1052e5b6d6dSopenharmony_ci if(U_SUCCESS(status) && s!=NULL) { 1062e5b6d6dSopenharmony_ci if(length<0) { 1072e5b6d6dSopenharmony_ci length=(int32_t)uprv_strlen(s); 1082e5b6d6dSopenharmony_ci } 1092e5b6d6dSopenharmony_ci 1102e5b6d6dSopenharmony_ci UChar *buffer=unistr.getBuffer(length+1); 1112e5b6d6dSopenharmony_ci if(buffer!=NULL) { 1122e5b6d6dSopenharmony_ci u_charsToUChars(s, buffer, length); 1132e5b6d6dSopenharmony_ci buffer[length]=0; 1142e5b6d6dSopenharmony_ci unistr.releaseBuffer(length); 1152e5b6d6dSopenharmony_ci return &unistr; 1162e5b6d6dSopenharmony_ci } else { 1172e5b6d6dSopenharmony_ci status=U_MEMORY_ALLOCATION_ERROR; 1182e5b6d6dSopenharmony_ci } 1192e5b6d6dSopenharmony_ci } 1202e5b6d6dSopenharmony_ci 1212e5b6d6dSopenharmony_ci return NULL; 1222e5b6d6dSopenharmony_ci} 1232e5b6d6dSopenharmony_cibool 1242e5b6d6dSopenharmony_ciStringEnumeration::operator==(const StringEnumeration& that)const { 1252e5b6d6dSopenharmony_ci return typeid(*this) == typeid(that); 1262e5b6d6dSopenharmony_ci} 1272e5b6d6dSopenharmony_ci 1282e5b6d6dSopenharmony_cibool 1292e5b6d6dSopenharmony_ciStringEnumeration::operator!=(const StringEnumeration& that)const { 1302e5b6d6dSopenharmony_ci return !operator==(that); 1312e5b6d6dSopenharmony_ci} 1322e5b6d6dSopenharmony_ci 1332e5b6d6dSopenharmony_ci// UStringEnumeration implementation --------------------------------------- *** 1342e5b6d6dSopenharmony_ci 1352e5b6d6dSopenharmony_ciUStringEnumeration * U_EXPORT2 1362e5b6d6dSopenharmony_ciUStringEnumeration::fromUEnumeration( 1372e5b6d6dSopenharmony_ci UEnumeration *uenumToAdopt, UErrorCode &status) { 1382e5b6d6dSopenharmony_ci if (U_FAILURE(status)) { 1392e5b6d6dSopenharmony_ci uenum_close(uenumToAdopt); 1402e5b6d6dSopenharmony_ci return NULL; 1412e5b6d6dSopenharmony_ci } 1422e5b6d6dSopenharmony_ci UStringEnumeration *result = new UStringEnumeration(uenumToAdopt); 1432e5b6d6dSopenharmony_ci if (result == NULL) { 1442e5b6d6dSopenharmony_ci status = U_MEMORY_ALLOCATION_ERROR; 1452e5b6d6dSopenharmony_ci uenum_close(uenumToAdopt); 1462e5b6d6dSopenharmony_ci return NULL; 1472e5b6d6dSopenharmony_ci } 1482e5b6d6dSopenharmony_ci return result; 1492e5b6d6dSopenharmony_ci} 1502e5b6d6dSopenharmony_ci 1512e5b6d6dSopenharmony_ciUStringEnumeration::UStringEnumeration(UEnumeration* _uenum) : 1522e5b6d6dSopenharmony_ci uenum(_uenum) { 1532e5b6d6dSopenharmony_ci U_ASSERT(_uenum != 0); 1542e5b6d6dSopenharmony_ci} 1552e5b6d6dSopenharmony_ci 1562e5b6d6dSopenharmony_ciUStringEnumeration::~UStringEnumeration() { 1572e5b6d6dSopenharmony_ci uenum_close(uenum); 1582e5b6d6dSopenharmony_ci} 1592e5b6d6dSopenharmony_ci 1602e5b6d6dSopenharmony_ciint32_t UStringEnumeration::count(UErrorCode& status) const { 1612e5b6d6dSopenharmony_ci return uenum_count(uenum, &status); 1622e5b6d6dSopenharmony_ci} 1632e5b6d6dSopenharmony_ci 1642e5b6d6dSopenharmony_ciconst char *UStringEnumeration::next(int32_t *resultLength, UErrorCode &status) { 1652e5b6d6dSopenharmony_ci return uenum_next(uenum, resultLength, &status); 1662e5b6d6dSopenharmony_ci} 1672e5b6d6dSopenharmony_ci 1682e5b6d6dSopenharmony_ciconst UnicodeString* UStringEnumeration::snext(UErrorCode& status) { 1692e5b6d6dSopenharmony_ci int32_t length; 1702e5b6d6dSopenharmony_ci const UChar* str = uenum_unext(uenum, &length, &status); 1712e5b6d6dSopenharmony_ci if (str == 0 || U_FAILURE(status)) { 1722e5b6d6dSopenharmony_ci return 0; 1732e5b6d6dSopenharmony_ci } 1742e5b6d6dSopenharmony_ci return &unistr.setTo(str, length); 1752e5b6d6dSopenharmony_ci} 1762e5b6d6dSopenharmony_ci 1772e5b6d6dSopenharmony_civoid UStringEnumeration::reset(UErrorCode& status) { 1782e5b6d6dSopenharmony_ci uenum_reset(uenum, &status); 1792e5b6d6dSopenharmony_ci} 1802e5b6d6dSopenharmony_ci 1812e5b6d6dSopenharmony_ciUOBJECT_DEFINE_RTTI_IMPLEMENTATION(UStringEnumeration) 1822e5b6d6dSopenharmony_ciU_NAMESPACE_END 1832e5b6d6dSopenharmony_ci 1842e5b6d6dSopenharmony_ci// C wrapper --------------------------------------------------------------- *** 1852e5b6d6dSopenharmony_ci 1862e5b6d6dSopenharmony_ci#define THIS(en) ((icu::StringEnumeration*)(en->context)) 1872e5b6d6dSopenharmony_ci 1882e5b6d6dSopenharmony_ciU_CDECL_BEGIN 1892e5b6d6dSopenharmony_ci 1902e5b6d6dSopenharmony_ci/** 1912e5b6d6dSopenharmony_ci * Wrapper API to make StringEnumeration look like UEnumeration. 1922e5b6d6dSopenharmony_ci */ 1932e5b6d6dSopenharmony_cistatic void U_CALLCONV 1942e5b6d6dSopenharmony_ciustrenum_close(UEnumeration* en) { 1952e5b6d6dSopenharmony_ci delete THIS(en); 1962e5b6d6dSopenharmony_ci uprv_free(en); 1972e5b6d6dSopenharmony_ci} 1982e5b6d6dSopenharmony_ci 1992e5b6d6dSopenharmony_ci/** 2002e5b6d6dSopenharmony_ci * Wrapper API to make StringEnumeration look like UEnumeration. 2012e5b6d6dSopenharmony_ci */ 2022e5b6d6dSopenharmony_cistatic int32_t U_CALLCONV 2032e5b6d6dSopenharmony_ciustrenum_count(UEnumeration* en, 2042e5b6d6dSopenharmony_ci UErrorCode* ec) 2052e5b6d6dSopenharmony_ci{ 2062e5b6d6dSopenharmony_ci return THIS(en)->count(*ec); 2072e5b6d6dSopenharmony_ci} 2082e5b6d6dSopenharmony_ci 2092e5b6d6dSopenharmony_ci/** 2102e5b6d6dSopenharmony_ci * Wrapper API to make StringEnumeration look like UEnumeration. 2112e5b6d6dSopenharmony_ci */ 2122e5b6d6dSopenharmony_cistatic const UChar* U_CALLCONV 2132e5b6d6dSopenharmony_ciustrenum_unext(UEnumeration* en, 2142e5b6d6dSopenharmony_ci int32_t* resultLength, 2152e5b6d6dSopenharmony_ci UErrorCode* ec) 2162e5b6d6dSopenharmony_ci{ 2172e5b6d6dSopenharmony_ci return THIS(en)->unext(resultLength, *ec); 2182e5b6d6dSopenharmony_ci} 2192e5b6d6dSopenharmony_ci 2202e5b6d6dSopenharmony_ci/** 2212e5b6d6dSopenharmony_ci * Wrapper API to make StringEnumeration look like UEnumeration. 2222e5b6d6dSopenharmony_ci */ 2232e5b6d6dSopenharmony_cistatic const char* U_CALLCONV 2242e5b6d6dSopenharmony_ciustrenum_next(UEnumeration* en, 2252e5b6d6dSopenharmony_ci int32_t* resultLength, 2262e5b6d6dSopenharmony_ci UErrorCode* ec) 2272e5b6d6dSopenharmony_ci{ 2282e5b6d6dSopenharmony_ci return THIS(en)->next(resultLength, *ec); 2292e5b6d6dSopenharmony_ci} 2302e5b6d6dSopenharmony_ci 2312e5b6d6dSopenharmony_ci/** 2322e5b6d6dSopenharmony_ci * Wrapper API to make StringEnumeration look like UEnumeration. 2332e5b6d6dSopenharmony_ci */ 2342e5b6d6dSopenharmony_cistatic void U_CALLCONV 2352e5b6d6dSopenharmony_ciustrenum_reset(UEnumeration* en, 2362e5b6d6dSopenharmony_ci UErrorCode* ec) 2372e5b6d6dSopenharmony_ci{ 2382e5b6d6dSopenharmony_ci THIS(en)->reset(*ec); 2392e5b6d6dSopenharmony_ci} 2402e5b6d6dSopenharmony_ci 2412e5b6d6dSopenharmony_ci/** 2422e5b6d6dSopenharmony_ci * Pseudo-vtable for UEnumeration wrapper around StringEnumeration. 2432e5b6d6dSopenharmony_ci * The StringEnumeration pointer will be stored in 'context'. 2442e5b6d6dSopenharmony_ci */ 2452e5b6d6dSopenharmony_cistatic const UEnumeration USTRENUM_VT = { 2462e5b6d6dSopenharmony_ci NULL, 2472e5b6d6dSopenharmony_ci NULL, // store StringEnumeration pointer here 2482e5b6d6dSopenharmony_ci ustrenum_close, 2492e5b6d6dSopenharmony_ci ustrenum_count, 2502e5b6d6dSopenharmony_ci ustrenum_unext, 2512e5b6d6dSopenharmony_ci ustrenum_next, 2522e5b6d6dSopenharmony_ci ustrenum_reset 2532e5b6d6dSopenharmony_ci}; 2542e5b6d6dSopenharmony_ci 2552e5b6d6dSopenharmony_ciU_CDECL_END 2562e5b6d6dSopenharmony_ci 2572e5b6d6dSopenharmony_ci/** 2582e5b6d6dSopenharmony_ci * Given a StringEnumeration, wrap it in a UEnumeration. The 2592e5b6d6dSopenharmony_ci * StringEnumeration is adopted; after this call, the caller must not 2602e5b6d6dSopenharmony_ci * delete it (regardless of error status). 2612e5b6d6dSopenharmony_ci */ 2622e5b6d6dSopenharmony_ciU_CAPI UEnumeration* U_EXPORT2 2632e5b6d6dSopenharmony_ciuenum_openFromStringEnumeration(icu::StringEnumeration* adopted, UErrorCode* ec) { 2642e5b6d6dSopenharmony_ci UEnumeration* result = NULL; 2652e5b6d6dSopenharmony_ci if (U_SUCCESS(*ec) && adopted != NULL) { 2662e5b6d6dSopenharmony_ci result = (UEnumeration*) uprv_malloc(sizeof(UEnumeration)); 2672e5b6d6dSopenharmony_ci if (result == NULL) { 2682e5b6d6dSopenharmony_ci *ec = U_MEMORY_ALLOCATION_ERROR; 2692e5b6d6dSopenharmony_ci } else { 2702e5b6d6dSopenharmony_ci uprv_memcpy(result, &USTRENUM_VT, sizeof(USTRENUM_VT)); 2712e5b6d6dSopenharmony_ci result->context = adopted; 2722e5b6d6dSopenharmony_ci } 2732e5b6d6dSopenharmony_ci } 2742e5b6d6dSopenharmony_ci if (result == NULL) { 2752e5b6d6dSopenharmony_ci delete adopted; 2762e5b6d6dSopenharmony_ci } 2772e5b6d6dSopenharmony_ci return result; 2782e5b6d6dSopenharmony_ci} 2792e5b6d6dSopenharmony_ci 2802e5b6d6dSopenharmony_ci// C wrapper --------------------------------------------------------------- *** 2812e5b6d6dSopenharmony_ci 2822e5b6d6dSopenharmony_ciU_CDECL_BEGIN 2832e5b6d6dSopenharmony_ci 2842e5b6d6dSopenharmony_citypedef struct UCharStringEnumeration { 2852e5b6d6dSopenharmony_ci UEnumeration uenum; 2862e5b6d6dSopenharmony_ci int32_t index, count; 2872e5b6d6dSopenharmony_ci} UCharStringEnumeration; 2882e5b6d6dSopenharmony_ci 2892e5b6d6dSopenharmony_cistatic void U_CALLCONV 2902e5b6d6dSopenharmony_ciucharstrenum_close(UEnumeration* en) { 2912e5b6d6dSopenharmony_ci uprv_free(en); 2922e5b6d6dSopenharmony_ci} 2932e5b6d6dSopenharmony_ci 2942e5b6d6dSopenharmony_cistatic int32_t U_CALLCONV 2952e5b6d6dSopenharmony_ciucharstrenum_count(UEnumeration* en, 2962e5b6d6dSopenharmony_ci UErrorCode* /*ec*/) { 2972e5b6d6dSopenharmony_ci return ((UCharStringEnumeration*)en)->count; 2982e5b6d6dSopenharmony_ci} 2992e5b6d6dSopenharmony_ci 3002e5b6d6dSopenharmony_cistatic const UChar* U_CALLCONV 3012e5b6d6dSopenharmony_ciucharstrenum_unext(UEnumeration* en, 3022e5b6d6dSopenharmony_ci int32_t* resultLength, 3032e5b6d6dSopenharmony_ci UErrorCode* /*ec*/) { 3042e5b6d6dSopenharmony_ci UCharStringEnumeration *e = (UCharStringEnumeration*) en; 3052e5b6d6dSopenharmony_ci if (e->index >= e->count) { 3062e5b6d6dSopenharmony_ci return NULL; 3072e5b6d6dSopenharmony_ci } 3082e5b6d6dSopenharmony_ci const UChar* result = ((const UChar**)e->uenum.context)[e->index++]; 3092e5b6d6dSopenharmony_ci if (resultLength) { 3102e5b6d6dSopenharmony_ci *resultLength = (int32_t)u_strlen(result); 3112e5b6d6dSopenharmony_ci } 3122e5b6d6dSopenharmony_ci return result; 3132e5b6d6dSopenharmony_ci} 3142e5b6d6dSopenharmony_ci 3152e5b6d6dSopenharmony_ci 3162e5b6d6dSopenharmony_cistatic const char* U_CALLCONV 3172e5b6d6dSopenharmony_ciucharstrenum_next(UEnumeration* en, 3182e5b6d6dSopenharmony_ci int32_t* resultLength, 3192e5b6d6dSopenharmony_ci UErrorCode* /*ec*/) { 3202e5b6d6dSopenharmony_ci UCharStringEnumeration *e = (UCharStringEnumeration*) en; 3212e5b6d6dSopenharmony_ci if (e->index >= e->count) { 3222e5b6d6dSopenharmony_ci return NULL; 3232e5b6d6dSopenharmony_ci } 3242e5b6d6dSopenharmony_ci const char* result = ((const char**)e->uenum.context)[e->index++]; 3252e5b6d6dSopenharmony_ci if (resultLength) { 3262e5b6d6dSopenharmony_ci *resultLength = (int32_t)uprv_strlen(result); 3272e5b6d6dSopenharmony_ci } 3282e5b6d6dSopenharmony_ci return result; 3292e5b6d6dSopenharmony_ci} 3302e5b6d6dSopenharmony_ci 3312e5b6d6dSopenharmony_cistatic void U_CALLCONV 3322e5b6d6dSopenharmony_ciucharstrenum_reset(UEnumeration* en, 3332e5b6d6dSopenharmony_ci UErrorCode* /*ec*/) { 3342e5b6d6dSopenharmony_ci ((UCharStringEnumeration*)en)->index = 0; 3352e5b6d6dSopenharmony_ci} 3362e5b6d6dSopenharmony_ci 3372e5b6d6dSopenharmony_cistatic const UEnumeration UCHARSTRENUM_VT = { 3382e5b6d6dSopenharmony_ci NULL, 3392e5b6d6dSopenharmony_ci NULL, // store StringEnumeration pointer here 3402e5b6d6dSopenharmony_ci ucharstrenum_close, 3412e5b6d6dSopenharmony_ci ucharstrenum_count, 3422e5b6d6dSopenharmony_ci uenum_unextDefault, 3432e5b6d6dSopenharmony_ci ucharstrenum_next, 3442e5b6d6dSopenharmony_ci ucharstrenum_reset 3452e5b6d6dSopenharmony_ci}; 3462e5b6d6dSopenharmony_ci 3472e5b6d6dSopenharmony_cistatic const UEnumeration UCHARSTRENUM_U_VT = { 3482e5b6d6dSopenharmony_ci NULL, 3492e5b6d6dSopenharmony_ci NULL, // store StringEnumeration pointer here 3502e5b6d6dSopenharmony_ci ucharstrenum_close, 3512e5b6d6dSopenharmony_ci ucharstrenum_count, 3522e5b6d6dSopenharmony_ci ucharstrenum_unext, 3532e5b6d6dSopenharmony_ci uenum_nextDefault, 3542e5b6d6dSopenharmony_ci ucharstrenum_reset 3552e5b6d6dSopenharmony_ci}; 3562e5b6d6dSopenharmony_ci 3572e5b6d6dSopenharmony_ciU_CDECL_END 3582e5b6d6dSopenharmony_ci 3592e5b6d6dSopenharmony_ciU_CAPI UEnumeration* U_EXPORT2 3602e5b6d6dSopenharmony_ciuenum_openCharStringsEnumeration(const char* const strings[], int32_t count, 3612e5b6d6dSopenharmony_ci UErrorCode* ec) { 3622e5b6d6dSopenharmony_ci UCharStringEnumeration* result = NULL; 3632e5b6d6dSopenharmony_ci if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { 3642e5b6d6dSopenharmony_ci result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); 3652e5b6d6dSopenharmony_ci if (result == NULL) { 3662e5b6d6dSopenharmony_ci *ec = U_MEMORY_ALLOCATION_ERROR; 3672e5b6d6dSopenharmony_ci } else { 3682e5b6d6dSopenharmony_ci U_ASSERT((char*)result==(char*)(&result->uenum)); 3692e5b6d6dSopenharmony_ci uprv_memcpy(result, &UCHARSTRENUM_VT, sizeof(UCHARSTRENUM_VT)); 3702e5b6d6dSopenharmony_ci result->uenum.context = (void*)strings; 3712e5b6d6dSopenharmony_ci result->index = 0; 3722e5b6d6dSopenharmony_ci result->count = count; 3732e5b6d6dSopenharmony_ci } 3742e5b6d6dSopenharmony_ci } 3752e5b6d6dSopenharmony_ci return (UEnumeration*) result; 3762e5b6d6dSopenharmony_ci} 3772e5b6d6dSopenharmony_ci 3782e5b6d6dSopenharmony_ciU_CAPI UEnumeration* U_EXPORT2 3792e5b6d6dSopenharmony_ciuenum_openUCharStringsEnumeration(const UChar* const strings[], int32_t count, 3802e5b6d6dSopenharmony_ci UErrorCode* ec) { 3812e5b6d6dSopenharmony_ci UCharStringEnumeration* result = NULL; 3822e5b6d6dSopenharmony_ci if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { 3832e5b6d6dSopenharmony_ci result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); 3842e5b6d6dSopenharmony_ci if (result == NULL) { 3852e5b6d6dSopenharmony_ci *ec = U_MEMORY_ALLOCATION_ERROR; 3862e5b6d6dSopenharmony_ci } else { 3872e5b6d6dSopenharmony_ci U_ASSERT((char*)result==(char*)(&result->uenum)); 3882e5b6d6dSopenharmony_ci uprv_memcpy(result, &UCHARSTRENUM_U_VT, sizeof(UCHARSTRENUM_U_VT)); 3892e5b6d6dSopenharmony_ci result->uenum.context = (void*)strings; 3902e5b6d6dSopenharmony_ci result->index = 0; 3912e5b6d6dSopenharmony_ci result->count = count; 3922e5b6d6dSopenharmony_ci } 3932e5b6d6dSopenharmony_ci } 3942e5b6d6dSopenharmony_ci return (UEnumeration*) result; 3952e5b6d6dSopenharmony_ci} 3962e5b6d6dSopenharmony_ci 3972e5b6d6dSopenharmony_ci 3982e5b6d6dSopenharmony_ci// end C Wrapper 399