10 #include <rpm/rpmstring.h>
11 #include <rpm/rpmps.h>
16 int numProblems; /*!< Current probs array size. */
17 int numProblemsAlloced; /*!< Allocated probs array size. */
18 rpmProblem *probs; /*!< Array of pointers to specific problems. */
19 int nrefs; /*!< Reference count. */
28 static rpmps rpmpsUnlink(rpmps ps)
36 rpmps rpmpsLink(rpmps ps)
44 int rpmpsNumProblems(rpmps ps)
48 numProblems = ps->numProblems;
52 rpmpsi rpmpsInitIterator(rpmps ps)
55 if (ps != NULL && ps->numProblems > 0) {
56 psi = xcalloc(1, sizeof(*psi));
57 psi->ps = rpmpsLink(ps);
63 rpmpsi rpmpsFreeIterator(rpmpsi psi)
72 rpmProblem rpmpsiNext(rpmpsi psi)
75 if (psi != NULL && psi->ps != NULL && ++psi->ix >= 0) {
77 if (psi->ix < ps->numProblems) {
78 p = ps->probs[psi->ix];
86 int rpmpsNextIterator(rpmpsi psi)
88 return (rpmpsiNext(psi) != NULL) ? psi->ix : -1;
91 rpmProblem rpmpsGetProblem(rpmpsi psi)
94 if (psi != NULL && psi->ix >= 0 && psi->ix < rpmpsNumProblems(psi->ps)) {
95 p = psi->ps->probs[psi->ix];
100 rpmps rpmpsCreate(void)
102 rpmps ps = xcalloc(1, sizeof(*ps));
103 return rpmpsLink(ps);
106 rpmps rpmpsFree(rpmps ps)
108 if (ps == NULL) return NULL;
110 return rpmpsUnlink(ps);
114 rpmpsi psi = rpmpsInitIterator(ps);
115 while (rpmpsNextIterator(psi) >= 0) {
116 rpmProblemFree(rpmpsGetProblem(psi));
118 rpmpsFreeIterator(psi);
119 ps->probs = _free(ps->probs);
125 void rpmpsAppendProblem(rpmps ps, rpmProblem prob)
127 if (ps == NULL || prob == NULL) return;
129 if (ps->numProblems == ps->numProblemsAlloced) {
130 if (ps->numProblemsAlloced)
131 ps->numProblemsAlloced *= 2;
133 ps->numProblemsAlloced = 2;
134 ps->probs = xrealloc(ps->probs,
135 ps->numProblemsAlloced * sizeof(*ps->probs));
138 ps->probs[ps->numProblems] = rpmProblemLink(prob);
143 * TODO: filter out duplicates while merging. Also horribly inefficient... */
144 int rpmpsMerge(rpmps dest, rpmps src)
149 rpmpsi spi = rpmpsInitIterator(src);
150 while ((p = rpmpsiNext(spi)) != NULL) {
151 rpmpsAppendProblem(dest, p);
154 rpmpsFreeIterator(spi);
159 void rpmpsPrint(FILE *fp, rpmps ps)
162 rpmpsi psi = rpmpsInitIterator(ps);
163 FILE *f = (fp != NULL) ? fp : stderr;
165 while ((p = rpmpsiNext(psi))) {
166 char *msg = rpmProblemString(p);
167 fprintf(f, "\t%s\n", msg);
170 rpmpsFreeIterator(psi);