integers.cc 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "sql/recover_module/integers.h"
  5. #include "base/check_op.h"
  6. namespace sql {
  7. namespace recover {
  8. std::pair<int64_t, const uint8_t*> ParseVarint(const uint8_t* buffer,
  9. const uint8_t* buffer_end) {
  10. DCHECK(buffer != nullptr);
  11. DCHECK(buffer_end != nullptr);
  12. DCHECK_LT(buffer, buffer_end);
  13. const uint8_t* const regular_buffer_end =
  14. (buffer_end - buffer > kMaxVarintSize - 1) ? buffer + kMaxVarintSize - 1
  15. : buffer_end;
  16. uint64_t value = 0;
  17. uint8_t last_byte;
  18. while (buffer < regular_buffer_end) {
  19. last_byte = *buffer;
  20. ++buffer;
  21. value = (value << 7) | (last_byte & 0x7f);
  22. if ((last_byte & 0x80) == 0)
  23. break;
  24. }
  25. if (buffer < buffer_end && (last_byte & 0x80) != 0) {
  26. value = (value << 8) | *buffer;
  27. ++buffer;
  28. }
  29. return {value, buffer};
  30. }
  31. } // namespace recover
  32. } // namespace sql