poldek: poldek/pkg.c, poldek/pkg.h - pkg_cap_iter()ator + generali...
mis
mis at pld-linux.org
Sun Jul 8 18:51:04 CEST 2007
Author: mis Date: Sun Jul 8 16:51:04 2007 GMT
Module: poldek Tag: HEAD
---- Log message:
- pkg_cap_iter()ator + generalized pkg_requires_cap()
---- Files affected:
poldek/poldek:
pkg.c (1.117 -> 1.118) , pkg.h (1.79 -> 1.80)
---- Diffs:
================================================================
Index: poldek/poldek/pkg.c
diff -u poldek/poldek/pkg.c:1.117 poldek/poldek/pkg.c:1.118
--- poldek/poldek/pkg.c:1.117 Mon Jul 2 18:39:22 2007
+++ poldek/poldek/pkg.c Sun Jul 8 18:50:58 2007
@@ -819,38 +819,53 @@
return 1;
}
-int pkg_requires_versioned_cap(const struct pkg *pkg, const struct capreq *cap)
+const struct capreq *pkg_requires_cap(const struct pkg *pkg,
+ const struct capreq *cap)
{
- int i, rc = 0;
-
- DBGF("%s requires %s (reqs=%p, size=%d)?\n", pkg_id(pkg), capreq_snprintf_s(cap), pkg->reqs,
- pkg->reqs ? n_array_size(pkg->reqs) : 0);
+ struct capreq *rreq = NULL;
+ int i;
+
+
+ DBGF("%s requires %s (reqs=%p, size=%d)?\n", pkg_id(pkg),
+ capreq_snprintf_s(cap), pkg->reqs,
+ pkg->reqs ? n_array_size(pkg->reqs) : 0);
if (pkg->reqs == NULL)
- return 0;
-
+ return NULL;
+
n_array_sort(pkg->reqs);
i = n_array_bsearch_idx_ex(pkg->reqs, cap, (tn_fn_cmp)capreq_cmp_name);
if (i == -1)
- return 0;
+ return NULL;
while (i < n_array_size(pkg->reqs)) {
struct capreq *req = n_array_nth(pkg->reqs, i);
+ int matched = 0;
+
i++;
if (strcmp(capreq_name(req), capreq_name(cap)) != 0)
break;
+ if (!capreq_versioned(cap)) {
+ rreq = req;
+ break;
+ }
+
if (!capreq_versioned(req))
continue;
- rc = cap_match_req(cap, req, 1);
- DBGF(" cap_match_req %s %s => %d\n", capreq_snprintf_s(cap), capreq_snprintf_s0(req), rc);
- if (rc)
+ matched = cap_match_req(cap, req, 1);
+ DBGF(" cap_match_req %s %s => %d\n", capreq_snprintf_s(cap),
+ capreq_snprintf_s0(req), matched);
+
+ if (matched) {
+ rreq = req;
break;
+ }
}
- return rc;
+ return rreq;
}
@@ -1429,4 +1444,61 @@
return n_snprintf(str, size, "%s-%s.%s", pkg->ver, pkg->rel,
pkg_arch(pkg));
+}
+
+
+struct pkg_cap_iter {
+ struct pkg *pkg;
+ struct capreq *cap;
+ int ncap;
+ struct pkgfl_it fit;
+ int fit_initialized;
+};
+
+const struct capreq *pkg_cap_iter_get(struct pkg_cap_iter *it)
+{
+ struct capreq *cap;
+ const char *path;
+
+ if (it->pkg->caps && it->ncap < n_array_size(it->pkg->caps)) {
+ cap = n_array_nth(it->pkg->caps, it->ncap);
+ it->ncap++;
+ return cap;
+ }
+
+ if (it->cap) {
+ capreq_free(it->cap);
+ it->cap = NULL;
+ }
+
+ if (it->pkg->fl == NULL)
+ return NULL;
+
+ if (!it->fit_initialized) {
+ pkgfl_it_init(&it->fit, it->pkg->fl);
+ it->fit_initialized = 1;
+ }
+
+ path = pkgfl_it_get(&it->fit, NULL);
+ if (path)
+ it->cap = capreq_new(NULL, path, 0, NULL, NULL, 0, 0);
+
+ return it->cap;
+}
+
+struct pkg_cap_iter *pkg_cap_iter_new(struct pkg *pkg)
+{
+ struct pkg_cap_iter *it = n_calloc(sizeof(*it), 1);
+ it->pkg = pkg;
+ it->ncap = 0;
+ it->cap = NULL;
+ it->fit_initialized = 0;
+ return it;
+}
+
+void pkg_cap_iter_free(struct pkg_cap_iter *it)
+{
+ if (it->cap)
+ capreq_free(it->cap);
+ memset(it, 0, sizeof(*it));
}
================================================================
Index: poldek/poldek/pkg.h
diff -u poldek/poldek/pkg.h:1.79 poldek/poldek/pkg.h:1.80
--- poldek/poldek/pkg.h:1.79 Fri Jun 22 00:29:49 2007
+++ poldek/poldek/pkg.h Sun Jul 8 18:50:58 2007
@@ -185,7 +185,8 @@
int pkg_obsoletes_pkg(const struct pkg *pkg, const struct pkg *opkg);
int pkg_caps_obsoletes_pkg_caps(const struct pkg *pkg, const struct pkg *opkg);
-int pkg_requires_versioned_cap(const struct pkg *pkg, const struct capreq *cap);
+const struct capreq *pkg_requires_cap(const struct pkg *pkg,
+ const struct capreq *cap);
int pkg_add_pkgcnfl(struct pkg *pkg, struct pkg *cpkg, int isbastard);
int pkg_has_pkgcnfl(struct pkg *pkg, struct pkg *cpkg);
@@ -268,6 +269,13 @@
void pkgs_array_dump(tn_array *pkgs, const char *prefix); /* for debugging */
tn_buf *pkgs_array_join(tn_array *pkgs, tn_buf *nbuf, const char *sep);
+
+
+struct pkg_cap_iter *pkg_cap_iter_new(struct pkg *pkg);
+void pkg_cap_iter_free(struct pkg_cap_iter *it);
+const struct capreq *pkg_cap_iter_get(struct pkg_cap_iter *it);
+
+
#endif
#endif /* POLDEK_PKG_H */
================================================================
---- CVS-web:
http://cvs.pld-linux.org/poldek/poldek/pkg.c?r1=1.117&r2=1.118&f=u
http://cvs.pld-linux.org/poldek/poldek/pkg.h?r1=1.79&r2=1.80&f=u
More information about the pld-cvs-commit
mailing list