util: virstring: Remove virStringListAdd and virStringListRemove

virStringListAdd hides the fact that a O(n) count of elements is
performed every time it's called which makes it inefficient.

Stop supporting such semantics and remove the helpers. Users have a
choice of using GSList or an array with a counter variable rather than
repeated lookups.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Peter Krempa 2021-02-05 14:26:57 +01:00
parent 67c345cb97
commit 2b3e390674
4 changed files with 0 additions and 140 deletions

View File

@ -3240,14 +3240,12 @@ virStringHasControlChars;
virStringHasSuffix; virStringHasSuffix;
virStringIsEmpty; virStringIsEmpty;
virStringIsPrintable; virStringIsPrintable;
virStringListAdd;
virStringListFreeCount; virStringListFreeCount;
virStringListGetFirstWithPrefix; virStringListGetFirstWithPrefix;
virStringListHasString; virStringListHasString;
virStringListJoin; virStringListJoin;
virStringListLength; virStringListLength;
virStringListMerge; virStringListMerge;
virStringListRemove;
virStringMatch; virStringMatch;
virStringMatchesNameSuffix; virStringMatchesNameSuffix;
virStringParsePort; virStringParsePort;

View File

@ -162,67 +162,6 @@ char *virStringListJoin(const char **strings,
} }
/**
* virStringListAdd:
* @strings: a NULL-terminated array of strings
* @item: string to add
*
* Appends @item into string list @strings. If *@strings is not
* allocated yet new string list is created.
*
* Returns: 0 on success,
* -1 otherwise
*/
int
virStringListAdd(char ***strings,
const char *item)
{
size_t i = virStringListLength((const char **) *strings);
if (VIR_EXPAND_N(*strings, i, 2) < 0)
return -1;
(*strings)[i - 2] = g_strdup(item);
return 0;
}
/**
* virStringListRemove:
* @strings: a NULL-terminated array of strings
* @item: string to remove
*
* Remove every occurrence of @item in list of @strings.
*/
void
virStringListRemove(char ***strings,
const char *item)
{
size_t r, w = 0;
if (!strings || !*strings)
return;
for (r = 0; (*strings)[r]; r++) {
if (STREQ((*strings)[r], item)) {
VIR_FREE((*strings)[r]);
continue;
}
if (r != w)
(*strings)[w] = (*strings)[r];
w++;
}
if (w == 0) {
VIR_FREE(*strings);
} else {
(*strings)[w] = NULL;
ignore_value(VIR_REALLOC_N(*strings, w + 1));
}
}
/** /**
* virStringListMerge: * virStringListMerge:
* @dst: a NULL-terminated array of strings to expand * @dst: a NULL-terminated array of strings to expand

View File

@ -37,11 +37,6 @@ char *virStringListJoin(const char **strings,
const char *delim) const char *delim)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int virStringListAdd(char ***strings,
const char *item);
void virStringListRemove(char ***strings,
const char *item);
int virStringListMerge(char ***dst, int virStringListMerge(char ***dst,
char ***src); char ***src);

View File

@ -163,74 +163,6 @@ static int testJoin(const void *args)
} }
static int testAdd(const void *args)
{
const struct testJoinData *data = args;
char **list = NULL;
char *got = NULL;
int ret = -1;
size_t i;
for (i = 0; data->tokens[i]; i++) {
if (virStringListAdd(&list, data->tokens[i]) < 0)
goto cleanup;
}
if (!list)
list = g_new0(char *, 1);
if (!(got = virStringListJoin((const char **)list, data->delim))) {
VIR_DEBUG("Got no result");
goto cleanup;
}
if (STRNEQ(got, data->string)) {
fprintf(stderr, "Mismatch '%s' vs '%s'\n", got, data->string);
goto cleanup;
}
ret = 0;
cleanup:
g_strfreev(list);
VIR_FREE(got);
return ret;
}
static int testRemove(const void *args)
{
const struct testSplitData *data = args;
char **list = NULL;
size_t ntokens;
size_t i;
int ret = -1;
if (!(list = virStringSplitCount(data->string, data->delim,
data->max_tokens, &ntokens))) {
VIR_DEBUG("Got no tokens at all");
return -1;
}
for (i = 0; data->tokens[i]; i++) {
virStringListRemove(&list, data->tokens[i]);
if (virStringListHasString((const char **) list, data->tokens[i])) {
fprintf(stderr, "Not removed %s", data->tokens[i]);
goto cleanup;
}
}
if (list && list[0]) {
fprintf(stderr, "Not removed all tokens: %s", list[0]);
goto cleanup;
}
ret = 0;
cleanup:
g_strfreev(list);
return ret;
}
static int static int
testStringSortCompare(const void *opaque G_GNUC_UNUSED) testStringSortCompare(const void *opaque G_GNUC_UNUSED)
{ {
@ -683,10 +615,6 @@ mymain(void)
ret = -1; \ ret = -1; \
if (virTestRun("Join " #str, testJoin, &joinData) < 0) \ if (virTestRun("Join " #str, testJoin, &joinData) < 0) \
ret = -1; \ ret = -1; \
if (virTestRun("Add " #str, testAdd, &joinData) < 0) \
ret = -1; \
if (virTestRun("Remove " #str, testRemove, &splitData) < 0) \
ret = -1; \
} while (0) } while (0)
VIR_WARNINGS_NO_DECLARATION_AFTER_STATEMENT VIR_WARNINGS_NO_DECLARATION_AFTER_STATEMENT