diff options
Diffstat (limited to 'rfc4251.h')
-rw-r--r-- | rfc4251.h | 47 |
1 files changed, 22 insertions, 25 deletions
@@ -180,26 +180,22 @@ struct rfc4251string { inline rfc4251string::rfc4251string (char const * s) { auto len = ntohl(*reinterpret_cast<uint32_t const *>(s)); - value.insert(value.begin(), s, s + 4 + len); + value.insert(value.begin(), s + 4, s + 4 + len); } inline rfc4251string::rfc4251string (char const * s, size_t l) { - rfc4251uint32 tmp(l); - value.insert(value.end(), std::begin(tmp.buf), std::end(tmp.buf)); value.insert(value.end(), s, s + l); } inline rfc4251string::rfc4251string (mpz_srcptr x) { - if (mpz_sgn(x) == 0) - value.assign(4, 0); - else if (mpz_sgn(x) == 1) { + if (mpz_sgn(x) == 0) { + } else if (mpz_sgn(x) == 1) { ssize_t bits = mpz_sizeinbase(x, 2); ssize_t bytes = (bits + 7) / 8; ssize_t extrabyte = bits % 8 ? 0 : 1; // need extra byte if MSB is 1 to keep it non-negative - value.resize(4 + bytes + extrabyte); - *reinterpret_cast<uint32_t *>(value.data()) = htonl(bytes + extrabyte); - value[4] = 0; - mpz_export(value.data() + 4 + extrabyte, nullptr, 1, 1, 1, 0, x); + value.resize(bytes + extrabyte); + value[0] = 0; + mpz_export(value.data() + extrabyte, nullptr, 1, 1, 1, 0, x); } else { mpz_class tmp(x); tmp += 1; @@ -207,23 +203,22 @@ inline rfc4251string::rfc4251string (mpz_srcptr x) { ssize_t bits = mpz_sizeinbase(x, 2); ssize_t bytes = (bits + 7) / 8; ssize_t extrabyte = bits % 8 ? 0 : 1; // need extra byte if MSB is 1 (0 after ^= below) to keep it negative - value.resize(4 + bytes + extrabyte); - *reinterpret_cast<uint32_t *>(value.data()) = htonl(bytes + extrabyte); - value[4] = 0; - mpz_export(value.data() + 4 + extrabyte, nullptr, 1, 1, 1, 0, x); - for (auto i = value.data() + 4; i < value.data() + value.size(); ++i) - *i ^= 0xff; + value.resize(bytes + extrabyte); + value[0] = 0; + mpz_export(value.data() + extrabyte, nullptr, 1, 1, 1, 0, x); + for (auto & i : value) + i ^= 0xff; } } inline rfc4251string::operator std::string () const { - return std::string(value.begin() + 4, value.end()); + return std::string(value.begin(), value.end()); } inline rfc4251string::operator mpz_class () const { mpz_class ret; - mpz_import(ret.get_mpz_t(), value.size() - 4, 1, 1, 1, 0, value.data() + 4); - if (mpz_sizeinbase(ret.get_mpz_t(), 2) == (value.size() - 4) * 8) { // negative + mpz_import(ret.get_mpz_t(), value.size(), 1, 1, 1, 0, value.data()); + if (mpz_sizeinbase(ret.get_mpz_t(), 2) == value.size() * 8) { // negative mpz_com(ret.get_mpz_t(), ret.get_mpz_t()); ret += 1; mpz_neg(ret.get_mpz_t(), ret.get_mpz_t()); @@ -232,17 +227,19 @@ inline rfc4251string::operator mpz_class () const { } inline std::istream & operator>> (std::istream & is, rfc4251string & s) { - s.value.resize(4); - if (is.read(s.value.data(), 4)) { - auto len = ntohl(*reinterpret_cast<uint32_t const *>(s.value.data())); - s.value.resize(4 + len); - is.read(s.value.data() + 4, len); + s.value.clear(); + rfc4251uint32 len; + if (is >> len) { + s.value.resize(len); + is.read(s.value.data(), len); } return is; } inline std::ostream & operator<< (std::ostream & os, rfc4251string const & s) { - return os.write(s.value.data(), s.value.size()); + if (os << rfc4251uint32(s.value.size())) + os.write(s.value.data(), s.value.size()); + return os; } inline bool operator== (rfc4251string const & l, rfc4251string const & r) { |