diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2018-05-23 00:36:15 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2018-05-24 17:56:03 +0300 |
commit | b39e27a9f1ab04cb67ffad1d2c7e7ae089d5e8c4 (patch) | |
tree | d79f6d16d451f081af3a7014e3b629a3d85ca3fc /libbpkg/package-name.cxx | |
parent | e3c8b1c5273e20a6c20b5ba923cdcea919340950 (diff) |
Add package_name class
Diffstat (limited to 'libbpkg/package-name.cxx')
-rw-r--r-- | libbpkg/package-name.cxx | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libbpkg/package-name.cxx b/libbpkg/package-name.cxx new file mode 100644 index 0000000..c90d861 --- /dev/null +++ b/libbpkg/package-name.cxx @@ -0,0 +1,59 @@ +// file : libbpkg/package-name.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <libbpkg/package-name.hxx> + +#include <string> +#include <vector> +#include <utility> // move() +#include <algorithm> // find() +#include <stdexcept> // invalid_argument + +#include <libbutl/utility.mxx> // alpha(), alnum() + +using namespace std; +using namespace butl; + +namespace bpkg +{ + // package_name + // + static const vector<string> illegal_pkg_names ({ + "build", + "con", "prn", "aux", "nul", + "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", + "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}); + + static const string legal_pkg_chars ("_+-."); + + package_name:: + package_name (std::string&& nm) + { + if (nm.size () < 2) + throw invalid_argument ("length is less than two characters"); + + if (find (illegal_pkg_names.begin (), illegal_pkg_names.end (), nm) != + illegal_pkg_names.end ()) + throw invalid_argument ("illegal name"); + + if (!alpha (nm.front ())) + throw invalid_argument ("illegal first character (must be alphabetic)"); + + // Here we rely on the fact that the name length >= 2. + // + for (auto i (nm.cbegin () + 1), e (nm.cend () - 1); i != e; ++i) + { + char c (*i); + + if (!(alnum(c) || legal_pkg_chars.find (c) != string::npos)) + throw invalid_argument ("illegal character"); + } + + if (!alnum (nm.back ())) + throw invalid_argument ( + "illegal last character (must be alphabetic or digit)"); + + value_ = move (nm); + } +} |