diff options
| author | LiGuilin <liguilin0522@qq.com> | 2016-10-08 08:34:12 +0800 |
|---|---|---|
| committer | LiGuilin <liguilin0522@qq.com> | 2016-10-08 08:34:12 +0800 |
| commit | c91da2b0c4c3d9218c0b4d1712d744bb35245a61 (patch) | |
| tree | e1ae0664a4f21f3948bde8c8f9f9e55dea0cb11f /toolsrc/src/package_spec.cpp | |
| parent | 280d88b34033ab728e02f725d8d8ff5f9250c6de (diff) | |
| parent | a0f621c0fca2c3de8bd5249f023979b800c543cf (diff) | |
| download | vcpkg-c91da2b0c4c3d9218c0b4d1712d744bb35245a61.tar.gz vcpkg-c91da2b0c4c3d9218c0b4d1712d744bb35245a61.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'toolsrc/src/package_spec.cpp')
| -rw-r--r-- | toolsrc/src/package_spec.cpp | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index ece5f91e9..86d4393bd 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -1,32 +1,63 @@ #include "package_spec.h" +#include <algorithm> namespace vcpkg { - expected<package_spec> parse(const std::string& spec, const triplet& default_target_triplet) + static bool is_valid_package_spec_char(char c) { - auto pos = spec.find(':'); + return (c == '-') || isdigit(c) || (isalpha(c) && islower(c)); + } + + expected<package_spec> package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet) + { + auto pos = spec_as_string.find(':'); if (pos == std::string::npos) { - return package_spec{spec, default_target_triplet}; + return from_name_and_triplet(spec_as_string, default_target_triplet); } - auto pos2 = spec.find(':', pos + 1); + auto pos2 = spec_as_string.find(':', pos + 1); if (pos2 != std::string::npos) { - return std::error_code(package_spec_parse_result::too_many_colons); + return std::error_code(package_spec_parse_result::TOO_MANY_COLONS); } - return package_spec{spec.substr(0, pos), spec.substr(pos + 1)}; + const std::string name = spec_as_string.substr(0, pos); + const triplet target_triplet = triplet::from_canonical_name(spec_as_string.substr(pos + 1)); + return from_name_and_triplet(name, target_triplet); + } + + expected<package_spec> package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet) + { + if (std::find_if_not(name.cbegin(), name.cend(), is_valid_package_spec_char) != name.end()) + { + return std::error_code(package_spec_parse_result::INVALID_CHARACTERS); + } + + package_spec p; + p.m_name = name; + p.m_target_triplet = target_triplet; + return p; + } + + const std::string& package_spec::name() const + { + return this->m_name; + } + + const triplet& package_spec::target_triplet() const + { + return this->m_target_triplet; } std::string package_spec::dir() const { - return Strings::format("%s_%s", this->name, this->target_triplet); + return Strings::format("%s_%s", this->m_name, this->m_target_triplet); } std::string to_string(const package_spec& spec) { - return Strings::format("%s:%s", spec.name, spec.target_triplet); + return Strings::format("%s:%s", spec.name(), spec.target_triplet()); } std::string to_printf_arg(const package_spec& spec) @@ -36,7 +67,7 @@ namespace vcpkg bool operator==(const package_spec& left, const package_spec& right) { - return left.name == right.name && left.target_triplet == right.target_triplet; + return left.name() == right.name() && left.target_triplet() == right.target_triplet(); } std::ostream& operator<<(std::ostream& os, const package_spec& spec) |
