On 05.12.2016 16:23, Martin Kletzander wrote: > On Mon, Dec 05, 2016 at 11:31:50AM +0100, Michal Privoznik wrote: >> Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> >> --- >> src/libvirt_private.syms | 1 + >> src/util/virstring.c | 50 ++++++++++++++++++++++++++++++++++++++++++ >> src/util/virstring.h | 3 +++ >> tests/virstringtest.c | 56 >> ++++++++++++++++++++++++++++++++++++++++++++++++ >> 4 files changed, 110 insertions(+) >> >> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms >> index bc6588969..3d4da7356 100644 >> --- a/src/libvirt_private.syms >> +++ b/src/libvirt_private.syms >> @@ -2467,6 +2467,7 @@ virStringListGetFirstWithPrefix; >> virStringListHasString; >> virStringListJoin; >> virStringListLength; >> +virStringListRemove; >> virStringReplace; >> virStringSearch; >> virStringSortCompare; >> diff --git a/src/util/virstring.c b/src/util/virstring.c >> index 629f8ca32..96786db7f 100644 >> --- a/src/util/virstring.c >> +++ b/src/util/virstring.c >> @@ -202,6 +202,56 @@ virStringListAdd(const char **strings, >> } >> >> >> +/** >> + * virStringListRemove: >> + * @strings: a NULL-terminated array of strings >> + * @newStrings: new NULL-terminated array of strings >> + * @item: string to remove >> + * >> + * Creates new strings list with all strings duplicated except >> + * for every occurrence of @item. Callers is responsible for >> + * freeing both @strings and returned list. >> + * >> + * Returns the number of items in the new list (excluding NULL >> + * anchor), -1 on error. >> + */ >> +int >> +virStringListRemove(const char **strings, >> + char ***newStrings, >> + const char *item) >> +{ >> + char **ret = NULL; >> + size_t i, j = 0; >> + >> + for (i = 0; strings && strings[i]; i++) { >> + if (STRNEQ(strings[i], item)) >> + j++; >> + } >> + >> + if (!j) { >> + *newStrings = NULL; >> + return 0; >> + } >> + >> + if (VIR_ALLOC_N(ret, j + 1) < 0) >> + goto error; >> + >> + for (i = 0, j = 0; strings[i]; i++) { >> + if (STREQ(strings[i], item)) >> + continue; >> + if (VIR_STRDUP(ret[j], strings[i]) < 0) >> + goto error; >> + j++; >> + } >> + > > Instead of going twice through the list, you can just do it once and > then VIR_REALLOC_N the list. That would have the same time complexity - I'd need to use memmove() which iterates over the memory too. But it would have better memory complexity. Okay, will do in v3. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list