librazor/razor.c
changeset 302 9b71b537d175
parent 301 4124c37fd953
child 304 bf23ba00db03
     1.1 --- a/librazor/razor.c	Sun Jun 29 17:32:19 2008 +0100
     1.2 +++ b/librazor/razor.c	Mon Jun 30 08:51:26 2008 +0100
     1.3 @@ -23,6 +23,7 @@
     1.4  #include <stddef.h>
     1.5  #include <stdint.h>
     1.6  #include <stdio.h>
     1.7 +#include <stdarg.h>
     1.8  #include <string.h>
     1.9  #include <sys/types.h>
    1.10  #include <sys/stat.h>
    1.11 @@ -387,13 +388,13 @@
    1.12  {
    1.13  	struct razor_package_iterator *pi;
    1.14  	struct razor_package *p;
    1.15 -	const char *name, *version, *arch;
    1.16 +	const char *name;
    1.17  
    1.18  	assert (set != NULL);
    1.19  	assert (package != NULL);
    1.20  
    1.21  	pi = razor_package_iterator_create(set);
    1.22 -	while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) {
    1.23 +	while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, 0)) {
    1.24  		if (strcmp(package, name) == 0)
    1.25  			break;
    1.26  	}
    1.27 @@ -402,25 +403,94 @@
    1.28  	return p;
    1.29  }
    1.30  
    1.31 +static const char *
    1.32 +razor_package_get_details_type(struct razor_set *set,
    1.33 +			       struct razor_package *package,
    1.34 +			       enum razor_detail_type type)
    1.35 +{
    1.36 +	const char *pool;
    1.37 +
    1.38 +	switch (type) {
    1.39 +	case RAZOR_DETAIL_NAME:
    1.40 +		pool = set->string_pool.data;
    1.41 +		return &pool[package->name];
    1.42 +
    1.43 +	case RAZOR_DETAIL_VERSION:
    1.44 +		pool = set->string_pool.data;
    1.45 +		return &pool[package->version];
    1.46 +
    1.47 +	case RAZOR_DETAIL_ARCH:
    1.48 +		pool = set->string_pool.data;
    1.49 +		return &pool[package->arch];
    1.50 +
    1.51 +	case RAZOR_DETAIL_SUMMARY:
    1.52 +		pool = set->details_string_pool.data;
    1.53 +		return &pool[package->summary];
    1.54 +
    1.55 +	case RAZOR_DETAIL_DESCRIPTION:
    1.56 +		pool = set->details_string_pool.data;
    1.57 +		return &pool[package->description];
    1.58 +
    1.59 +	case RAZOR_DETAIL_URL:
    1.60 +		pool = set->details_string_pool.data;
    1.61 +		return &pool[package->url];
    1.62 +
    1.63 +	case RAZOR_DETAIL_LICENSE:
    1.64 +		pool = set->details_string_pool.data;
    1.65 +		return &pool[package->license];
    1.66 +
    1.67 +	default:
    1.68 +		fprintf(stderr, "type %u not found\n", type);
    1.69 +		return NULL;
    1.70 +	}
    1.71 +}
    1.72 +
    1.73 +/**
    1.74 + * razor_package_get_details_varg:
    1.75 + * @set: a %razor_set
    1.76 + * @package: a %razor_package
    1.77 + * @args: a va_list of arguments to set
    1.78 + **/
    1.79 +void
    1.80 +razor_package_get_details_varg(struct razor_set *set,
    1.81 +			       struct razor_package *package,
    1.82 +			       va_list args)
    1.83 +{
    1.84 +	int i;
    1.85 +	enum razor_detail_type type;
    1.86 +	const char **data;
    1.87 +
    1.88 +	for (i = 0;; i += 2) {
    1.89 +		type = va_arg(args, enum razor_detail_type);
    1.90 +		if (type == 0)
    1.91 +			break;
    1.92 +		data = va_arg(args, const char **);
    1.93 +		*data = razor_package_get_details_type(set, package, type);
    1.94 +	}
    1.95 +
    1.96 +}
    1.97 +
    1.98 +/**
    1.99 + * razor_package_get_details:
   1.100 + * @set: a %razor_set
   1.101 + * @package: a %razor_package
   1.102 + *
   1.103 + * Gets details about a package using a varg interface
   1.104 + * The vararg must be terminated with zero.
   1.105 + *
   1.106 + * Example: razor_package_get_details (set, package, RAZOR_DETAIL_URL, &url, 0);
   1.107 + **/
   1.108  RAZOR_EXPORT void
   1.109 -razor_package_get_details(struct razor_set *set,
   1.110 -			  struct razor_package *package,
   1.111 -			  const char **summary, const char **description,
   1.112 -			  const char **url, const char **license)
   1.113 +razor_package_get_details(struct razor_set *set, struct razor_package *package, ...)
   1.114  {
   1.115 -	const char *pool = set->details_string_pool.data;
   1.116 +	va_list args;
   1.117  
   1.118  	assert (set != NULL);
   1.119  	assert (package != NULL);
   1.120  
   1.121 -	if (summary != NULL)
   1.122 -		*summary = &pool[package->summary];
   1.123 -	if (description != NULL)
   1.124 -		*description = &pool[package->description];
   1.125 -	if (url != NULL)
   1.126 -		*url = &pool[package->url];
   1.127 -	if (license != NULL)
   1.128 -		*license = &pool[package->license];
   1.129 +	va_start(args, NULL);
   1.130 +	razor_package_get_details_varg (set, package, args);
   1.131 +	va_end (args);
   1.132  }
   1.133  
   1.134  RAZOR_EXPORT const char *
   1.135 @@ -647,8 +717,16 @@
   1.136  	pi1 = razor_package_iterator_create(set);
   1.137  	pi2 = razor_package_iterator_create(upstream);
   1.138  
   1.139 -	razor_package_iterator_next(pi1, &p1, &name1, &version1, &arch1);
   1.140 -	razor_package_iterator_next(pi2, &p2, &name2, &version2, &arch2);
   1.141 +	razor_package_iterator_next(pi1, &p1,
   1.142 +				    RAZOR_DETAIL_NAME, &name1,
   1.143 +				    RAZOR_DETAIL_VERSION, &version1,
   1.144 +				    RAZOR_DETAIL_ARCH, &arch1,
   1.145 +				    0);
   1.146 +	razor_package_iterator_next(pi2, &p2,
   1.147 +				    RAZOR_DETAIL_NAME, &name2,
   1.148 +				    RAZOR_DETAIL_VERSION, &version2,
   1.149 +				    RAZOR_DETAIL_ARCH, &arch2,
   1.150 +				    0);
   1.151  
   1.152  	while (p1 || p2) {
   1.153  		if (p1 && p2) {
   1.154 @@ -668,10 +746,16 @@
   1.155  
   1.156  		if (p1 != NULL && res <= 0)
   1.157  			razor_package_iterator_next(pi1, &p1,
   1.158 -						    &name1, &version1, &arch1);
   1.159 +						    RAZOR_DETAIL_NAME, &name1,
   1.160 +						    RAZOR_DETAIL_VERSION, &version1,
   1.161 +						    RAZOR_DETAIL_ARCH, &arch1,
   1.162 +						    0);
   1.163  		if (p2 != NULL && res >= 0)
   1.164  			razor_package_iterator_next(pi2, &p2,
   1.165 -						    &name2, &version2, &arch2);
   1.166 +						    RAZOR_DETAIL_NAME, &name2,
   1.167 +						    RAZOR_DETAIL_VERSION, &version2,
   1.168 +						    RAZOR_DETAIL_ARCH, &arch2,
   1.169 +						    0);
   1.170  	}
   1.171  
   1.172  	razor_package_iterator_destroy(pi1);