45bool endswith(
const std::string& str,
const std::string& suffix) {
46 return str.size() >= suffix.size() &&
47 0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix);
50bool startswith(
const std::string& str,
const std::string& prefix) {
51 return prefix.size() <= str.size() &&
52 strncmp(str.c_str(), prefix.c_str(), prefix.size()) == 0;
55std::vector<std::string> split(
const char* token_string,
56 const std::string& delimiter) {
57 std::vector<std::string> tokens;
58 std::string s = std::string(token_string);
61 while ((pos = s.find(delimiter)) != std::string::npos) {
62 token = s.substr(0, pos);
63 tokens.push_back(token);
64 s.erase(0, pos + delimiter.length());
70std::vector<std::string> split(
const std::string&
string,
71 const std::string& delimiter) {
72 return split(
string.c_str(), delimiter);
75bool exists(
const std::string& name) {
77 return (_access(name.c_str(), 0) != -1);
79 return (access(name.c_str(), F_OK) != -1);
83void mkdir(
const std::string path) {
84#if defined(_WIN32) && !defined(__MINGW32__)
86#elif defined(__MINGW32__)
87 ::mkdir(path.c_str());
89 ::mkdir(path.c_str(), 0755);
93std::string ltrim(std::string s) {
97 find_if(s.begin(), s.end(), [](
int ch) { return !isspace(ch); }));
101std::string rtrim(std::string s) {
105 find_if(s.rbegin(), s.rend(), [](
int ch) { return !isspace(ch); }).base(),
110std::string trim(std::string s) {
116std::string join(std::vector<std::string> v,
char c) {
118 for (
auto p = v.begin(); p != v.end(); p++) {
120 if (p != v.end() - 1) {
127std::string tolower(
const std::string& input) {
128 std::string s(input);
129 std::transform(s.begin(), s.end(), s.begin(), ::tolower);
133bool replace(std::string& str,
const std::string& from,
const std::string& to) {
134 size_t start_pos = str.find(from);
135 if (start_pos == std::string::npos)
return false;
136 str.replace(start_pos, from.length(), to);
140void copy_file(
const std::string& src_path,
const std::string& dest_path) {
141 std::ifstream source(src_path, std::ios::binary);
142 std::ofstream dest(dest_path, std::ios::binary);
144 dest << source.rdbuf();
151 size_t check_start = sentence.find(
'*');
152 if (check_start == std::string::npos || check_start > sentence.size() - 3)
155 std::string check_str = sentence.substr(check_start + 1, 2);
156 unsigned long checksum = strtol(check_str.c_str(), 0, 16);
157 if (checksum == 0L && check_str !=
"00")
return false;
159 unsigned char calculated_checksum = 0;
160 for (std::string::const_iterator i = sentence.begin() + 1;
161 i != sentence.end() && *i !=
'*'; ++i)
162 calculated_checksum ^=
static_cast<unsigned char>(*i);
164 return calculated_checksum == checksum;
168 std::stringstream ss;
169 for (
auto it = str.begin(); it != str.end(); it++) {
170 if (std::isprint(*it) && *it !=
'\r' && *it !=
'\n') {
173 std::stringstream ss2;
174 ss2 << std::setw(2) << std::setfill(
'0') << std::uppercase << std::hex
175 <<
static_cast<int>(*it);
176 ss <<
"<" << ss2.str() <<
">";