This repository has been archived on 2020-05-25. You can view files and clone it, but cannot push or open issues or pull requests.
tdlib-fork/tdutils/td/utils/misc.cpp

95 lines
2.1 KiB
C++
Raw Normal View History

//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/utils/misc.h"
#include "td/utils/port/thread_local.h"
#include <algorithm>
#include <cstdlib>
#include <locale>
#include <sstream>
namespace td {
char *str_dup(Slice str) {
char *res = static_cast<char *>(std::malloc(str.size() + 1));
if (res == nullptr) {
return nullptr;
}
std::copy(str.begin(), str.end(), res);
res[str.size()] = '\0';
return res;
}
string implode(vector<string> v, char delimiter) {
string result;
for (auto &str : v) {
if (!result.empty()) {
result += delimiter;
}
result += str;
}
return result;
}
string oneline(Slice str) {
string result;
result.reserve(str.size());
bool after_new_line = true;
for (auto c : str) {
if (c != '\n') {
if (after_new_line) {
if (c == ' ') {
continue;
}
after_new_line = false;
}
result += c;
} else {
after_new_line = true;
result += ' ';
}
}
while (!result.empty() && result.back() == ' ') {
result.pop_back();
}
return result;
}
double to_double(Slice str) {
static TD_THREAD_LOCAL std::stringstream *ss;
if (init_thread_local<std::stringstream>(ss)) {
ss->imbue(std::locale::classic());
} else {
ss->str(std::string());
ss->clear();
}
ss->write(str.begin(), narrow_cast<std::streamsize>(str.size()));
double result = 0.0;
*ss >> result;
return result;
}
Result<string> hex_decode(Slice hex) {
if (hex.size() % 2 != 0) {
return Status::Error("Wrong hex string length");
}
string result(hex.size() / 2, '\0');
for (size_t i = 0; i < result.size(); i++) {
int high = hex_to_int(hex[i + i]);
int low = hex_to_int(hex[i + i + 1]);
if (high == 16 || low == 16) {
return Status::Error("Wrong hex string");
}
result[i] = static_cast<char>(high * 16 + low); // TODO implementation-defined
}
return std::move(result);
}
} // namespace td