librazor/iterator.c
changeset 302 9b71b537d175
parent 301 4124c37fd953
child 303 2d450078e46e
     1.1 --- a/librazor/iterator.c	Sun Jun 29 17:32:19 2008 +0100
     1.2 +++ b/librazor/iterator.c	Mon Jun 30 08:51:26 2008 +0100
     1.3 @@ -19,6 +19,7 @@
     1.4  
     1.5  #define _GNU_SOURCE
     1.6  
     1.7 +#include <stdarg.h>
     1.8  #include <string.h>
     1.9  #include <assert.h>
    1.10  
    1.11 @@ -105,14 +106,21 @@
    1.12  	return razor_package_iterator_create_with_index(set, index);
    1.13  }
    1.14  
    1.15 +/**
    1.16 + * razor_package_iterator_next:
    1.17 + * @pi: a %razor_package_iterator
    1.18 + * @package: a %razor_package
    1.19 + *
    1.20 + * Gets the next iteratr along with any vararg data.
    1.21 + * The vararg must be terminated with zero.
    1.22 + *
    1.23 + * Example: razor_package_iterator_next (pi, package, RAZOR_DETAIL_NAME, &name, 0);
    1.24 + **/
    1.25  RAZOR_EXPORT int
    1.26  razor_package_iterator_next(struct razor_package_iterator *pi,
    1.27 -			    struct razor_package **package,
    1.28 -			    const char **name,
    1.29 -			    const char **version,
    1.30 -			    const char **arch)
    1.31 +			    struct razor_package **package, ...)
    1.32  {
    1.33 -	char *pool;
    1.34 +	va_list args;
    1.35  	int valid;
    1.36  	struct razor_package *p, *packages;
    1.37  
    1.38 @@ -129,16 +137,17 @@
    1.39  	} else
    1.40  		valid = 0;
    1.41  
    1.42 -	if (valid) {
    1.43 -		pool = pi->set->string_pool.data;
    1.44 -		*package = p;
    1.45 -		*name = &pool[p->name];
    1.46 -		*version = &pool[p->version];
    1.47 -		*arch = &pool[p->arch];
    1.48 -	} else {
    1.49 +	if (valid == 0) {
    1.50  		*package = NULL;
    1.51 +		goto out;
    1.52  	}
    1.53  
    1.54 +	*package = p;
    1.55 +
    1.56 +	va_start(args, NULL);
    1.57 +	razor_package_get_details_varg (pi->set, p, args);
    1.58 +	va_end (args);
    1.59 +out:
    1.60  	return valid;
    1.61  }
    1.62  
    1.63 @@ -260,13 +269,12 @@
    1.64  				 struct razor_package_iterator *pi)
    1.65  {
    1.66  	struct razor_package *packages, *p;
    1.67 -	const char *name, *version, *arch;
    1.68  
    1.69  	assert (pq != NULL);
    1.70  	assert (pi != NULL);
    1.71  
    1.72  	packages = pq->set->packages.data;
    1.73 -	while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
    1.74 +	while (razor_package_iterator_next(pi, &p, 0)) {
    1.75  		pq->count += pq->vector[p - packages] ^ 1;
    1.76  		pq->vector[p - packages] = 1;
    1.77  	}