1.1 --- a/librazor/razor.c Sun Jun 29 17:32:19 2008 +0100
1.2 +++ b/librazor/razor.c Mon Jun 30 09:47:32 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);