16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2009-2012, 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 "ulist.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uenumimp.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UListNode UListNode;
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UListNode {
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void *data;
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *next;
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *previous;
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* When data is created with uprv_malloc, needs to be freed during deleteList function. */
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool forceDelete;
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UList {
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *curr;
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *head;
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *tail;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t size;
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t currentIndex;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void ulist_addFirstItem(UList *list, UListNode *newItem);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErrorCode *status) {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UList *newList = NULL;
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList = (UList *)uprv_malloc(sizeof(UList));
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (newList == NULL) {
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_MEMORY_ALLOCATION_ERROR;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList->curr = NULL;
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList->head = NULL;
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList->tail = NULL;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList->size = 0;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newList->currentIndex = -1;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return newList;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Function called by addItemEndList or addItemBeginList when the first item is added to the list.
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This function properly sets the pointers for the first item added.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void ulist_addFirstItem(UList *list, UListNode *newItem) {
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->next = NULL;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->previous = NULL;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->head = newItem;
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->tail = newItem;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->currentIndex = 0;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_addItemEndList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) {
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *newItem = NULL;
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status) || list == NULL || data == NULL) {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem = (UListNode *)uprv_malloc(sizeof(UListNode));
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (newItem == NULL) {
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_MEMORY_ALLOCATION_ERROR;
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->data = (void *)(data);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->forceDelete = forceDelete;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list->size == 0) {
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulist_addFirstItem(list, newItem);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newItem->next = NULL;
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newItem->previous = list->tail;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->tail->next = newItem;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->tail = newItem;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->size++;
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *newItem = NULL;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status) || list == NULL || data == NULL) {
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem = (UListNode *)uprv_malloc(sizeof(UListNode));
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (newItem == NULL) {
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_MEMORY_ALLOCATION_ERROR;
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->data = (void *)(data);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newItem->forceDelete = forceDelete;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list->size == 0) {
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulist_addFirstItem(list, newItem);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newItem->previous = NULL;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newItem->next = list->head;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->head->previous = newItem;
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->head = newItem;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->currentIndex++;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->size++;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length) {
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool result = FALSE;
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UListNode *pointer = NULL;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list != NULL && list->size != 0) {
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pointer = list->head;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (pointer != NULL) {
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (length == uprv_strlen(pointer->data)) {
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (uprv_memcmp(data, pointer->data, length) == 0) {
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    result = TRUE;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pointer = pointer->next;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void *U_EXPORT2 ulist_getNext(UList *list) {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *curr = NULL;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list == NULL || list->curr == NULL) {
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    curr = list->curr;
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->curr = curr->next;
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    list->currentIndex++;
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return curr->data;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list) {
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list != NULL) {
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return list->size;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return -1;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_resetList(UList *list) {
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list != NULL) {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->curr = list->head;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list->currentIndex = 0;
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_deleteList(UList *list) {
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *listHead = NULL;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UListNode *listPointer = NULL;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (list != NULL) {
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        listHead = list->head;
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        listPointer = listHead;
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (listHead != NULL) {
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            listPointer = listHead->next;
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (listHead->forceDelete) {
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_free(listHead->data);
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_free(listHead);
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            listHead = listPointer;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_free(list);
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        list = NULL;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_close_keyword_values_iterator(UEnumeration *en) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (en != NULL) {
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ulist_deleteList((UList *)(en->context));
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_free(en);
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 ulist_count_keyword_values(UEnumeration *en, UErrorCode *status) {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ulist_getListSize((UList *)(en->context));
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2 ulist_next_keyword_value(UEnumeration *en, int32_t *resultLength, UErrorCode *status) {
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *s;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    s = (const char *)ulist_getNext((UList *)(en->context));
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (s != NULL && resultLength != NULL) {
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *resultLength = uprv_strlen(s);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return s;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 ulist_reset_keyword_values_iterator(UEnumeration *en, UErrorCode *status) {
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ;
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ulist_resetList((UList *)(en->context));
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UList *)(en->context);
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
237