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