Files
oceanbase/unittest/storage/memtable/strutils.h
gm 4a92b6d7df reformat source code
according to code styles, 'AccessModifierOffset' should be -2.
2021-06-17 10:40:36 +08:00

91 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_;
};