7 #include "rpmio/digest.h"
11 #define DIGESTS_MAX 12
12 struct rpmDigestBundle_s {
13 int index_max; /*!< Largest index of active digest */
14 off_t nbytes; /*!< Length of total input data */
15 DIGEST_CTX digests[DIGESTS_MAX]; /*!< Digest contexts identified by id */
16 int ids[DIGESTS_MAX]; /*!< Digest ID (arbitrary non-zero) */
19 static int findID(rpmDigestBundle bundle, int id)
23 for (int i = 0; i < DIGESTS_MAX; i++) {
24 if (bundle->ids[i] == id) {
33 rpmDigestBundle rpmDigestBundleNew(void)
35 rpmDigestBundle bundle = xcalloc(1, sizeof(*bundle));
39 rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle)
42 for (int i = 0; i <= bundle->index_max ; i++) {
43 if (bundle->digests[i] == NULL)
45 rpmDigestFinal(bundle->digests[i], NULL, NULL, 0);
46 bundle->digests[i] = NULL;
48 memset(bundle, 0, sizeof(*bundle));
54 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
57 return rpmDigestBundleAddID(bundle, algo, algo, flags);
60 int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id,
64 if (id > 0 && findID(bundle, id) < 0) {
65 int ix = findID(bundle, 0); /* Find first free slot */
67 bundle->digests[ix] = rpmDigestInit(algo, flags);
68 if (bundle->digests[ix]) {
70 if (ix > bundle->index_max)
71 bundle->index_max = ix;
78 int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len)
81 if (bundle && data && len > 0) {
82 for (int i = 0; i <= bundle->index_max; i++) {
83 if (bundle->ids[i] > 0)
84 rc += rpmDigestUpdate(bundle->digests[i], data, len);
86 bundle->nbytes += len;
91 int rpmDigestBundleFinal(rpmDigestBundle bundle, int id,
92 void ** datap, size_t * lenp, int asAscii)
95 int ix = findID(bundle, id);
98 rc = rpmDigestFinal(bundle->digests[ix], datap, lenp, asAscii);
99 bundle->digests[ix] = NULL;
105 DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int id)
107 int ix = findID(bundle, id);
108 DIGEST_CTX dup = (ix >= 0) ? rpmDigestDup(bundle->digests[ix]) : NULL;