You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.7 KiB
72 lines
1.7 KiB
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style license that can be |
|
// found in the LICENSE file. See the AUTHORS file for names of contributors. |
|
|
|
#include "util/logging.h" |
|
|
|
#include <errno.h> |
|
#include <stdarg.h> |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include "leveldb/env.h" |
|
#include "leveldb/slice.h" |
|
|
|
namespace leveldb { |
|
|
|
void AppendNumberTo(std::string* str, uint64_t num) { |
|
char buf[30]; |
|
snprintf(buf, sizeof(buf), "%llu", (unsigned long long) num); |
|
str->append(buf); |
|
} |
|
|
|
void AppendEscapedStringTo(std::string* str, const Slice& value) { |
|
for (size_t i = 0; i < value.size(); i++) { |
|
char c = value[i]; |
|
if (c >= ' ' && c <= '~') { |
|
str->push_back(c); |
|
} else { |
|
char buf[10]; |
|
snprintf(buf, sizeof(buf), "\\x%02x", |
|
static_cast<unsigned int>(c) & 0xff); |
|
str->append(buf); |
|
} |
|
} |
|
} |
|
|
|
std::string NumberToString(uint64_t num) { |
|
std::string r; |
|
AppendNumberTo(&r, num); |
|
return r; |
|
} |
|
|
|
std::string EscapeString(const Slice& value) { |
|
std::string r; |
|
AppendEscapedStringTo(&r, value); |
|
return r; |
|
} |
|
|
|
bool ConsumeDecimalNumber(Slice* in, uint64_t* val) { |
|
uint64_t v = 0; |
|
int digits = 0; |
|
while (!in->empty()) { |
|
unsigned char c = (*in)[0]; |
|
if (c >= '0' && c <= '9') { |
|
++digits; |
|
const int delta = (c - '0'); |
|
static const uint64_t kMaxUint64 = ~static_cast<uint64_t>(0); |
|
if (v > kMaxUint64/10 || |
|
(v == kMaxUint64/10 && delta > kMaxUint64%10)) { |
|
// Overflow |
|
return false; |
|
} |
|
v = (v * 10) + delta; |
|
in->remove_prefix(1); |
|
} else { |
|
break; |
|
} |
|
} |
|
*val = v; |
|
return (digits > 0); |
|
} |
|
|
|
} // namespace leveldb
|
|
|