Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2334)

Unified Diff: courgette/third_party/bsdiff/bsdiff_search.h

Issue 2031193002: [Courgette] Refactor BSDiff namespaces and bsdiff::search() interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: courgette/third_party/bsdiff/bsdiff_search.h
diff --git a/courgette/third_party/bsdiff/bsdiff_search.h b/courgette/third_party/bsdiff/bsdiff_search.h
index e4dd1e7e5f224ad65a7e3a071af53bb8a61e345c..78eee53073fd5f7385f6fe49f4040d58b613e332 100644
--- a/courgette/third_party/bsdiff/bsdiff_search.h
+++ b/courgette/third_party/bsdiff/bsdiff_search.h
@@ -33,8 +33,9 @@
// --Samuel Huang <huangs@chromium.org>
// 2015-08-19 - Optimized search() to be non-recursive.
// --Samuel Huang <huangs@chromium.org>
-// 2016-06-17 - Moved matchlen() and search() to a new file; format; changed
+// 2016-06-28 - Moved matchlen() and search() to a new file; format; changed
// search() use std::lexicographical_compare().
+// 2016-06-30 - Changed matchlen() input; changed search() to return struct.
// --Samuel Huang <huangs@chromium.org>
// Copyright 2016 The Chromium Authors. All rights reserved.
@@ -45,57 +46,52 @@
#define COURGETTE_THIRD_PARTY_BSDIFF_BSDIFF_SEARCH_H_
#include <algorithm>
-#include <cstring>
-namespace courgette {
+namespace bsdiff {
-// Similar to ::memcmp(), but returns match length instead.
-inline int matchlen(const unsigned char* old,
- int oldsize,
- const unsigned char* newbuf,
- int newsize) {
- int i;
+// Return values of search().
+struct SearchResult {
+ SearchResult(int pos_in, int size_in) : pos(pos_in), size(size_in) {}
+ int pos;
+ int size;
+};
- for (i = 0; (i < oldsize) && (i < newsize); i++)
- if (old[i] != newbuf[i])
- break;
-
- return i;
+// Similar to ::memcmp(), but assumes equal |size| and returns match length.
+inline int matchlen(const unsigned char* buf1,
+ const unsigned char* buf2,
+ int size) {
+ for (int i = 0; i < size; ++i)
+ if (buf1[i] != buf2[i])
+ return i;
+ return size;
}
-// Finds a suffix in |old| that has the longest common prefix with |newbuf|,
+// Finds a suffix in |old| that has the longest common prefix with |keybuf|,
// aided by suffix array |I| of |old|. Returns the match length, and writes to
// |pos| a position of best match in |old|. If multiple such positions exist,
// |pos| would take an arbitrary one.
template <class T>
-int search(T I,
- const unsigned char* old,
- int oldsize,
- const unsigned char* newbuf,
- int newsize,
- int* pos) {
+SearchResult search(T I,
+ const unsigned char* srcbuf,
+ int srcsize,
+ const unsigned char* keybuf,
+ int keysize) {
int lo = 0;
- int hi = oldsize;
+ int hi = srcsize;
while (hi - lo >= 2) {
int mid = (lo + hi) / 2;
- if (std::lexicographical_compare(old + I[mid], old + oldsize, newbuf,
- newbuf + newsize)) {
+ if (std::lexicographical_compare(
+ srcbuf + I[mid], srcbuf + srcsize, keybuf, keybuf + keysize)) {
lo = mid;
} else {
hi = mid;
}
}
-
- int x = matchlen(old + I[lo], oldsize - I[lo], newbuf, newsize);
- int y = matchlen(old + I[hi], oldsize - I[hi], newbuf, newsize);
- if (x > y) {
- *pos = I[lo];
- return x;
- }
- *pos = I[hi];
- return y;
+ int x = matchlen(srcbuf + I[lo], keybuf, std::min(srcsize - I[lo], keysize));
+ int y = matchlen(srcbuf + I[hi], keybuf, std::min(srcsize - I[hi], keysize));
+ return (x > y) ? SearchResult(I[lo], x) : SearchResult(I[hi], y);
}
-} // namespace courgette
+} // namespace bsdiff
#endif // COURGETTE_THIRD_PARTY_BSDIFF_BSDIFF_SEARCH_H_
« no previous file with comments | « courgette/third_party/bsdiff/bsdiff_create.cc ('k') | courgette/third_party/bsdiff/bsdiff_search_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698