Add function to compare two hash tables for equality. --- src/util/hash.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/util/hash.h | 12 ++++++++++++ 2 files changed, 58 insertions(+) Index: libvirt-iterator/src/util/hash.c =================================================================== --- libvirt-iterator.orig/src/util/hash.c +++ libvirt-iterator/src/util/hash.c @@ -663,3 +663,49 @@ virHashKeyValuePairPtr virHashGetItems(v return iter.sortArray; } + +struct virHashEqualData +{ + bool equal; + const virHashTablePtr table2; + virHashValueComparator compar; +}; + +static int virHashEqualSearcher(const void *payload, const void *name, + const void *data) +{ + struct virHashEqualData *vhed = (void *)data; + const void *value; + + value = virHashLookup(vhed->table2, name); + if (!value || + vhed->compar(value, payload) != 0) { + /* key is missing in 2nd table or values are different */ + vhed->equal = false; + /* stop 'iteration' */ + return 1; + } + return 0; +} + +bool virHashEqual(const virHashTablePtr table1, + const virHashTablePtr table2, + virHashValueComparator compar) +{ + struct virHashEqualData data = { + .equal = true, + .table2 = table2, + .compar = compar, + }; + + if (table1 == table2) + return true; + + if (!table1 || !table2 || + virHashSize(table1) != virHashSize(table2)) + return false; + + virHashSearch(table1, virHashEqualSearcher, &data); + + return data.equal; +} Index: libvirt-iterator/src/util/hash.h =================================================================== --- libvirt-iterator.orig/src/util/hash.h +++ libvirt-iterator/src/util/hash.h @@ -154,6 +154,18 @@ virHashKeyValuePairPtr virHashGetItems(v virHashKeyComparator compar); /* + * Compare two tables for equality: the lookup of a key's value in + * both tables must result in an equivalent value. + * The caller must pass in a comparator function for comparing the values + * of two keys. + */ +typedef int (*virHashValueComparator)(const void *value1, const void *value2); +bool virHashEqual(const virHashTablePtr table1, + const virHashTablePtr table2, + virHashValueComparator compar); + + +/* * Iterators */ int virHashForEach(virHashTablePtr table, virHashIterator iter, void *data);