blob: 3ed74356bda07e3f0f56d62901adfa3ca45dd399 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdarg.h>
#include "lib/commons.h"
#include "util/StringUtil.h"
namespace NativeTask {
string StringUtil::ToString(int32_t v) {
char tmp[32];
snprintf(tmp, 32, "%d", v);
return tmp;
}
string StringUtil::ToString(uint32_t v) {
char tmp[32];
snprintf(tmp, 32, "%u", v);
return tmp;
}
string StringUtil::ToString(int64_t v) {
char tmp[32];
snprintf(tmp, 32, "%"PRId64, v);
return tmp;
}
string StringUtil::ToString(int64_t v, char pad, int64_t len) {
char tmp[32];
snprintf(tmp, 32, "%%%c%"PRId64""PRId64, pad, len);
return Format(tmp, v);
}
string StringUtil::ToString(uint64_t v) {
char tmp[32];
snprintf(tmp, 32, "%"PRIu64, v);
return tmp;
}
string StringUtil::ToString(bool v) {
if (v) {
return "true";
} else {
return "false";
}
}
string StringUtil::ToString(float v) {
return Format("%f", v);
}
string StringUtil::ToString(double v) {
return Format("%lf", v);
}
string StringUtil::ToHexString(const void * v, uint32_t len) {
string ret = string(len * 2, '0');
for (uint32_t i = 0; i < len; i++) {
snprintf(&(ret[i*2]), 3, "%02x", ((char*)v)[i]);
}
return ret;
}
bool StringUtil::toBool(const string & str) {
if (str == "true") {
return true;
} else {
return false;
}
}
int64_t StringUtil::toInt(const string & str) {
return strtoll(str.c_str(), NULL, 10);
}
float StringUtil::toFloat(const string & str) {
return strtof(str.c_str(), NULL);
}
string StringUtil::Format(const char * fmt, ...) {
char tmp[256];
string dest;
va_list al;
va_start(al, fmt);
int len = vsnprintf(tmp, 255, fmt, al);
va_end(al);
if (len > 255) {
char * destbuff = new char[len + 1];
va_start(al, fmt);
len = vsnprintf(destbuff, len + 1, fmt, al);
va_end(al);
dest.append(destbuff, len);
delete [] destbuff;
} else {
dest.append(tmp, len);
}
return dest;
}
void StringUtil::Format(string & dest, const char * fmt, ...) {
char tmp[256];
va_list al;
va_start(al, fmt);
int len = vsnprintf(tmp, 255, fmt, al);
if (len > 255) {
char * destbuff = new char[len + 1];
len = vsnprintf(destbuff, len + 1, fmt, al);
dest.append(destbuff, len);
} else {
dest.append(tmp, len);
}
va_end(al);
}
string StringUtil::ToLower(const string & name) {
string ret = name;
for (size_t i = 0; i < ret.length(); i++) {
ret.at(i) = ::tolower(ret[i]);
}
return ret;
}
string StringUtil::Trim(const string & str) {
if (str.length() == 0) {
return str;
}
size_t l = 0;
while (l < str.length() && isspace(str[l])) {
l++;
}
if (l >= str.length()) {
return string();
}
size_t r = str.length();
while (isspace(str[r - 1])) {
r--;
}
return str.substr(l, r - l);
}
void StringUtil::Split(const string & src, const string & sep, vector<string> & dest, bool clean) {
if (sep.length() == 0) {
return;
}
size_t cur = 0;
while (true) {
size_t pos;
if (sep.length() == 1) {
pos = src.find(sep[0], cur);
} else {
pos = src.find(sep, cur);
}
string add = src.substr(cur, pos - cur);
if (clean) {
string trimed = Trim(add);
if (trimed.length() > 0) {
dest.push_back(trimed);
}
} else {
dest.push_back(add);
}
if (pos == string::npos) {
break;
}
cur = pos + sep.length();
}
}
string StringUtil::Join(const vector<string> & strs, const string & sep) {
string ret;
for (size_t i = 0; i < strs.size(); i++) {
if (i > 0) {
ret.append(sep);
}
ret.append(strs[i]);
}
return ret;
}
bool StringUtil::StartsWith(const string & str, const string & prefix) {
if ((prefix.length() > str.length())
|| (memcmp(str.data(), prefix.data(), prefix.length()) != 0)) {
return false;
}
return true;
}
bool StringUtil::EndsWith(const string & str, const string & suffix) {
if ((suffix.length() > str.length()) ||
(memcmp(str.data() + str.length() - suffix.length(),
suffix.data(), suffix.length()) != 0)) {
return false;
}
return true;
}
} // namespace NativeTask