Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=c7c3ca5fe511a68a3155fb35c8f8fd640e966fd9
commit c7c3ca5fe511a68a3155fb35c8f8fd640e966fd9 Author: Michel Hermier <[email protected]> Date: Mon Oct 27 08:34:06 2014 +0100 libpacman: Add basic C string like class. diff --git a/lib/libpacman/kernel/fstr.cpp b/lib/libpacman/kernel/fstr.cpp index 2fa43d1..61df894 100644 --- a/lib/libpacman/kernel/fstr.cpp +++ b/lib/libpacman/kernel/fstr.cpp @@ -24,6 +24,140 @@ #include "fstring.h" #include "util/fstringlist.h" +using namespace flib; + +str::str(const char *s) + : str() +{ + reset(s); +} + +str::str(const str &o) + : str(o.m_str) +{ } + +str::str(str &&o) + : str() +{ + swap(o); +} + +str::~str() +{ + reset(); +} + +str &str::operator = (const str &o) +{ + reset(o.m_str); + return *this; +} + +str &str::operator = (str &&o) +{ + swap(o); + return *this; +} + +str str::create(char *s) +{ + str ret; + ret.m_str = s; + return ret; +} + +str str::create(const char *s) +{ + return str(s); +} + +str str::format(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + str ret = vformat(fmt, ap); + va_end(ap); + return ret; +} + +str str::vformat(const char *fmt, va_list ap) +{ + char *dest; + + vasprintf(&dest, fmt, ap); + return create(dest); +} + +const char *str::data() const +{ + if (empty()) { + return ""; + } + return m_str; +} + +str::size_type str::size() const +{ + if(!empty()) { + return strlen(m_str); + } + return 0; +} + +int str::compare(const str &s) const +{ + return strcmp(c_str(), s.c_str()); +} + +void str::reset(const char *s) +{ + if(m_str != nullptr) { + free(m_str); + } + m_str = strdup(s); +} + +void str::swap(str &o) +{ + std::swap(m_str, o.m_str); +} + +bool flib::operator == (const str &lhs, const str &rhs) +{ + return lhs.compare(rhs) == 0; +} + +bool flib::operator == (const str &lhs, std::nullptr_t rhs) +{ + return lhs.compare(str(rhs)) == 0; +} + +bool flib::operator != (const str &lhs, const str &rhs) +{ + return !(lhs == rhs); +} + +bool flib::operator != (const str &lhs, std::nullptr_t rhs) +{ + return !(lhs == rhs); +} + +bool flib::operator < (const str &lhs, const str &rhs) +{ + return lhs.compare(rhs) < 0; +} + +bool std::operator == (nullptr_t lhs, const flib::str &rhs) +{ + return rhs == lhs; +} + +bool std::operator != (nullptr_t lhs, const flib::str &rhs) +{ + return rhs != lhs; +} + FStrMatcher::FStrMatcher() : m_flags(0), m_str(NULL) { } diff --git a/lib/libpacman/kernel/fstr.h b/lib/libpacman/kernel/fstr.h index b482d05..d0a97eb 100644 --- a/lib/libpacman/kernel/fstr.h +++ b/lib/libpacman/kernel/fstr.h @@ -23,8 +23,85 @@ #include "fstring.h" +#include "util/flist.h" + +#include <cstddef> #include <regex.h> +namespace flib { + class str + { + public: + typedef size_t size_type; + + static str create(char *s); + static str create(const char *s); + static str format(const char *fmt, ...); + static str vformat(const char *fmt, va_list ap); + + constexpr str() + : str(nullptr) + { } + + constexpr str(std::nullptr_t n) + : m_str(n) + { } + + str(const char *s); + str(const str &o); + str(str &&o); + ~str(); + + str &operator = (const str &o); + str &operator = (str &&o); + + explicit operator const char * () + { + return m_str; + } + + /* Element access */ + const char *c_str() const + { + return data(); + } + + const char *data() const; + + /* Capacity */ + bool empty() const + { + return m_str == nullptr || m_str[0] == '\0'; + } + + size_type length() const + { + return size(); + } + + size_type size() const; + + /* Operations */ + int compare(const str &str) const; + void reset(const char *s = nullptr); + void swap(str &o); + + private: + char *m_str; + }; + + bool operator == (const str &lhs, const str &rhs); + bool operator == (const str &lhs, std::nullptr_t rhs); + bool operator != (const str &lhs, const str &rhs); + bool operator != (const str &lhs, std::nullptr_t rhs); + bool operator < (const str &lhs, const str &rhs); +} // namespace flib + +namespace std { + bool operator == (nullptr_t lhs, const flib::str &rhs); + bool operator != (nullptr_t lhs, const flib::str &rhs); +} // namespace std + class FStringList; class FStrMatcher final diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp index 52ba318..55daac4 100644 --- a/lib/libpacman/package.cpp +++ b/lib/libpacman/package.cpp @@ -46,6 +46,7 @@ #include <limits.h> #include <stdio.h> +using namespace flib; using namespace libpacman; package::package(Database *database) @@ -329,6 +330,11 @@ bool package::match(const pmdepend_t &depend) } } +bool libpacman::operator < (const libpacman::package_ptr &pkg1, const libpacman::package_ptr &pkg2) +{ + return strcmp(pkg1->name(), pkg2->name()) < 0; +} + typedef struct FPackageStrMatcher FPackageStrMatcher; struct FPackageStrMatcher @@ -384,32 +390,26 @@ bool PackageMatcher::match(const package_ptr package, int mask) const return _pacman_strmatcher_match(m_strmatcher, package, m_flags & mask); } -package_node::package_node(const char *name) -{ - STRNCPY(m_name, name, PKG_NAME_LEN); -} +package_node::package_node(const str &name) + : m_name(name) // PKG_NAME_LEN +{ } package_node::~package_node() { } bool package_node::operator < (const package_node &o) const { - return strcmp(m_name, o.m_name) < 0; + return m_name < o.m_name; } -const char *package_node::name() const +const str &package_node::name() const { return m_name; } -bool libpacman::operator < (const libpacman::package_ptr &pkg1, const libpacman::package_ptr &pkg2) -{ - return strcmp(pkg1->name(), pkg2->name()) < 0; -} - bool libpacman::operator < (const libpacman::package_node_ptr &pn1, const libpacman::package_node_ptr &pn2) { - return strcmp(pn1->name(), pn2->name()) < 0; + return pn1->name() < pn2->name(); } /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h index 1216d8d..b5dae10 100644 --- a/lib/libpacman/package.h +++ b/lib/libpacman/package.h @@ -200,14 +200,14 @@ private: : public flib::refcounted { public: - package_node(const char *name); + package_node(const flib::str &name); ~package_node(); bool operator < (const package_node &o) const; - const char *name() const; + const flib::str &name() const; private: - char m_name[PKG_NAME_LEN]; + flib::str m_name; libpacman::package_set m_packages; }; _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
