#
#
# patch "ChangeLog"
# from [6b7c30fc30907f9d1fd3d1abf0df01395dd5d1ec]
# to [4ceb643339b1b0db8a56e4210e24c2f2e6d9b11f]
#
# patch "xdelta.cc"
# from [a57c772931f7180e345943eb37166d1f51fef8ce]
# to [ca81232c81372cbbc5a641bcb761747e286f83a7]
#
============================================================
--- ChangeLog 6b7c30fc30907f9d1fd3d1abf0df01395dd5d1ec
+++ ChangeLog 4ceb643339b1b0db8a56e4210e24c2f2e6d9b11f
@@ -1,3 +1,8 @@
+2006-05-11 Graydon Hoare
+
+ * xdelta.cc (read_num): New function.
+ (apply_delta): Rewrite to avoid string streams.
+
2006-05-09 Graydon Hoare
* xdelta.cc (copied_extent::operator<): Fix ordering bug which
============================================================
--- xdelta.cc a57c772931f7180e345943eb37166d1f51fef8ce
+++ xdelta.cc ca81232c81372cbbc5a641bcb761747e286f83a7
@@ -320,45 +320,62 @@
}
};
+inline string::size_type
+read_num(string::const_iterator &i,
+ string::const_iterator e)
+{
+ string::size_type n = 0;
+
+ while (i != e && *i == ' ')
+ ++i;
+
+ while (i != e && *i >= '0' && *i <= '9')
+ {
+ n *= 10;
+ n += static_cast(*i - '0');
+ ++i;
+ }
+ return n;
+}
+
void
apply_delta(boost::shared_ptr da,
std::string const & delta)
-{
- istringstream del(delta);
- for (char c = del.get(); c == 'I' || c == 'C'; c = del.get())
+{
+ std::string::const_iterator i = delta.begin();
+ while (i != delta.end() && (*i == 'I' || *i == 'C'))
{
- I(del.good());
- if (c == 'I')
+ if (*i == 'I')
{
- string::size_type len = string::npos;
- del >> len;
- I(del.good());
- I(len != string::npos);
- string tmp;
- tmp.reserve(len);
- I(del.get(c).good());
- I(c == '\n');
- while(len--)
- {
- I(del.get(c).good());
- tmp += c;
- }
- I(del.get(c).good());
- I(c == '\n');
+ ++i;
+ I(i != delta.end());
+ string::size_type len = read_num(i, delta.end());
+ I(len != 0);
+ I(i != delta.end());
+ I(*i == '\n');
+ ++i;
+ I(i != delta.end());
+ I((i - delta.begin()) + len <= delta.size());
+ string tmp(i, i+len);
+ i += len;
da->insert(tmp);
}
else
{
- string::size_type pos = string::npos, len = string::npos;
- del >> pos >> len;
- I(del.good());
- I(len != string::npos);
- I(del.get(c).good());
- I(c == '\n');
+ I(*i == 'C');
+ ++i;
+ I(i != delta.end());
+ string::size_type pos = read_num(i, delta.end());
+ I(i != delta.end());
+ string::size_type len = read_num(i, delta.end());
+ I(len != 0);
da->copy(pos, len);
}
+ I(i != delta.end());
+ I(*i == '\n');
+ ++i;
}
- I(del.eof());
+ I(i == delta.end());
}
void