Files
oceanbase/unittest/storage/memtable/strutils.h
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

87 lines
2.0 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
class Printer
{
public:
enum { MAX_BUF_SIZE = 4096};
Printer(): limit_(MAX_BUF_SIZE), pos_(0)
{
memset(buf_, 0, MAX_BUF_SIZE);
}
~Printer()
{
pos_ = 0;
}
void reset()
{
pos_ = 0;
*buf_ = 0;
}
char *get_str() { return NULL != buf_ && limit_ > 0 ? buf_ : NULL; }
char *append(const char *format, ...)
{
char *src = NULL;
int64_t count = 0;
va_list ap;
va_start(ap, format);
if (NULL != buf_ && limit_ > 0 && pos_ < limit_
&& pos_ + (count = vsnprintf(buf_ + pos_, limit_ - pos_, format, ap)) < limit_) {
src = buf_ + pos_;
pos_ += count;
}
va_end(ap);
return src;
}
char *new_str(const char *format, ...)
{
char *src = NULL;
int64_t count = 0;
va_list ap;
va_start(ap, format);
if (NULL != buf_ && limit_ > 0 && pos_ < limit_
&& pos_ + (count = vsnprintf(buf_ + pos_, limit_ - pos_, format, ap)) + 1 < limit_) {
src = buf_ + pos_;
pos_ += count + 1;
}
va_end(ap);
return src;
}
private:
char buf_[MAX_BUF_SIZE];
int64_t limit_;
int64_t pos_;
};
class Tokenizer
{
public:
Tokenizer(char* str, const char* delim): str_(str), delim_(delim), saveptr_(NULL)
{}
~Tokenizer() {}
const char* next() {
char* ret = NULL;
if (NULL == saveptr_) {
ret = strtok_r(str_, delim_, &saveptr_);
} else {
ret = strtok_r(NULL, delim_, &saveptr_);
}
return ret;
}
private:
char* str_;
const char* delim_;
char* saveptr_;
};