# # # 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