diff options
author | Timo Weingärtner <timo@tiwe.de> | 2014-04-15 20:09:21 +0200 |
---|---|---|
committer | Timo Weingärtner <timo@tiwe.de> | 2014-04-15 20:09:21 +0200 |
commit | ec5920ac2ed11b29135acb834ce6d633259aad75 (patch) | |
tree | 31a0d0829bb89a028cc669e348043136faaca4ce /rfc4251.C | |
parent | afc8cbf6fad71317ee11b6e6374f8f3ce4816197 (diff) | |
download | ssh-agent-filter-ec5920ac2ed11b29135acb834ce6d633259aad75.tar.gz |
rfc4251: move remaining non-inline functions to impl file
Diffstat (limited to 'rfc4251.C')
-rw-r--r-- | rfc4251.C | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/rfc4251.C b/rfc4251.C new file mode 100644 index 0000000..0d59420 --- /dev/null +++ b/rfc4251.C @@ -0,0 +1,32 @@ +#include "rfc4251.h" + +rfc4251string::rfc4251string (std::vector<std::string> const & v) { + for (auto it = v.begin(); it != v.end();) { + if (it->size() == 0) + throw std::length_error{"name of zero length"}; + if (value.size() + it->size() > std::numeric_limits<uint32_t>::max()) + throw std::length_error{"32-bit limit for rfc4251string exceeded"}; + value.insert(value.end(), it->data(), it->data() + it->size()); + ++it; + if (it == v.end()) + break; + value.push_back(','); + } +} + +rfc4251string::operator std::vector<std::string> () const { + std::vector<std::string> ret; + auto name_start = value.begin(); + if (name_start != value.end()) + for (auto it = name_start; ; ++it) { + if (it == value.end() or *it == ',') { + if (it == name_start) + throw std::length_error{"name of zero length"}; + ret.emplace_back(name_start, it); + name_start = it + 1; + } + if (it == value.end()) + break; + } + return ret; +} |