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

Reply via email to