Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-ports
Path: blob/main/finance/ledger/files/patch-src_utils.h
18157 views
1
--- src/utils.h.orig 2023-03-30 07:40:48 UTC
2
+++ src/utils.h
3
@@ -607,29 +607,39 @@ inline int peek_next_nonws(std::istream& in) {
4
*_p = '\0'; \
5
}
6
7
-inline string to_hex(unsigned int * message_digest, const int len = 1)
8
-{
9
+inline string digest_to_hex(
10
+ const boost::uuids::detail::sha1::digest_type& message_digest,
11
+ size_t len = sizeof(boost::uuids::detail::sha1::digest_type) * 2
12
+) {
13
std::ostringstream buf;
14
+ buf.setf(std::ios_base::hex, std::ios_base::basefield);
15
+ buf.fill('0');
16
17
- for(int i = 0; i < 5 ; i++) {
18
- buf.width(8);
19
- buf.fill('0');
20
- buf << std::hex << message_digest[i];
21
- if (i + 1 >= len)
22
- break; // only output the first LEN dwords
23
+ // sha1::digest_type is an array type and may change between Boost versions
24
+ const size_t count = std::min(
25
+ sizeof(message_digest) / sizeof(message_digest[0]),
26
+ (len - 1) / (sizeof(message_digest[0]) * 2) + 1
27
+ );
28
+ for(size_t i = 0; i < count; i++) {
29
+ buf.width(sizeof(message_digest[i]) * 2);
30
+ buf << (unsigned int)message_digest[i];
31
}
32
- return buf.str();
33
+ string hex = buf.str();
34
+ hex.resize(len, '0'); // in case a partial element is requested
35
+ return hex;
36
}
37
38
-inline string sha1sum(const string& str)
39
-{
40
- boost::uuids::detail::sha1 sha;
41
+inline string sha1sum(
42
+ const string& str,
43
+ size_t len = sizeof(boost::uuids::detail::sha1::digest_type) * 2
44
+) {
45
+ static boost::uuids::detail::sha1 sha;
46
+ boost::uuids::detail::sha1::digest_type message_digest;
47
48
+ sha.reset();
49
sha.process_bytes(str.c_str(), str.length());
50
-
51
- unsigned int message_digest[5];
52
sha.get_digest(message_digest);
53
- return to_hex(message_digest, 5);
54
+ return digest_to_hex(message_digest, len);
55
}
56
57
extern const string version;
58
59