browns::md5 hash; | browns::md5 hash; | ||||
hash.feed(neo::buffer(str)); | hash.feed(neo::buffer(str)); | ||||
hash.pad(); | hash.pad(); | ||||
auto dig = hash.digest(); | |||||
auto dig = hash.digest(); | |||||
auto dig_str = browns::format_digest(dig); | auto dig_str = browns::format_digest(dig); | ||||
if (dig_str != expect_md5) { | if (dig_str != expect_md5) { | ||||
std::cerr << "Hash of '" << str << "' did not match. Expected '" << expect_md5 | std::cerr << "Hash of '" << str << "' did not match. Expected '" << expect_md5 | ||||
n_fails += check_hash("The quick brown fox jumps over the lazy dog", | n_fails += check_hash("The quick brown fox jumps over the lazy dog", | ||||
"9e107d9d372bb6826bd81d3542a419d6"); | "9e107d9d372bb6826bd81d3542a419d6"); | ||||
n_fails += check_hash("", "d41d8cd98f00b204e9800998ecf8427e"); | n_fails += check_hash("", "d41d8cd98f00b204e9800998ecf8427e"); | ||||
n_fails += check_hash("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "967ce152b23edc20ebd23b7eba57277c"); | |||||
n_fails += check_hash( | |||||
"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", | |||||
"967ce152b23edc20ebd23b7eba57277c"); | |||||
n_fails += check_hash("WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "9aff577d3248b8889b22f24ee9665c17"); | n_fails += check_hash("WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "9aff577d3248b8889b22f24ee9665c17"); | ||||
return n_fails; | return n_fails; | ||||
} | } |
lm::reject_unknown()); | lm::reject_unknown()); | ||||
if (ret.name.empty()) { | if (ret.name.empty()) { | ||||
throw std::runtime_error(fmt::format("'Name' field in [{}] may not be an empty string", fpath.string())); | |||||
throw std::runtime_error( | |||||
fmt::format("'Name' field in [{}] may not be an empty string", fpath.string())); | |||||
} | } | ||||
if (version_str.empty()) { | if (version_str.empty()) { | ||||
throw std::runtime_error(fmt::format("'Version' field in [{}] may not be an empty string", fpath.string())); | |||||
throw std::runtime_error( | |||||
fmt::format("'Version' field in [{}] may not be an empty string", fpath.string())); | |||||
} | } | ||||
ret.version = semver::version::parse(version_str); | ret.version = semver::version::parse(version_str); |
auto base = fs::temp_directory_path(); | auto base = fs::temp_directory_path(); | ||||
::UUID uuid; | ::UUID uuid; | ||||
auto status = ::UuidCreate(&uuid); | |||||
auto status = ::UuidCreate(&uuid); | |||||
assert(status == RPC_S_OK || status == RPC_S_UUID_LOCAL_ONLY | assert(status == RPC_S_OK || status == RPC_S_UUID_LOCAL_ONLY | ||||
|| status == RPC_S_UUID_NO_ADDRESS); | || status == RPC_S_UUID_NO_ADDRESS); | ||||
std::string uuid_std_str(reinterpret_cast<const char*>(uuid_str)); | std::string uuid_std_str(reinterpret_cast<const char*>(uuid_str)); | ||||
::RpcStringFree(&uuid_str); | ::RpcStringFree(&uuid_str); | ||||
auto new_dir = base / ("dds-" + uuid_std_str); | |||||
auto new_dir = base / ("dds-" + uuid_std_str); | |||||
std::error_code ec; | std::error_code ec; | ||||
fs::create_directory(new_dir); | fs::create_directory(new_dir); | ||||
return std::make_shared<impl>(std::move(new_dir)); | return std::make_shared<impl>(std::move(new_dir)); |
}; | }; | ||||
template <typename... Items> | template <typename... Items> | ||||
auto read(std::string_view context[[maybe_unused]], const pair_list& pairs, Items... is) { | |||||
auto read(std::string_view context [[maybe_unused]], const pair_list& pairs, Items... is) { | |||||
std::vector<pair> bad_pairs; | std::vector<pair> bad_pairs; | ||||
for (auto [key, value] : pairs.items()) { | for (auto [key, value] : pairs.items()) { | ||||
auto did_read = (is.read_one(context, key, value) || ...); | auto did_read = (is.read_one(context, key, value) || ...); |
} | } | ||||
template <typename Char, typename Traits> | template <typename Char, typename Traits> | ||||
constexpr const_buffer buffer(std::basic_string_view<Char, Traits> sv) { | |||||
constexpr const_buffer buffer(std::basic_string_view<Char, Traits> sv) { | |||||
return buffer(sv, sv.size()); | return buffer(sv, sv.size()); | ||||
} | } | ||||
#include <stdexcept> | #include <stdexcept> | ||||
#include <string> | #include <string> | ||||
#include <string_view> | #include <string_view> | ||||
#include <vector> | |||||
#include <tuple> | #include <tuple> | ||||
#include <vector> | |||||
namespace semver { | namespace semver { | ||||