-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 mtn: Zertifikate | Schlüssel | Revisionen mtn: 76.702 | 74 | 25.283 mtn: Bytes rein | Bytes raus | Zertifikate rein | Revisionen rein mtn: 1,1 M | 361,4 k | 560/560 | 136/136 mtn: erfolgreicher Austausch mit localhost
monotone 0.40 (Basis-Revision: bfc2ecb16c1e9da1a15745f7537bd773266d7b28) real 11m45.777s user 11m23.151s sys 0m1.444s monotone 0.40 (Basis-Revision: 01113d80b5e63f04da293f024783ee6c926a37f6) real 12m2.858s user 11m19.914s sys 0m2.612s with this patch real 7m25.268s user 7m1.642s sys 0m0.888s -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFIHZ38ng+R+0ucfO0RAvHLAKC/Hmlm58qklsvAploE8hz7Cn3Y9wCfYz5/ PgbxAJIzJlbgbHNXvubyABA= =j//P -----END PGP SIGNATURE-----
# # old_revision [15be8e6d3d9a788a082c6305084d3381e4c40ff7] # # patch "transforms.cc" # from [344c1f23d33145b51f0fc500014a75da95b3c115] # to [601bd492e66bd2a7601f5685030b298656148518] # ============================================================ --- transforms.cc 344c1f23d33145b51f0fc500014a75da95b3c115 +++ transforms.cc 601bd492e66bd2a7601f5685030b298656148518 @@ -17,6 +17,7 @@ #include "transforms.hh" #include "xdelta.hh" #include "char_classifiers.hh" +#include "constants.hh" using std::string; using Botan::Pipe; @@ -120,11 +121,105 @@ SPECIALIZE_XFORM(Base64_Decoder, Botan:: SPECIALIZE_XFORM(Base64_Encoder,); SPECIALIZE_XFORM(Base64_Decoder, Botan::IGNORE_WS); -SPECIALIZE_XFORM(Hex_Encoder, Hex_Encoder::Lowercase); -SPECIALIZE_XFORM(Hex_Decoder, Botan::IGNORE_WS); +//SPECIALIZE_XFORM(Hex_Encoder, Hex_Encoder::Lowercase); +//SPECIALIZE_XFORM(Hex_Decoder, Botan::IGNORE_WS); SPECIALIZE_XFORM(Gzip_Compression,); SPECIALIZE_XFORM(Gzip_Decompression,); +static inline char +decode_hex_char(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else + { + I(c >= 'a' && c <= 'f'); + return c - 'a' + 10; + } +} + +static inline void +decode_hexenc_inner(string::const_iterator i, + string::const_iterator end, + char *out) +{ + for (; i != end; ++i) + { + char t = decode_hex_char(*i++); + t <<= 4; + t |= decode_hex_char(*i); + *out++ = t; + } +} + +template<> string xform<Hex_Decoder>(string const & in) + { + string out; + try + { + if (LIKELY(in.size() == constants::idlen)) + { + I(in.size() % 2 == 0); + char buf[constants::idlen / 2]; + decode_hexenc_inner(in.begin(), in.end(), buf); + return string(buf, constants::idlen / 2); + } + else + { + static cached_botan_pipe pipe(new Pipe(new Hex_Decoder(Botan::IGNORE_WS))); + /* this might actually be a problem here */ + I(pipe->message_count() < Pipe::LAST_MESSAGE); + pipe->process_msg(in); + out = pipe->read_all_as_string(Pipe::LAST_MESSAGE); + } + } + catch (Botan::Exception & e) + { + error_in_transform(e); + } + return out; + } + +static inline void +encode_hexenc_inner(string::const_iterator i, + string::const_iterator end, + char *out) +{ + static char const *tab = "0123456789abcdef"; + for (; i != end; ++i) + { + *out++ = tab[(*i >> 4) & 0xf]; + *out++ = tab[*i & 0xf]; + } +} + +template<> string xform<Hex_Encoder>(string const & in) + { + string out; + try + { + if (LIKELY(in.size() == constants::idlen / 2)) + { + char buf[constants::idlen]; + encode_hexenc_inner(in.begin(), in.end(), buf); + return string(buf, constants::idlen); + } + else + { + static cached_botan_pipe pipe(new Pipe(new Hex_Encoder(Hex_Encoder::Lowercase))); + /* this might actually be a problem here */ + I(pipe->message_count() < Pipe::LAST_MESSAGE); + pipe->process_msg(in); + out = pipe->read_all_as_string(Pipe::LAST_MESSAGE); + } + } + catch (Botan::Exception & e) + { + error_in_transform(e); + } + return out; + } + template <typename T> void pack(T const & in, base64< gzip<T> > & out) {
_______________________________________________ Monotone-devel mailing list Monotone-devel@nongnu.org http://lists.nongnu.org/mailman/listinfo/monotone-devel