aboutsummaryrefslogtreecommitdiff
path: root/rfc4251.C
diff options
context:
space:
mode:
authorTimo Weingärtner <timo@tiwe.de>2014-04-15 20:09:21 +0200
committerTimo Weingärtner <timo@tiwe.de>2014-04-15 20:09:21 +0200
commitec5920ac2ed11b29135acb834ce6d633259aad75 (patch)
tree31a0d0829bb89a028cc669e348043136faaca4ce /rfc4251.C
parentafc8cbf6fad71317ee11b6e6374f8f3ce4816197 (diff)
downloadssh-agent-filter-ec5920ac2ed11b29135acb834ce6d633259aad75.tar.gz
rfc4251: move remaining non-inline functions to impl file
Diffstat (limited to 'rfc4251.C')
-rw-r--r--rfc4251.C32
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;
+}