}
-static int
-virNWFilterFormatParameterNameSorter(const virHashKeyValuePair *a,
- const virHashKeyValuePair *b)
-{
- return strcmp(a->key, b->key);
-}
-
int
virNWFilterFormatParamAttributes(virBufferPtr buf,
virHashTablePtr table,
return -1;
}
- items = virHashGetItems(table,
- virNWFilterFormatParameterNameSorter);
+ items = virHashGetItems(table, NULL, true);
if (!items)
return -1;
/* retrieve parameters out of hash table */
numKeys = virHashSize(p->embedded.table);
- items = virHashGetItems(p->embedded.table, NULL);
+ items = virHashGetItems(p->embedded.table, NULL, false);
if (!items) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not read embedded param hash table"));
}
- tmp = pairs = virHashGetItems(lockDaemon->lockspaces, NULL);
+ tmp = pairs = virHashGetItems(lockDaemon->lockspaces, NULL, false);
while (tmp && tmp->key) {
virLockSpacePtr lockspace = (virLockSpacePtr)tmp->value;
static int
-ebiptablesFilterOrderSort(const virHashKeyValuePair *a,
- const virHashKeyValuePair *b)
+ebiptablesFilterOrderSort(const void *va,
+ const void *vb)
{
+ const virHashKeyValuePair *a = va;
+ const virHashKeyValuePair *b = vb;
+
/* elements' values has been limited to range [-1000, 1000] */
return *(virNWFilterChainPriority *)a->value -
*(virNWFilterChainPriority *)b->value;
size_t *ninsts)
{
g_autofree virHashKeyValuePairPtr filter_names = NULL;
+ size_t nfilter_names;
size_t i;
- filter_names = virHashGetItems(chains,
- ebiptablesFilterOrderSort);
+ filter_names = virHashGetItems(chains, &nfilter_names, false);
if (filter_names == NULL)
return -1;
+ qsort(filter_names, nfilter_names, sizeof(*filter_names), ebiptablesFilterOrderSort);
+
for (i = 0; filter_names[i].key; i++) {
g_autofree ebtablesSubChainInstPtr inst = NULL;
enum l3_proto_idx idx = ebtablesGetProtoIdxByFiltername(
return 0;
}
-static int
-qemuConfigFilesSorter(const virHashKeyValuePair *a,
- const virHashKeyValuePair *b)
-{
- return strcmp(a->key, b->key);
-}
-
#define QEMU_SYSTEM_LOCATION PREFIX "/share/qemu"
#define QEMU_ETC_LOCATION SYSCONFDIR "/qemu"
if (virHashSize(files) == 0)
return 0;
- if (!(pairs = virHashGetItems(files, qemuConfigFilesSorter)))
+ if (!(pairs = virHashGetItems(files, NULL, true)))
return -1;
for (tmp = pairs; tmp->key; tmp++) {
}
-static int
-daemonServerCompare(const virHashKeyValuePair *a, const virHashKeyValuePair *b)
-{
- const char *as = a->key;
- const char *bs = b->key;
-
- return strcmp(as, bs);
-}
-
virJSONValuePtr
virNetDaemonPreExecRestart(virNetDaemonPtr dmn)
{
goto error;
}
- if (!(srvArray = virHashGetItems(dmn->servers, daemonServerCompare)))
+ if (!(srvArray = virHashGetItems(dmn->servers, NULL, true)))
goto error;
for (i = 0; srvArray[i].key; i++) {
return NULL;
}
-struct getKeysIter
-{
- virHashKeyValuePair *sortArray;
- size_t arrayIdx;
+
+struct virHashGetItemsIteratorData {
+ virHashKeyValuePair *items;
+ size_t i;
};
-static int virHashGetKeysIterator(void *payload,
- const char *key, void *data)
+
+static int
+virHashGetItemsIterator(void *payload,
+ const char *key,
+ void *opaque)
{
- struct getKeysIter *iter = data;
+ struct virHashGetItemsIteratorData *data = opaque;
- iter->sortArray[iter->arrayIdx].key = key;
- iter->sortArray[iter->arrayIdx].value = payload;
+ data->items[data->i].key = key;
+ data->items[data->i].value = payload;
- iter->arrayIdx++;
+ data->i++;
return 0;
}
-typedef int (*qsort_comp)(const void *, const void *);
-virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
- virHashKeyComparator compar)
+static int
+virHashGetItemsKeySorter(const void *va,
+ const void *vb)
{
- ssize_t numElems = virHashSize(table);
- struct getKeysIter iter = {
- .arrayIdx = 0,
- .sortArray = NULL,
- };
+ const virHashKeyValuePair *a = va;
+ const virHashKeyValuePair *b = vb;
- if (numElems < 0)
- return NULL;
+ return strcmp(a->key, b->key);
+}
+
+
+virHashKeyValuePairPtr
+virHashGetItems(virHashTablePtr table,
+ size_t *nitems,
+ bool sortKeys)
+{
+ size_t dummy;
+ struct virHashGetItemsIteratorData data = { .items = NULL, .i = 0 };
- iter.sortArray = g_new0(virHashKeyValuePair, numElems + 1);
+ if (!nitems)
+ nitems = &dummy;
- virHashForEach(table, virHashGetKeysIterator, &iter);
+ *nitems = virHashSize(table);
- if (compar)
- qsort(&iter.sortArray[0], numElems, sizeof(iter.sortArray[0]),
- (qsort_comp)compar);
+ data.items = g_new0(virHashKeyValuePair, *nitems + 1);
- return iter.sortArray;
+ virHashForEach(table, virHashGetItemsIterator, &data);
+
+ if (sortKeys)
+ qsort(data.items, *nitems, sizeof(* data.items), virHashGetItemsKeySorter);
+
+ return data.items;
}
+
struct virHashEqualData
{
bool equal;
const void *key;
const void *value;
};
-typedef int (*virHashKeyComparator)(const virHashKeyValuePair *,
- const virHashKeyValuePair *);
virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
- virHashKeyComparator compar);
+ size_t *nitems,
+ bool sortedKeys);
/*
* Compare two tables for equality: the lookup of a key's value in
goto error;
}
- tmp = pairs = virHashGetItems(lockspace->resources, NULL);
+ tmp = pairs = virHashGetItems(lockspace->resources, NULL, false);
while (tmp && tmp->value) {
virLockSpaceResourcePtr res = (virLockSpaceResourcePtr)tmp->value;
virJSONValuePtr child = virJSONValueNewObject();
}
-static int
-testHashGetItemsCompKey(const virHashKeyValuePair *a,
- const virHashKeyValuePair *b)
-{
- return strcmp(a->key, b->key);
-}
-
static int
testHashGetItems(const void *data G_GNUC_UNUSED)
{
goto cleanup;
}
- if (!(array = virHashGetItems(hash, NULL)) ||
+ if (!(array = virHashGetItems(hash, NULL, false)) ||
array[3].key || array[3].value) {
VIR_TEST_VERBOSE("\nfailed to get items with NULL sort");
goto cleanup;
}
VIR_FREE(array);
- if (!(array = virHashGetItems(hash, testHashGetItemsCompKey)) ||
+ if (!(array = virHashGetItems(hash, NULL, true)) ||
STRNEQ(array[0].key, "a") ||
STRNEQ(array[0].value, "3") ||
STRNEQ(array[1].key, "b") ||