Chromium Code Reviews

Unified Diff: source/common/ulist.c

Issue 2440913002: Update ICU to 58.1
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
« no previous file with comments | « source/common/ulist.h ('k') | source/common/ulistformatter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: source/common/ulist.c
diff --git a/source/common/ulist.c b/source/common/ulist.c
index 6b5013b0ecdf7bc23f8e5781287bbc0ef793796e..7f7fdd9ca47b2acc6871123a12b4e45b968026c0 100644
--- a/source/common/ulist.c
+++ b/source/common/ulist.c
@@ -1,6 +1,8 @@
+// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
/*
******************************************************************************
-* Copyright (C) 2009-2014, International Business Machines
+* Copyright (C) 2009-2016, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
*/
@@ -63,18 +65,45 @@ static void ulist_addFirstItem(UList *list, UListNode *newItem) {
newItem->previous = NULL;
list->head = newItem;
list->tail = newItem;
+}
+
+static void ulist_removeItem(UList *list, UListNode *p) {
+ if (p->previous == NULL) {
+ // p is the list head.
+ list->head = p->next;
+ } else {
+ p->previous->next = p->next;
+ }
+ if (p->next == NULL) {
+ // p is the list tail.
+ list->tail = p->previous;
+ } else {
+ p->next->previous = p->previous;
+ }
+ list->curr = NULL;
list->currentIndex = 0;
+ --list->size;
+ if (p->forceDelete) {
+ uprv_free(p->data);
+ }
+ uprv_free(p);
}
U_CAPI void U_EXPORT2 ulist_addItemEndList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) {
UListNode *newItem = NULL;
if (U_FAILURE(*status) || list == NULL || data == NULL) {
+ if (forceDelete) {
+ uprv_free((void *)data);
+ }
return;
}
newItem = (UListNode *)uprv_malloc(sizeof(UListNode));
if (newItem == NULL) {
+ if (forceDelete) {
+ uprv_free((void *)data);
+ }
*status = U_MEMORY_ALLOCATION_ERROR;
return;
}
@@ -97,11 +126,17 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo
UListNode *newItem = NULL;
if (U_FAILURE(*status) || list == NULL || data == NULL) {
+ if (forceDelete) {
+ uprv_free((void *)data);
+ }
return;
}
newItem = (UListNode *)uprv_malloc(sizeof(UListNode));
if (newItem == NULL) {
+ if (forceDelete) {
+ uprv_free((void *)data);
+ }
*status = U_MEMORY_ALLOCATION_ERROR;
return;
}
@@ -122,25 +157,31 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo
}
U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length) {
- UBool result = FALSE;
- const UListNode *pointer = NULL;
-
- if (list != NULL && list->size != 0) {
- pointer = list->head;
-
- while (pointer != NULL) {
+ if (list != NULL) {
+ const UListNode *pointer;
+ for (pointer = list->head; pointer != NULL; pointer = pointer->next) {
if (length == uprv_strlen(pointer->data)) {
if (uprv_memcmp(data, pointer->data, length) == 0) {
- result = TRUE;
- break;
+ return TRUE;
}
}
-
- pointer = pointer->next;
}
}
-
- return result;
+ return FALSE;
+}
+
+U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data) {
+ if (list != NULL) {
+ UListNode *pointer;
+ for (pointer = list->head; pointer != NULL; pointer = pointer->next) {
+ if (uprv_strcmp(data, pointer->data) == 0) {
+ ulist_removeItem(list, pointer);
+ // Remove only the first occurrence, like Java LinkedList.remove(Object).
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
}
U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) {
« no previous file with comments | « source/common/ulist.h ('k') | source/common/ulistformatter.cpp » ('j') | no next file with comments »

Powered by Google App Engine