X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/87550f881db0f6583709f7797becb3eef7d5f254..b27841d687ec9e84983340b5581376dfb24010ea:/projects/stargazer/plugins/other/smux/types.cpp diff --git a/projects/stargazer/plugins/other/smux/types.cpp b/projects/stargazer/plugins/other/smux/types.cpp index f8eb5209..8132bca0 100644 --- a/projects/stargazer/plugins/other/smux/types.cpp +++ b/projects/stargazer/plugins/other/smux/types.cpp @@ -1,12 +1,19 @@ +#include "types.h" + #include #include +#include #include -#include "types.h" +namespace +{ -bool StringToArcs(const char * str, size_t length, std::vector & arcs) +bool ParseArcs(const char * str, ptrdiff_t length, unsigned * a, size_t * pos); +bool StringToArcs(const char * str, size_t length, std::vector & arcs); +bool AppendToArcs(const char * str, size_t length, std::vector & arcs); + +bool ParseArcs(const char * str, ptrdiff_t length, unsigned * a, size_t * pos) { -unsigned a[1024]; if (length == 0) return false; const char * left = str; @@ -15,28 +22,54 @@ if (*left == '.') size_t arcPos = 0; while ((left - str) < length) { - char * pos = NULL; - unsigned arc = strtoul(left, &pos, 10); - if (pos == left) + char * p = NULL; + unsigned arc = static_cast(strtoul(left, &p, 10)); + if (p == left) return false; a[arcPos++] = arc; if (arcPos >= 1024) return false; - left = pos + 1; + left = p + 1; } +*pos = arcPos; +return true; +} -std::vector newArcs(a, a + arcPos); -arcs.swap(newArcs); +bool StringToArcs(const char * str, size_t length, std::vector & arcs) +{ +unsigned a[1024]; +size_t pos = 0; + +if (!ParseArcs(str, length, a, &pos)) + return false; + +arcs.assign(a, a + pos); return true; } +bool AppendToArcs(const char * str, size_t length, std::vector & arcs) +{ +unsigned a[1024]; +size_t pos = 0; + +if (!ParseArcs(str, length, a, &pos)) + return false; + +std::copy(&a[0], &a[pos], std::back_inserter(arcs)); +return true; +} + +} + OID::OID(const std::string & str) + : arcs() { if (!StringToArcs(str.c_str(), str.length(), arcs)) throw std::runtime_error("Invalid oid"); } OID::OID(const char * str, size_t length) + : arcs() { if (!StringToArcs(str, length, arcs)) throw std::runtime_error("Invalid oid"); @@ -48,12 +81,14 @@ OID::OID(const std::vector & a) } OID::OID(const unsigned * a, size_t length) + : arcs() { std::vector newArcs(a, a + length); arcs.swap(newArcs); } OID::OID(OBJECT_IDENTIFIER_t * oid) + : arcs() { unsigned a[1024]; int count = OBJECT_IDENTIFIER_get_arcs(oid, a, sizeof(a[0]), 1024); @@ -74,6 +109,78 @@ OID::~OID() { } +bool OID::addSuffix(const char * suffix, size_t length) +{ +if (!AppendToArcs(suffix, length, arcs)) + return false; +return true; +} + +bool OID::addSuffix(const std::string & suffix) +{ +if (!AppendToArcs(suffix.c_str(), suffix.length(), arcs)) + return false; +return true; +} + +bool OID::addSuffix(const unsigned * suffix, size_t length) +{ +std::copy(suffix, suffix + length, std::back_inserter(arcs)); +return true; +} + +bool OID::addSuffix(const std::vector & suffix) +{ +std::copy(suffix.begin(), suffix.end(), std::back_inserter(arcs)); +return true; +} + +bool OID::addSuffix(unsigned a, unsigned b) +{ +arcs.push_back(a); +arcs.push_back(b); +return true; +} + +OID OID::copyWithSuffix(const char * suffix, size_t length) const +{ +OID oid(*this); +if (!oid.addSuffix(suffix, length)) + throw std::runtime_error("Invalid suffix"); +return oid; +} + +OID OID::copyWithSuffix(const std::string & suffix) const +{ +OID oid(*this); +if (!oid.addSuffix(suffix)) + throw std::runtime_error("Invalid suffix"); +return oid; +} + +OID OID::copyWithSuffix(const unsigned * suffix, size_t length) const +{ +OID oid(*this); +if (!oid.addSuffix(suffix, length)) + throw std::runtime_error("Invalid suffix"); +return oid; +} + +OID OID::copyWithSuffix(const std::vector & suffix) const +{ +OID oid(*this); +if (!oid.addSuffix(suffix)) + throw std::runtime_error("Invalid suffix"); +return oid; +} + +OID OID::copyWithSuffix(unsigned a, unsigned b) const +{ +OID oid(*this); +oid.addSuffix(a, b); +return oid; +} + std::string OID::ToString() const { std::stringstream stream; @@ -84,7 +191,7 @@ return stream.str(); void OID::ToOID(OBJECT_IDENTIFIER_t * oid) const { -OBJECT_IDENTIFIER_set_arcs(oid, &arcs.front(), sizeof(unsigned), arcs.size()); +OBJECT_IDENTIFIER_set_arcs(oid, &arcs.front(), sizeof(unsigned), static_cast(arcs.size())); } OID & OID::operator=(const OID & rvalue) @@ -105,12 +212,36 @@ return true; bool OID::operator<(const OID & rvalue) const { -for (size_t i = 0; i < std::min(arcs.size(), rvalue.arcs.size()); ++i) - if (arcs[i] > rvalue.arcs[i]) - return false; -if (rvalue.arcs.size() < arcs.size()) +size_t i = 0; +size_t min = std::min(arcs.size(), rvalue.arcs.size()); +while (i < min && + arcs[i] == rvalue.arcs[i]) + ++i; +if (i == min) + { + if (rvalue.arcs.size() > arcs.size()) + return true; return false; -return true; + } + +if (arcs[i] < rvalue.arcs[i]) + return true; + +return false; +} + +bool OID::PrefixLess(const OID & rvalue) const +{ +size_t i = 0; +size_t min = std::min(arcs.size(), rvalue.arcs.size()); +while (i < min && + arcs[i] == rvalue.arcs[i]) + ++i; +if (i == min) + return false; +if (arcs[i] < rvalue.arcs[i]) + return true; +return false; } std::ostream & operator<<(std::ostream & stream, const OID & oid)