leveldb源码-util之logging

这不是一个日志工具类... 只定义了几个全局函数:

字符串后追加数字

// 比较简单,就是snprintf把字符串转一下,然后append
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);
    }
  }
}

整型转字符串: 先创建一个空字符串,然后调用字符串追加整数的方法
字符串转义:先创建空字符串,然后追加字符

把一个表示整数的字符数组转成整数:

// C++版的atoi,值得学习
// 1. 考虑了最大整数溢出的问题
// 2. 考虑了第一个字符是否数字的问题
// 3. 看起来只能转正整数
bool ConsumeDecimalNumber(Slice* in, uint64_t* val) {
  uint64_t v = 0;
  int digits = 0;
  while (!in->empty()) {
    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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,208评论 0 13
  • 你总认为自己的生活都没什么问题,其实你的生活已经出现很多隐性的问题,它在慢慢的生根发芽。你逐渐的感觉到你的生活有越...
    刘鼻涕26阅读 132评论 0 0
  • 小时候的冬至是一碗浓浓的疙瘩汤,放学以后,踏着厚厚的雪地往家赶,或鹅毛大雪,或窸窣小雪,总之,像约定好似的,冬至这...
    Sophie朵儿阅读 1,043评论 2 7
  • 实话生活 体悟人生 木风恒:你真的跟那客户回去 察看导致马达烧掉的原因了 兄弟:回了 不回怎么得 我可不想又再次让...
    木风恒阅读 188评论 0 1
  • 前两天去武汉,奔波了三天,先是去灵泉寺参加余浩老师的九针义诊断,然后赶去参加心如一(马一)老师的师傅的修行课程,没...
    观宇阅读 381评论 0 0