diff options
Diffstat (limited to 'rfc4251.H')
-rw-r--r-- | rfc4251.H | 110 |
1 files changed, 57 insertions, 53 deletions
@@ -1,11 +1,11 @@ /* * rfc4251.h -- implements types from RFC 4251, section 5 * - * rfc4251byte byte - * rfc4251bool bool - * rfc4251uint32 uint32 - * rfc4251uint64 uint64 - * rfc4251string string, incl. mpint and name-list + * rfc4251::byte byte + * rfc4251::boolean boolean + * rfc4251::uint32 uint32 + * rfc4251::uint64 uint64 + * rfc4251::string string, incl. mpint and name-list * * those structs contain the objects in their RFC 4251 representation, * conversions are provided via constructors and cast operators @@ -37,102 +37,104 @@ #include <gmpxx.h> #include <boost/operators.hpp> -struct rfc4251byte { +namespace rfc4251 { + +struct byte { union { uint8_t value; char buf[1]; }; - rfc4251byte () = default; - explicit rfc4251byte (uint8_t v) : value(v) {} - inline explicit rfc4251byte (std::istream &); + byte () = default; + explicit byte (uint8_t v) : value(v) {} + inline explicit byte (std::istream &); operator uint8_t () const { return value; } }; -inline std::istream & operator>> (std::istream & is, rfc4251byte & x) { +inline std::istream & operator>> (std::istream & is, byte & x) { return is.read(x.buf, sizeof(x.buf)); } -inline std::ostream & operator<< (std::ostream & os, rfc4251byte const & x) { +inline std::ostream & operator<< (std::ostream & os, byte const & x) { return os.write(x.buf, sizeof(x.buf)); } -inline rfc4251byte::rfc4251byte (std::istream & is) { +inline byte::byte (std::istream & is) { is >> *this; } -struct rfc4251bool { +struct boolean { union { bool value; char buf[1]; }; - rfc4251bool () = default; - explicit rfc4251bool (uint8_t v) : value(v) {} - inline explicit rfc4251bool (std::istream &); + boolean () = default; + explicit boolean (uint8_t v) : value(v) {} + inline explicit boolean (std::istream &); operator uint8_t () const { return value; } }; -inline std::istream & operator>> (std::istream & is, rfc4251bool & x) { +inline std::istream & operator>> (std::istream & is, boolean & x) { return is.read(x.buf, sizeof(x.buf)); } -inline std::ostream & operator<< (std::ostream & os, rfc4251bool const & x) { +inline std::ostream & operator<< (std::ostream & os, boolean const & x) { return os.write(x.buf, sizeof(x.buf)); } -inline rfc4251bool::rfc4251bool (std::istream & is) { +inline boolean::boolean (std::istream & is) { is >> *this; } -struct rfc4251uint32 { +struct uint32 { union { uint32_t value; char buf[4]; }; - rfc4251uint32 () = default; - explicit rfc4251uint32 (uint32_t v) { value = htonl(v); } - inline explicit rfc4251uint32 (std::istream &); + uint32 () = default; + explicit uint32 (uint32_t v) { value = htonl(v); } + inline explicit uint32 (std::istream &); operator uint32_t () const { return ntohl(value); } }; -inline std::istream & operator>> (std::istream & is, rfc4251uint32 & x) { +inline std::istream & operator>> (std::istream & is, uint32 & x) { return is.read(x.buf, sizeof(x.buf)); } -inline std::ostream & operator<< (std::ostream & os, rfc4251uint32 const & x) { +inline std::ostream & operator<< (std::ostream & os, uint32 const & x) { return os.write(x.buf, sizeof(x.buf)); } -inline rfc4251uint32::rfc4251uint32 (std::istream & is) { +inline uint32::uint32 (std::istream & is) { is >> *this; } -struct rfc4251uint64 { +struct uint64 { union { uint64_t value; char buf[8]; }; - rfc4251uint64 () = default; - inline explicit rfc4251uint64 (uint64_t v); - inline explicit rfc4251uint64 (std::istream &); + uint64 () = default; + inline explicit uint64 (uint64_t v); + inline explicit uint64 (std::istream &); inline explicit operator uint64_t () const; }; -inline rfc4251uint64::rfc4251uint64 (uint64_t v) { +inline uint64::uint64 (uint64_t v) { for (int_fast8_t i{7}; i >= 0; --i) { buf[i] = v & 0xff; v >>= 8; } } -inline rfc4251uint64::operator uint64_t () const { +inline uint64::operator uint64_t () const { uint64_t ret{0}; for (uint_fast8_t i{0}; i < 8; ++i) { ret <<= 8; @@ -141,28 +143,28 @@ inline rfc4251uint64::operator uint64_t () const { return ret; } -inline std::istream & operator>> (std::istream & is, rfc4251uint64 & x) { +inline std::istream & operator>> (std::istream & is, uint64 & x) { return is.read(x.buf, sizeof(x.buf)); } -inline std::ostream & operator<< (std::ostream & os, rfc4251uint64 const & x) { +inline std::ostream & operator<< (std::ostream & os, uint64 const & x) { return os.write(x.buf, sizeof(x.buf)); } -inline rfc4251uint64::rfc4251uint64 (std::istream & is) { +inline uint64::uint64 (std::istream & is) { is >> *this; } -struct rfc4251string : boost::totally_ordered<rfc4251string> { +struct string : boost::totally_ordered<string> { std::vector<char> value; - rfc4251string () = default; - inline explicit rfc4251string (char const *, size_t); - explicit rfc4251string (std::string const & s) : rfc4251string{s.data(), s.size()} {} - explicit rfc4251string (std::vector<std::string> const &); - explicit rfc4251string (mpz_srcptr); - explicit rfc4251string (mpz_class const & x) : rfc4251string{x.get_mpz_t()} {} - inline explicit rfc4251string (std::istream &); + string () = default; + inline explicit string (char const *, size_t); + explicit string (std::string const & s) : string{s.data(), s.size()} {} + explicit string (std::vector<std::string> const &); + explicit string (mpz_srcptr); + explicit string (mpz_class const & x) : string{x.get_mpz_t()} {} + inline explicit string (std::istream &); size_t size () const { return value.size(); } char const * data () const { return value.data(); } @@ -173,15 +175,15 @@ struct rfc4251string : boost::totally_ordered<rfc4251string> { operator mpz_class () const; }; -inline rfc4251string::rfc4251string (char const * s, size_t l) { +inline string::string (char const * s, size_t l) { if (l > std::numeric_limits<uint32_t>::max()) - throw std::length_error{"32-bit limit for rfc4251string exceeded"}; + throw std::length_error{"32-bit limit for rfc4251::string exceeded"}; value.insert(value.end(), s, s + l); } -inline std::istream & operator>> (std::istream & is, rfc4251string & s) { +inline std::istream & operator>> (std::istream & is, string & s) { s.value.clear(); - rfc4251uint32 len; + uint32 len; if (is >> len) { s.value.resize(len); is.read(s.value.data(), len); @@ -189,22 +191,24 @@ inline std::istream & operator>> (std::istream & is, rfc4251string & s) { return is; } -inline std::ostream & operator<< (std::ostream & os, rfc4251string const & s) { +inline std::ostream & operator<< (std::ostream & os, string const & s) { if (s.value.size() > std::numeric_limits<uint32_t>::max()) - throw std::length_error{"32-bit limit for rfc4251string exceeded"}; - if (os << rfc4251uint32{static_cast<uint32_t>(s.value.size())}) + throw std::length_error{"32-bit limit for rfc4251::string exceeded"}; + if (os << uint32{static_cast<uint32_t>(s.value.size())}) os.write(s.value.data(), s.value.size()); return os; } -inline rfc4251string::rfc4251string (std::istream & is) { +inline string::string (std::istream & is) { is >> *this; } -inline bool operator== (rfc4251string const & l, rfc4251string const & r) { +inline bool operator== (string const & l, string const & r) { return l.value == r.value; } -inline bool operator< (rfc4251string const & l, rfc4251string const & r) { +inline bool operator< (string const & l, string const & r) { return l.value < r.value; } + +} |