Handle config.guess and config.sub with DOS EOLs
[platform/upstream/rpm.git] / rpmio / digest.c
1 /** \ingroup signature
2  * \file rpmio/digest.c
3  */
4
5 #include "system.h"
6
7 #include "rpmio/digest.h"
8
9 #include "debug.h"
10
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) */
17 };
18
19 static int findID(rpmDigestBundle bundle, int id)
20 {
21     int ix = -1;
22     if (bundle) {
23         for (int i = 0; i < DIGESTS_MAX; i++) {
24             if (bundle->ids[i] == id) {
25                 ix = i;
26                 break;
27             }
28         }
29     }
30     return ix;
31 }
32
33 rpmDigestBundle rpmDigestBundleNew(void)
34 {
35     rpmDigestBundle bundle = xcalloc(1, sizeof(*bundle));
36     return bundle;
37 }
38
39 rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle)
40 {
41     if (bundle) {
42         for (int i = 0; i <= bundle->index_max ; i++) {
43             if (bundle->digests[i] == NULL)
44                 continue;
45             rpmDigestFinal(bundle->digests[i], NULL, NULL, 0);
46             bundle->digests[i] = NULL;
47         }
48         memset(bundle, 0, sizeof(*bundle));
49         free(bundle);
50     }
51     return NULL;
52 }
53
54 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
55                         rpmDigestFlags flags)
56 {
57     return rpmDigestBundleAddID(bundle, algo, algo, flags);
58 }
59
60 int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id,
61                         rpmDigestFlags flags)
62 {
63     int rc = -1;
64     if (id > 0 && findID(bundle, id) < 0) {
65         int ix = findID(bundle, 0); /* Find first free slot */
66         if (ix >= 0) {
67             bundle->digests[ix] = rpmDigestInit(algo, flags);
68             if (bundle->digests[ix]) {
69                 bundle->ids[ix]= id;
70                 if (ix > bundle->index_max)
71                     bundle->index_max = ix;
72                 rc = 0;
73             }
74         }
75     }
76     return rc;
77 }
78 int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len)
79 {
80     int rc = 0;
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);
85         }
86         bundle->nbytes += len;
87     }
88     return rc;
89 }
90
91 int rpmDigestBundleFinal(rpmDigestBundle bundle, int id,
92                          void ** datap, size_t * lenp, int asAscii)
93 {
94     int rc = 0;
95     int ix = findID(bundle, id);
96
97     if (ix >= 0) {
98         rc = rpmDigestFinal(bundle->digests[ix], datap, lenp, asAscii);
99         bundle->digests[ix] = NULL;
100         bundle->ids[ix] = 0;
101     }
102     return rc;
103 }
104
105 DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int id)
106 {
107     int ix = findID(bundle, id);
108     DIGEST_CTX dup = (ix >= 0) ? rpmDigestDup(bundle->digests[ix]) : NULL;
109     return dup;
110 }
111