| 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 { | ||||