razor.c
changeset 104 705f6dbf0a7e
parent 102 337a7a55e2c6
child 105 2ddc6448762e
     1.1 --- a/razor.c	Thu Jan 17 23:36:12 2008 -0500
     1.2 +++ b/razor.c	Mon Jan 21 23:02:47 2008 -0500
     1.3 @@ -1784,39 +1784,37 @@
     1.4  razor_set_diff(struct razor_set *set, struct razor_set *upstream,
     1.5  	       razor_package_callback_t callback, void *data)
     1.6  {
     1.7 -	struct razor_package *p, *pend, *u, *uend;
     1.8 -	char *ppool, *upool;
     1.9 +	struct razor_package_iterator *pi1, *pi2;
    1.10 +	struct razor_package *p1, *p2;
    1.11 +	const char *name1, *name2, *version1, *version2;
    1.12  	int res = 0;
    1.13  
    1.14 -	p = set->packages.data;
    1.15 -	pend = set->packages.data + set->packages.size;
    1.16 -	ppool = set->string_pool.data;
    1.17 +	pi1 = razor_package_iterator_create(set);
    1.18 +	pi2 = razor_package_iterator_create(upstream);
    1.19  
    1.20 -	u = upstream->packages.data;
    1.21 -	uend = upstream->packages.data + upstream->packages.size;
    1.22 -	upool = upstream->string_pool.data;
    1.23 +	razor_package_iterator_next(pi1, &p1, &name1, &version1);
    1.24 +	razor_package_iterator_next(pi2, &p2, &name2, &version2);
    1.25  
    1.26 -	while (p < pend || u < uend) {
    1.27 -		if (p < pend && u < uend) {
    1.28 -			res = strcmp(&ppool[p->name], &upool[u->name]);
    1.29 +	while (p1 || p2) {
    1.30 +		if (p1 && p2) {
    1.31 +			res = strcmp(name1, name2);
    1.32  			if (res == 0)
    1.33 -				res = versioncmp(&ppool[p->version],
    1.34 -						 &upool[u->version]);
    1.35 +				res = versioncmp(version1, version2);
    1.36  		}
    1.37  
    1.38 -		if (u == uend || res < 0) {
    1.39 -			callback(&ppool[p->name], &ppool[p->version],
    1.40 -				 NULL, data);
    1.41 -			p++;
    1.42 -			continue;
    1.43 -		} else if (p == pend || res > 0) {
    1.44 -			callback(&upool[u->name], NULL, &upool[u->version],
    1.45 -				 data);
    1.46 -			u++;
    1.47 -			continue;
    1.48 -		} else {
    1.49 -			p++;
    1.50 -			u++;
    1.51 -		}
    1.52 +		if (p2 == NULL || res < 0)
    1.53 +			callback(name1, version1, NULL, data);
    1.54 +		else if (p1 == NULL || res > 0)
    1.55 +			callback(name2, NULL, version2, data);
    1.56 +
    1.57 +		if (p1 != NULL && res <= 0)
    1.58 +			razor_package_iterator_next(pi1, &p1,
    1.59 +						    &name1, &version1);
    1.60 +		if (p2 != NULL && res >= 0)
    1.61 +			razor_package_iterator_next(pi2, &p2,
    1.62 +						    &name2, &version2);
    1.63  	}
    1.64 +
    1.65 +	razor_package_iterator_destroy(pi1);
    1.66 +	razor_package_iterator_destroy(pi2);
    1.67  }