From c6045dca519b0d576d9b08ef2c9833527d11f2e1 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Mon, 30 Jun 2008 08:51:26 +0100 Subject: convert razor_package_get_details() and razor_package_iterator_next() to varargs The functions for getting package details about a package were limited to a few things, when in the future we will want to support much more about a package. The iterator was also limited to name,version,arch when most of the time we didn't need all this data. --- librazor/iterator.c | 36 ++++++++------ librazor/razor-internal.h | 8 +++ librazor/razor.c | 122 ++++++++++++++++++++++++++++++++++++++-------- librazor/razor.h | 19 +++++--- librazor/transaction.c | 41 ++++++++++------ src/main.c | 42 ++++++++++------ src/rpm.c | 32 ++++++------ 7 files changed, 215 insertions(+), 85 deletions(-) diff --git a/librazor/iterator.c b/librazor/iterator.c index 5a870cc..e40425a 100644 --- a/librazor/iterator.c +++ b/librazor/iterator.c @@ -19,6 +19,7 @@ #define _GNU_SOURCE +#include #include #include @@ -105,14 +106,21 @@ razor_package_iterator_create_for_file(struct razor_set *set, return razor_package_iterator_create_with_index(set, index); } +/** + * razor_package_iterator_next: + * @pi: a %razor_package_iterator + * @package: a %razor_package + * + * Gets the next iteratr along with any vararg data. + * The vararg must be terminated with zero. + * + * Example: razor_package_iterator_next (pi, package, RAZOR_DETAIL_NAME, &name, 0); + **/ RAZOR_EXPORT int razor_package_iterator_next(struct razor_package_iterator *pi, - struct razor_package **package, - const char **name, - const char **version, - const char **arch) + struct razor_package **package, ...) { - char *pool; + va_list args; int valid; struct razor_package *p, *packages; @@ -129,16 +137,17 @@ razor_package_iterator_next(struct razor_package_iterator *pi, } else valid = 0; - if (valid) { - pool = pi->set->string_pool.data; - *package = p; - *name = &pool[p->name]; - *version = &pool[p->version]; - *arch = &pool[p->arch]; - } else { + if (valid == 0) { *package = NULL; + goto out; } + *package = p; + + va_start(args, NULL); + razor_package_get_details_varg (pi->set, p, args); + va_end (args); +out: return valid; } @@ -260,13 +269,12 @@ razor_package_query_add_iterator(struct razor_package_query *pq, struct razor_package_iterator *pi) { struct razor_package *packages, *p; - const char *name, *version, *arch; assert (pq != NULL); assert (pi != NULL); packages = pq->set->packages.data; - while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) { + while (razor_package_iterator_next(pi, &p, 0)) { pq->count += pq->vector[p - packages] ^ 1; pq->vector[p - packages] = 1; } diff --git a/librazor/razor-internal.h b/librazor/razor-internal.h index bf98cde..c47e4f1 100644 --- a/librazor/razor-internal.h +++ b/librazor/razor-internal.h @@ -22,6 +22,9 @@ #include #include +#include + +#include "razor.h" /* GCC visibility */ #if defined(__GNUC__) && __GNUC__ >= 4 @@ -207,6 +210,11 @@ razor_merger_finish(struct razor_merger *merger); /* Utility functions */ +void +razor_package_get_details_varg(struct razor_set *set, + struct razor_package *package, + va_list args); + int razor_create_dir(const char *root, const char *path); int razor_write(int fd, const void *data, size_t size); diff --git a/librazor/razor.c b/librazor/razor.c index 88ff7a7..d3cab33 100644 --- a/librazor/razor.c +++ b/librazor/razor.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -387,13 +388,13 @@ razor_set_get_package(struct razor_set *set, const char *package) { struct razor_package_iterator *pi; struct razor_package *p; - const char *name, *version, *arch; + const char *name; assert (set != NULL); assert (package != NULL); pi = razor_package_iterator_create(set); - while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) { + while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_NAME, &name, 0)) { if (strcmp(package, name) == 0) break; } @@ -402,25 +403,94 @@ razor_set_get_package(struct razor_set *set, const char *package) return p; } +static const char * +razor_package_get_details_type(struct razor_set *set, + struct razor_package *package, + enum razor_detail_type type) +{ + const char *pool; + + switch (type) { + case RAZOR_DETAIL_NAME: + pool = set->string_pool.data; + return &pool[package->name]; + + case RAZOR_DETAIL_VERSION: + pool = set->string_pool.data; + return &pool[package->version]; + + case RAZOR_DETAIL_ARCH: + pool = set->string_pool.data; + return &pool[package->arch]; + + case RAZOR_DETAIL_SUMMARY: + pool = set->details_string_pool.data; + return &pool[package->summary]; + + case RAZOR_DETAIL_DESCRIPTION: + pool = set->details_string_pool.data; + return &pool[package->description]; + + case RAZOR_DETAIL_URL: + pool = set->details_string_pool.data; + return &pool[package->url]; + + case RAZOR_DETAIL_LICENSE: + pool = set->details_string_pool.data; + return &pool[package->license]; + + default: + fprintf(stderr, "type %u not found\n", type); + return NULL; + } +} + +/** + * razor_package_get_details_varg: + * @set: a %razor_set + * @package: a %razor_package + * @args: a va_list of arguments to set + **/ +void +razor_package_get_details_varg(struct razor_set *set, + struct razor_package *package, + va_list args) +{ + int i; + enum razor_detail_type type; + const char **data; + + for (i = 0;; i += 2) { + type = va_arg(args, enum razor_detail_type); + if (type == 0) + break; + data = va_arg(args, const char **); + *data = razor_package_get_details_type(set, package, type); + } + +} + +/** + * razor_package_get_details: + * @set: a %razor_set + * @package: a %razor_package + * + * Gets details about a package using a varg interface + * The vararg must be terminated with zero. + * + * Example: razor_package_get_details (set, package, RAZOR_DETAIL_URL, &url, 0); + **/ RAZOR_EXPORT void -razor_package_get_details(struct razor_set *set, - struct razor_package *package, - const char **summary, const char **description, - const char **url, const char **license) +razor_package_get_details(struct razor_set *set, struct razor_package *package, ...) { - const char *pool = set->details_string_pool.data; + va_list args; assert (set != NULL); assert (package != NULL); - if (summary != NULL) - *summary = &pool[package->summary]; - if (description != NULL) - *description = &pool[package->description]; - if (url != NULL) - *url = &pool[package->url]; - if (license != NULL) - *license = &pool[package->license]; + va_start(args, NULL); + razor_package_get_details_varg (set, package, args); + va_end (args); } RAZOR_EXPORT const char * @@ -647,8 +717,16 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream, pi1 = razor_package_iterator_create(set); pi2 = razor_package_iterator_create(upstream); - razor_package_iterator_next(pi1, &p1, &name1, &version1, &arch1); - razor_package_iterator_next(pi2, &p2, &name2, &version2, &arch2); + razor_package_iterator_next(pi1, &p1, + RAZOR_DETAIL_NAME, &name1, + RAZOR_DETAIL_VERSION, &version1, + RAZOR_DETAIL_ARCH, &arch1, + 0); + razor_package_iterator_next(pi2, &p2, + RAZOR_DETAIL_NAME, &name2, + RAZOR_DETAIL_VERSION, &version2, + RAZOR_DETAIL_ARCH, &arch2, + 0); while (p1 || p2) { if (p1 && p2) { @@ -668,10 +746,16 @@ razor_set_diff(struct razor_set *set, struct razor_set *upstream, if (p1 != NULL && res <= 0) razor_package_iterator_next(pi1, &p1, - &name1, &version1, &arch1); + RAZOR_DETAIL_NAME, &name1, + RAZOR_DETAIL_VERSION, &version1, + RAZOR_DETAIL_ARCH, &arch1, + 0); if (p2 != NULL && res >= 0) razor_package_iterator_next(pi2, &p2, - &name2, &version2, &arch2); + RAZOR_DETAIL_NAME, &name2, + RAZOR_DETAIL_VERSION, &version2, + RAZOR_DETAIL_ARCH, &arch2, + 0); } razor_package_iterator_destroy(pi1); diff --git a/librazor/razor.h b/librazor/razor.h index 61edc1c..9f3c668 100644 --- a/librazor/razor.h +++ b/librazor/razor.h @@ -28,6 +28,16 @@ enum razor_repo_file_type { RAZOR_REPO_FILE_FILES }; +enum razor_detail_type { + RAZOR_DETAIL_NAME = 1, /* 0 is the marker for the vararg */ + RAZOR_DETAIL_VERSION, + RAZOR_DETAIL_ARCH, + RAZOR_DETAIL_SUMMARY, + RAZOR_DETAIL_DESCRIPTION, + RAZOR_DETAIL_URL, + RAZOR_DETAIL_LICENSE +}; + enum razor_property_flags { RAZOR_PROPERTY_LESS = 1 << 0, RAZOR_PROPERTY_GREATER = 1 << 1, @@ -84,9 +94,7 @@ struct razor_package * razor_set_get_package(struct razor_set *set, const char *package); void -razor_package_get_details(struct razor_set *set, struct razor_package *package, - const char **summary, const char **description, - const char **url, const char **license); +razor_package_get_details(struct razor_set *set, struct razor_package *package, ...); /** @@ -136,10 +144,7 @@ razor_package_iterator_create_for_file(struct razor_set *set, const char *filename); int razor_package_iterator_next(struct razor_package_iterator *pi, - struct razor_package **package, - const char **name, - const char **version, - const char **arch); + struct razor_package **package, ...); void razor_package_iterator_destroy(struct razor_package_iterator *pi); struct razor_package_query * diff --git a/librazor/transaction.c b/librazor/transaction.c index 11ccc74..9efd5cd 100644 --- a/librazor/transaction.c +++ b/librazor/transaction.c @@ -294,7 +294,7 @@ remove_matching_providers(struct razor_transaction *trans, struct razor_package *pkg, *pkgs; struct razor_package_iterator pkg_iter; struct razor_set *set; - const char *n, *v, *a; + const char *n, *v; uint32_t type; if (ppi->present == trans->system.properties) @@ -316,8 +316,9 @@ remove_matching_providers(struct razor_transaction *trans, continue; razor_package_iterator_init_for_property(&pkg_iter, set, p); - while (razor_package_iterator_next(&pkg_iter, - &pkg, &n, &v, &a)) { + while (razor_package_iterator_next(&pkg_iter, &pkg, + RAZOR_DETAIL_NAME, &n, + RAZOR_DETAIL_VERSION, &v, 0)) { fprintf(stderr, "removing %s-%s\n", n, v); razor_transaction_remove_package(trans, pkg); } @@ -335,7 +336,7 @@ flag_matching_providers(struct razor_transaction *trans, struct razor_package *pkg, *pkgs; struct razor_package_iterator pkg_iter; struct razor_set *set; - const char *name, *version, *arch; + const char *name, *version; uint32_t *flags, type; if (ppi->present == trans->system.properties) { @@ -362,7 +363,8 @@ flag_matching_providers(struct razor_transaction *trans, razor_package_iterator_init_for_property(&pkg_iter, set, p); while (razor_package_iterator_next(&pkg_iter, &pkg, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, 0)) { fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n", name, version, @@ -511,7 +513,7 @@ update_unsatisfied_packages(struct razor_transaction *trans) struct razor_property *sp; struct prop_iter spi; struct razor_package_iterator pkg_iter; - const char *name, *version, *arch; + const char *name; spkgs = trans->system.set->packages.data; prop_iter_init(&spi, &trans->system); @@ -524,7 +526,7 @@ update_unsatisfied_packages(struct razor_transaction *trans) trans->system.set, sp); while (razor_package_iterator_next(&pkg_iter, &pkg, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, 0)) { fprintf(stderr, "updating %s because %s %s %s " "isn't satisfied\n", name, spi.pool + sp->name, @@ -556,7 +558,7 @@ update_conflicted_packages(struct razor_transaction *trans) struct razor_property *up, *sp; struct prop_iter spi, upi; struct razor_package_iterator pkg_iter; - const char *name, *version, *arch; + const char *name, *version; spkgs = trans->system.set->packages.data; prop_iter_init(&spi, &trans->system); @@ -575,7 +577,8 @@ update_conflicted_packages(struct razor_transaction *trans) trans->system.set, sp); while (razor_package_iterator_next(&pkg_iter, &pkg, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, 0)) { fprintf(stderr, "updating %s %s because it " "conflicts with %s\n", name, version, spi.pool + sp->name); @@ -657,13 +660,15 @@ flush_scheduled_system_updates(struct razor_transaction *trans) struct razor_package_iterator *pi; struct razor_package *p, *pkg, *spkgs; struct prop_iter ppi; - const char *name, *version, *arch; + const char *name, *version; spkgs = trans->system.set->packages.data; pi = razor_package_iterator_create(trans->system.set); prop_iter_init(&ppi, &trans->upstream); - while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) { + while (razor_package_iterator_next(pi, &p, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, 0)) { if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE)) continue; @@ -692,13 +697,15 @@ flush_scheduled_upstream_updates(struct razor_transaction *trans) struct razor_package_iterator *pi; struct razor_package *p, *upkgs; struct prop_iter spi; - const char *name, *version, *arch; + const char *name, *version; upkgs = trans->upstream.set->packages.data; pi = razor_package_iterator_create(trans->upstream.set); prop_iter_init(&spi, &trans->system); - while (razor_package_iterator_next(pi, &p, &name, &version, &arch)) { + while (razor_package_iterator_next(pi, &p, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, 0)) { if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE)) continue; @@ -745,14 +752,18 @@ describe_unsatisfied(struct razor_set *set, struct razor_property *rp) if (pool[rp->version] == '\0') { razor_package_iterator_init_for_property(&pi, set, rp); while (razor_package_iterator_next(&pi, &pkg, - &name, &version, &arch)) + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) fprintf(stderr, "%s is needed by %s-%s.%s\n", &pool[rp->name], name, version, arch); } else { razor_package_iterator_init_for_property(&pi, set, rp); while (razor_package_iterator_next(&pi, &pkg, - &name, &version, &arch)) + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n", &pool[rp->name], razor_property_relation_to_string(rp), diff --git a/src/main.c b/src/main.c index 4e15164..56b3b2c 100644 --- a/src/main.c +++ b/src/main.c @@ -47,7 +47,7 @@ create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[]) struct razor_package_query *query; struct razor_package_iterator *iter; struct razor_package *package; - const char *name, *version, *arch, *pattern; + const char *name, *pattern; int i, count; if (argc == 0) @@ -59,8 +59,7 @@ create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[]) iter = razor_package_iterator_create(set); pattern = argv[i]; count = 0; - while (razor_package_iterator_next(iter, &package, - &name, &version, &arch)) { + while (razor_package_iterator_next(iter, &package, RAZOR_DETAIL_NAME, &name, 0)) { if (fnmatch(pattern, name, 0) != 0) continue; @@ -86,7 +85,9 @@ list_packages(struct razor_package_iterator *iter, uint32_t flags) const char *name, *version, *arch; while (razor_package_iterator_next(iter, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { if (flags & LIST_PACKAGES_ONLY_NAMES) printf("%s\n", name); else @@ -425,12 +426,12 @@ mark_packages_for_update(struct razor_transaction *trans, { struct razor_package_iterator *pi; struct razor_package *package; - const char *name, *version, *arch; + const char *name; int matches = 0; pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, 0)) { if (pattern && fnmatch(pattern, name, 0) == 0) { razor_transaction_update_package(trans, package); matches++; @@ -447,12 +448,11 @@ mark_packages_for_removal(struct razor_transaction *trans, { struct razor_package_iterator *pi; struct razor_package *package; - const char *name, *version, *arch; + const char *name; int matches = 0; pi = razor_package_iterator_create(set); - while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + while (razor_package_iterator_next(pi, &package, RAZOR_DETAIL_NAME, &name, 0)) { if (pattern && fnmatch(pattern, name, 0) == 0) { razor_transaction_remove_package(trans, package); matches++; @@ -660,7 +660,9 @@ download_packages(struct razor_set *system, struct razor_set *next) pi = razor_set_create_install_iterator(system, next); errors = 0; while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { snprintf(url, sizeof url, "%s/Packages/%s", yum_url, rpm_filename(name, version, arch)); @@ -690,7 +692,9 @@ install_packages(struct razor_set *system, struct razor_set *next) pi = razor_set_create_install_iterator(system, next); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { printf("install %s-%s\n", name, version); snprintf(file, sizeof file, @@ -796,7 +800,9 @@ command_download(int argc, const char *argv[]) set = razor_set_open(rawhide_repo_filename); pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { if (pattern && fnmatch(pattern, name, 0) != 0) continue; @@ -837,12 +843,18 @@ command_info(int argc, const char *argv[]) return 1; pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { if (pattern && fnmatch(pattern, name, 0) != 0) continue; - razor_package_get_details (set, package, &summary, &description, - &url, &license); + razor_package_get_details (set, package, + RAZOR_DETAIL_SUMMARY, &summary, + RAZOR_DETAIL_DESCRIPTION, &description, + RAZOR_DETAIL_URL, &url, + RAZOR_DETAIL_LICENSE, &license, + 0); printf ("Name: %s\n", name); printf ("Arch: %s\n", arch); diff --git a/src/rpm.c b/src/rpm.c index 872f926..76f2414 100644 --- a/src/rpm.c +++ b/src/rpm.c @@ -303,7 +303,7 @@ add_command_line_packages(struct razor_set *set, { struct razor_package *package; struct razor_package_iterator *pi; - const char *name, *version, *arch; + const char *name; int i, cmp, errors; qsort(argv, argc, sizeof(*argv), strcmpp); @@ -313,7 +313,7 @@ add_command_line_packages(struct razor_set *set, pi = razor_package_iterator_create(set); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, 0)) { while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) { fprintf(stderr, "error: package %s is not installed\n", argv[i]); @@ -417,8 +417,12 @@ print_package_info(struct razor_set *set, struct razor_package *package, { const char *summary, *description, *url, *license; - razor_package_get_details(set, package, &summary, &description, - &url, &license); + razor_package_get_details (set, package, + RAZOR_DETAIL_SUMMARY, &summary, + RAZOR_DETAIL_DESCRIPTION, &description, + RAZOR_DETAIL_URL, &url, + RAZOR_DETAIL_LICENSE, &license, + 0); printf("Name: %s\n", name); printf("Arch: %s\n", arch); @@ -488,7 +492,9 @@ command_query(int argc, const char *argv[]) pi = get_query_packages(set, argc, argv); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { if (option_conflicts) print_package_properties(set, package, RAZOR_PROPERTY_CONFLICTS); @@ -540,7 +546,9 @@ command_verify(int argc, const char *argv[]) pi = get_query_packages(set, argc, argv); while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) { + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, 0)) { printf("verify %s-%s.%s - not implemented\n", name, version, arch); } @@ -570,7 +578,6 @@ command_erase(int argc, const char *argv[]) struct razor_package_query *query; struct razor_package_iterator *pi; struct razor_package *package; - const char *name, *version, *arch; if (argc == 0) { printf("no packages given for erase\n"); @@ -586,8 +593,7 @@ command_erase(int argc, const char *argv[]) add_command_line_packages(set, query, argc, argv); pi = razor_package_query_finish(query); - while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) + while (razor_package_iterator_next(pi, &package, 0)) razor_transaction_remove_package(trans, package); razor_package_iterator_destroy(pi); @@ -617,7 +623,6 @@ command_install(int argc, const char *argv[]) struct razor_transaction *trans; struct razor_package_iterator *pi; struct razor_package *package; - const char *name, *version, *arch; if (argc == 0) { printf("no packages given for install\n"); @@ -630,8 +635,7 @@ command_install(int argc, const char *argv[]) trans = razor_transaction_create(set, upstream); pi = razor_package_iterator_create(upstream); - while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) + while (razor_package_iterator_next(pi, &package, 0)) razor_transaction_install_package(trans, package); razor_package_iterator_destroy(pi); @@ -661,7 +665,6 @@ command_update(int argc, const char *argv[]) struct razor_transaction *trans; struct razor_package_iterator *pi; struct razor_package *package; - const char *name, *version, *arch; if (argc == 0) { printf("no packages given for update\n"); @@ -674,8 +677,7 @@ command_update(int argc, const char *argv[]) trans = razor_transaction_create(set, upstream); pi = razor_package_iterator_create(upstream); - while (razor_package_iterator_next(pi, &package, - &name, &version, &arch)) + while (razor_package_iterator_next(pi, &package, 0)) razor_transaction_update_package(trans, package); razor_package_iterator_destroy(pi); -- cgit v1.2.3