From 96ad2a1fee7528e182f3923440f7b3038e996c8d Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Thu, 18 Oct 2007 13:45:25 +0300 Subject: [PATCH] Add API for iterating over rpmps problems --- lib/rpmps.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/rpmps.h | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/lib/rpmps.c b/lib/rpmps.c index 8e991e6..d536c17 100644 --- a/lib/rpmps.c +++ b/lib/rpmps.c @@ -40,6 +40,50 @@ int rpmpsNumProblems(rpmps ps) return numProblems; } +rpmpsi rpmpsInitIterator(rpmps ps) +{ + rpmpsi psi = NULL; + if (ps != NULL) { + psi = xcalloc(1, sizeof(*psi)); + psi->ps = rpmpsLink(ps, "iter ref"); + psi->ix = -1; + } + return psi; +} + +rpmpsi rpmpsFreeIterator(rpmpsi psi) +{ + if (psi != NULL) { + rpmpsUnlink(psi->ps, "iter unref"); + free(psi); + psi = NULL; + } + return psi; +} + +int rpmpsNextIterator(rpmpsi psi) +{ + int i = -1; + + if (psi != NULL && ++psi->ix >= 0) { + if (psi->ix < rpmpsNumProblems(psi->ps)) { + i = psi->ix; + } else { + psi->ix = -1; + } + } + return i; +} + +rpmProblem rpmpsProblem(rpmpsi psi) +{ + rpmProblem p = NULL; + if (psi != NULL && psi->ix >= 0 && psi->ix < rpmpsNumProblems(psi->ps)) { + p = psi->ps->probs + psi->ix; + } + return p; +} + rpmps rpmpsCreate(void) { rpmps ps = xcalloc(1, sizeof(*ps)); diff --git a/lib/rpmps.h b/lib/rpmps.h index b0c591b..35fc34e 100644 --- a/lib/rpmps.h +++ b/lib/rpmps.h @@ -24,6 +24,8 @@ typedef struct rpmProblem_s * rpmProblem; */ typedef struct rpmps_s * rpmps; +typedef struct rpmpsi_s * rpmpsi; + /** * Enumerate transaction set problem types. */ @@ -62,6 +64,11 @@ struct rpmps_s { int nrefs; /*!< Reference count. */ }; +struct rpmpsi_s { + size_t ix; + rpmps ps; +}; + /** * Return formatted string representation of a problem. * @param prob rpm problem @@ -104,6 +111,34 @@ rpmps XrpmpsLink (rpmps ps, int rpmpsNumProblems(rpmps ps); /** + * Initialize problem set iterator. + * @param ps problem set + * @return problem set iterator + */ +rpmpsi rpmpsInitIterator(rpmps ps); + +/** + * Destroy problem set iterator. + * @param psi problem set iterator + * @return problem set iterator (NULL) + */ +rpmpsi rpmpsFreeIterator(rpmpsi psi); + +/** + * Return next problem set iterator index + * @param psi problem set iterator + * @return iterator index, -1 on termination + */ +int rpmpsNextIterator(rpmpsi psi); + +/** + * Return current problem from problem set + * @param psi problem set iterator + * @return current rpmProblem + */ +rpmProblem rpmpsProblem(rpmpsi psi); + +/** * Create a problem set. * @return new problem set */ -- 2.7.4