123456789101112131415161718192021222324252627282930313233343536373839 |
- // Copyright 2019 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "sql/recover_module/integers.h"
- #include "base/check_op.h"
- namespace sql {
- namespace recover {
- std::pair<int64_t, const uint8_t*> ParseVarint(const uint8_t* buffer,
- const uint8_t* buffer_end) {
- DCHECK(buffer != nullptr);
- DCHECK(buffer_end != nullptr);
- DCHECK_LT(buffer, buffer_end);
- const uint8_t* const regular_buffer_end =
- (buffer_end - buffer > kMaxVarintSize - 1) ? buffer + kMaxVarintSize - 1
- : buffer_end;
- uint64_t value = 0;
- uint8_t last_byte;
- while (buffer < regular_buffer_end) {
- last_byte = *buffer;
- ++buffer;
- value = (value << 7) | (last_byte & 0x7f);
- if ((last_byte & 0x80) == 0)
- break;
- }
- if (buffer < buffer_end && (last_byte & 0x80) != 0) {
- value = (value << 8) | *buffer;
- ++buffer;
- }
- return {value, buffer};
- }
- } // namespace recover
- } // namespace sql
|