[Aptitude-svn-commit] r3693 - in branches/aptitude-0.3/aptitude: .
src/generic src/generic/tests
Daniel Burrows
dburrows at costa.debian.org
Tue Jul 26 04:50:41 UTC 2005
Author: dburrows
Date: Tue Jul 26 04:50:38 2005
New Revision: 3693
Modified:
branches/aptitude-0.3/aptitude/ChangeLog
branches/aptitude-0.3/aptitude/src/generic/tags.cc
branches/aptitude-0.3/aptitude/src/generic/tags.h
branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc
Log:
Copy lots of data to avoid bad things happening due to deleted stuff being accessed. Ew.
Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog (original)
+++ branches/aptitude-0.3/aptitude/ChangeLog Tue Jul 26 04:50:38 2005
@@ -1,5 +1,11 @@
2005-07-25 Daniel Burrows <dburrows at debian.org>
+ * src/generic/tags.cc, src/generic/tags.h, src/generic/tests/test_tags.cc:
+
+ Keep a local copy of the data for each tag and tag list.
+ Without this, all sorts of hell breaks loose due to stuff being
+ deleted at bad times (doh).
+
* src/generic/tags.cc:
Fix the tag list parser so it doesn't routinely skip the first
Modified: branches/aptitude-0.3/aptitude/src/generic/tags.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tags.cc (original)
+++ branches/aptitude-0.3/aptitude/src/generic/tags.cc Tue Jul 26 04:50:38 2005
@@ -23,6 +23,7 @@
#include "apt.h"
+#include <algorithm>
#include <utility>
#include <ctype.h>
@@ -35,14 +36,16 @@
using namespace std;
-tag::tag(const char *_start, const char *_finish)
- :start(_start), finish(_finish)
+tag::tag(std::string::const_iterator start,
+ std::string::const_iterator finish)
{
while(start != finish && isspace(*start))
++start;
while(start != finish && isspace(*(finish-1)))
--finish;
+
+ s.assign(start, finish);
}
// NB: this does the wrong thing if spaces occur within a tag (they
@@ -67,7 +70,7 @@
tag::const_iterator tag::begin() const
{
- tag::const_iterator rval(start, start, finish);
+ tag::const_iterator rval(s.begin(), s.begin(), s.end());
++rval;
@@ -80,18 +83,12 @@
while(myT != end() && otherT != other.end())
{
- // avoid operator* and its concomitant copies
- size_t myN=myT.finish-myT.start;
- size_t otherN=otherT.finish-otherT.start;
-
- int res = strncmp(myT.start, otherT.start, min(myN, otherN));
-
- // If there was a difference, break out.
- if(res != 0)
- return res;
- else if(myN<otherN)
+ // ew, rather slow
+ if(lexicographical_compare(myT.start, myT.finish,
+ otherT.start, otherT.finish))
return -1;
- else if(myN>otherN)
+ else if(lexicographical_compare(otherT.start, otherT.finish,
+ myT.start, myT.finish))
return 1;
++myT;
@@ -131,11 +128,11 @@
tag_list::const_iterator tag_list::begin() const
{
- const char *endfirst=start;
- while(endfirst != finish && (*endfirst) != ',')
+ std::string::const_iterator endfirst=s.begin();
+ while(endfirst != s.end() && (*endfirst) != ',')
++endfirst;
- const_iterator rval(start, endfirst, finish);
+ const_iterator rval(s.begin(), endfirst, s.end());
return rval;
}
Modified: branches/aptitude-0.3/aptitude/src/generic/tags.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tags.h (original)
+++ branches/aptitude-0.3/aptitude/src/generic/tags.h Tue Jul 26 04:50:38 2005
@@ -31,18 +31,19 @@
class tag
{
- const char *start, *finish;
+ std::string s;
int cmp(const tag &other) const;
public:
class const_iterator
{
- const char *start, *finish, *limit;
+ std::string::const_iterator start, finish, limit;
friend class tag;
public:
- const_iterator(const char *_start, const char *_finish,
- const char *_limit)
+ const_iterator(const std::string::const_iterator &_start,
+ const std::string::const_iterator &_finish,
+ const std::string::const_iterator &_limit)
:start(_start), finish(_finish), limit(_limit)
{
}
@@ -70,16 +71,16 @@
std::string operator*() const
{
- return std::string(start, finish-start);
+ return std::string(start, finish);
}
};
- tag(const char *_start, const char *_finish);
+ tag(std::string::const_iterator _start,
+ std::string::const_iterator _finish);
tag &operator=(const tag &other)
{
- start = other.start;
- finish = other.finish;
+ s = other.s;
return *this;
}
@@ -117,25 +118,27 @@
const_iterator begin() const;
const_iterator end() const
{
- return const_iterator(finish, finish, finish);
+ return const_iterator(s.end(), s.end(), s.end());
}
std::string str() const
{
- return std::string(start, finish-start);
+ return s;
}
};
class tag_list
{
- const char *start, *finish;
+ // The string to parse.
+ std::string s;
public:
class const_iterator
{
- const char *start, *finish, *limit;
+ std::string::const_iterator start, finish, limit;
public:
- const_iterator(const char *_start, const char *_finish,
- const char *_limit)
+ const_iterator(const std::string::const_iterator &_start,
+ const std::string::const_iterator &_finish,
+ const std::string::const_iterator &_limit)
:start(_start), finish(_finish), limit(_limit)
{
}
@@ -167,21 +170,23 @@
}
};
- tag_list(const char *_start, const char *_finish)
- :start(_start), finish(_finish)
+ tag_list(const char *start, const char *finish)
+ :s(start, finish)
{
}
tag_list &operator=(const tag_list &other)
{
- start = other.start;
- finish = other.finish;
+ s=other.s;
return *this;
}
const_iterator begin() const;
- const_iterator end() const {return const_iterator(finish, finish, finish);}
+ const_iterator end() const
+ {
+ return const_iterator(s.end(), s.end(), s.end());
+ }
};
// Grab the tags for the given package:
Modified: branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc (original)
+++ branches/aptitude-0.3/aptitude/src/generic/tests/test_tags.cc Tue Jul 26 04:50:38 2005
@@ -70,9 +70,9 @@
CPPUNIT_TEST_SUITE_END();
private:
- static tag parseTag(const char *s)
+ static tag parseTag(const std::string &s)
{
- return tag(s, s+strlen(s));
+ return tag(s.begin(), s.end());
}
// These should all parse to (tag1, tag2, tag3):
More information about the Aptitude-svn-commit
mailing list