Add function to check if lists are equal

This commit is contained in:
morganamilo 2023-11-16 02:49:38 +00:00 committed by Allan McRae
parent e1dc609939
commit 196de7e94a
2 changed files with 61 additions and 0 deletions

View file

@ -509,6 +509,51 @@ char SYMEXPORT *alpm_list_find_str(const alpm_list_t *haystack,
(alpm_list_fn_cmp)strcmp);
}
int SYMEXPORT alpm_list_cmp_unsorted(const alpm_list_t *left,
const alpm_list_t *right, alpm_list_fn_cmp fn)
{
const alpm_list_t *l = left;
const alpm_list_t *r = right;
int *matched;
/* short circuiting length comparison */
while(l && r) {
l = l->next;
r = r->next;
}
if(l || r) {
return 0;
}
matched = calloc(alpm_list_count(right), sizeof(int));
for(l = left; l; l = l->next) {
int found = 0;
int n = 0;
for(r = right; r; r = r->next, n++) {
/* make sure we don't match the same value twice */
if(matched[n]) {
continue;
}
if(fn(l->data, r->data) == 0) {
found = 1;
matched[n] = 1;
break;
}
}
if(!found) {
free(matched);
return 0;
}
}
free(matched);
return 1;
}
void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
const alpm_list_t *right, alpm_list_fn_cmp fn,
alpm_list_t **onlyleft, alpm_list_t **onlyright)

View file

@ -328,6 +328,22 @@ void *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle);
*/
char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
/**
* @brief Check if two lists contain the same data, ignoring order.
*
* Lists are considered equal if they both contain the same data regardless
* of order.
*
* @param left the first list
* @param right the second list
* @param fn the comparison function
*
* @return 1 if the lists are equal, 0 otherwise.
*/
int alpm_list_cmp_unsorted(const alpm_list_t *left,
const alpm_list_t *right, alpm_list_fn_cmp fn);
/**
* @brief Find the differences between list `left` and list `right`
*