From: Kristian Høgsberg Date: Tue, 22 Jan 2008 03:40:54 +0000 (-0500) Subject: Use iterators for razor_set_diff() implementation. X-Git-Tag: 0.1~257 X-Git-Url: http://project.juiblex.co.uk/git/?a=commitdiff_plain;h=911acdcf86b475550bff7765f06dea1f6d5f2b93;p=razor2.git%2F.git Use iterators for razor_set_diff() implementation. --- diff --git a/razor.c b/razor.c index 4384ec0..64b323b 100644 --- a/razor.c +++ b/razor.c @@ -1784,39 +1784,37 @@ void razor_set_diff(struct razor_set *set, struct razor_set *upstream, razor_package_callback_t callback, void *data) { - struct razor_package *p, *pend, *u, *uend; - char *ppool, *upool; + struct razor_package_iterator *pi1, *pi2; + struct razor_package *p1, *p2; + const char *name1, *name2, *version1, *version2; int res = 0; - p = set->packages.data; - pend = set->packages.data + set->packages.size; - ppool = set->string_pool.data; + pi1 = razor_package_iterator_create(set); + pi2 = razor_package_iterator_create(upstream); - u = upstream->packages.data; - uend = upstream->packages.data + upstream->packages.size; - upool = upstream->string_pool.data; + razor_package_iterator_next(pi1, &p1, &name1, &version1); + razor_package_iterator_next(pi2, &p2, &name2, &version2); - while (p < pend || u < uend) { - if (p < pend && u < uend) { - res = strcmp(&ppool[p->name], &upool[u->name]); + while (p1 || p2) { + if (p1 && p2) { + res = strcmp(name1, name2); if (res == 0) - res = versioncmp(&ppool[p->version], - &upool[u->version]); + res = versioncmp(version1, version2); } - if (u == uend || res < 0) { - callback(&ppool[p->name], &ppool[p->version], - NULL, data); - p++; - continue; - } else if (p == pend || res > 0) { - callback(&upool[u->name], NULL, &upool[u->version], - data); - u++; - continue; - } else { - p++; - u++; - } + if (p2 == NULL || res < 0) + callback(name1, version1, NULL, data); + else if (p1 == NULL || res > 0) + callback(name2, NULL, version2, data); + + if (p1 != NULL && res <= 0) + razor_package_iterator_next(pi1, &p1, + &name1, &version1); + if (p2 != NULL && res >= 0) + razor_package_iterator_next(pi2, &p2, + &name2, &version2); } + + razor_package_iterator_destroy(pi1); + razor_package_iterator_destroy(pi2); }