aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/package_spec.cpp
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2016-10-04 14:47:42 -0700
committerAlexander Karatarakis <alkarata@microsoft.com>2016-10-04 14:47:42 -0700
commitbf323e8cc6f3edd245e3f5661cab6c8b7f335da9 (patch)
treed7907dd47b9c1a71bba891a66c0829bb1df5319d /toolsrc/src/package_spec.cpp
parent04539816b5e793afdcff991a28c298f199e709db (diff)
downloadvcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.tar.gz
vcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.zip
[package_spec]User input gets lowercased; other input is checked
Diffstat (limited to 'toolsrc/src/package_spec.cpp')
-rw-r--r--toolsrc/src/package_spec.cpp28
1 files changed, 16 insertions, 12 deletions
diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp
index 57f6179bf..a578787c9 100644
--- a/toolsrc/src/package_spec.cpp
+++ b/toolsrc/src/package_spec.cpp
@@ -3,35 +3,39 @@
namespace vcpkg
{
- expected<package_spec> package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet)
+ static bool is_valid_package_spec_char(char c)
{
- std::string s(spec_as_string);
- std::transform(s.begin(), s.end(), s.begin(), ::tolower);
+ return (c == '-') || (isalnum(c) && islower(c));
+ }
- auto pos = s.find(':');
+ 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 from_name_and_triplet(s, default_target_triplet);
+ return from_name_and_triplet(spec_as_string, default_target_triplet);
}
- auto pos2 = s.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);
}
- const std::string name = s.substr(0, pos);
- const triplet target_triplet = triplet::from_canonical_name(s.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);
}
- package_spec package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet)
+ expected<package_spec> package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet)
{
- std::string n(name);
- std::transform(n.begin(), n.end(), n.begin(), ::tolower);
+ 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 = n;
+ p.m_name = name;
p.m_target_triplet = target_triplet;
return p;
}