summaryrefslogtreecommitdiffhomepage
path: root/libcommon/stringutil.cpp
blob: f87fa00d2ab12f2eaced7dc5dd677ec6d3c4c720 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "stringutil.h"

#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/case_conv.hpp>

#include <cstdarg>

std::string strfmt(const char* fmt, ...)
{
 va_list args;

 va_start(args, fmt);
 int size = std::vsnprintf(nullptr, 0, fmt, args);
 va_end(args);

 std::string result(size, ' ');

 va_start(args, fmt);
 std::vsnprintf(result.data(), size + 1, fmt, args);
 va_end(args);

 return result;
}

std::vector<std::string> split(std::string value, const std::string separators)
{
 std::vector<std::string> result;

 size_t pos0 = 0;
 size_t pos1 = 0;
 while (pos0 < value.size()) {
  pos1 = value.find_first_of(separators, pos0);
  if (pos1 == std::string::npos)
   pos1 = value.size();
  std::string part = value.substr(pos0, pos1 - pos0);
  //std::cout << "DEBUG: " << part << std::endl << std::flush;
  if (part != "")
   result.push_back(part);
  pos0 = value.find_first_not_of(separators, pos1);
  if (pos0 == std::string::npos)
   pos0 = value.size();
 }

 return result;
}

std::string join(std::vector<std::string> vs, std::string separator)
{
  std::string s;
  for (const auto& line : vs) {
   if (s.size() > 0)
    s += separator;
   s += line;
  }

  return s;
}

bool startsWithAnyOfLower(const std::string &s, const std::vector<std::string> &list) {
 for (const std::string& element : list) {
  if (boost::algorithm::starts_with(boost::algorithm::to_lower_copy(s), boost::algorithm::to_lower_copy(element)))
   return true;
 }
 return false;
}