Guitar
misc.h
Go to the documentation of this file.
1 #ifndef MISC_H
2 #define MISC_H
3 
4 #include <cstdint>
5 #include <cstring>
6 #include <functional>
7 #include <string>
8 #include <string_view>
9 #include <vector>
10 
11 #ifdef _WIN32
12 #else
13 #include <strings.h>
14 #endif
15 
16 // #ifdef APP_GUITAR
17 #include <QString>
18 // #endif
19 
20 namespace misc {
21 
22 static inline int stricmp(char const *s1, char const *s2)
23 {
24 #ifdef _WIN32
25  return ::stricmp(s1, s2);
26 #else
27  return ::strcasecmp(s1, s2);
28 #endif
29 }
30 
31 static inline int strnicmp(char const *s1, char const *s2, size_t n)
32 {
33 #ifdef _WIN32
34  return ::strnicmp(s1, s2, n);
35 #else
36  return ::strncasecmp(s1, s2, n);
37 #endif
38 }
39 
40 static inline int stricmp(std::string_view const &s1, std::string_view const &s2)
41 {
42  size_t n1 = s1.size();
43  size_t n2 = s2.size();
44  size_t n = std::min(n1, n2);
45  if (n > 0) {
46  int i = strnicmp(s1.data(), s2.data(), n);
47  if (i != 0) return i;
48  }
49  if (n1 < n2) return -1;
50  if (n1 > n2) return 1;
51  return 0;
52 }
53 
54 static inline char const *stristr(const char *haystack, const char *needle)
55 {
56  size_t needle_len = strlen(needle);
57  for (const char *p = haystack; *p; p++) {
58  if (strnicmp(p, needle, needle_len) == 0) {
59  return p;
60  }
61  }
62  return nullptr;
63 }
64 
65 #ifdef USE_QT
66 QString normalizePathSeparator(QString const &str);
67 #endif
68 
69 std::vector<std::string_view> splitLinesV(std::string_view const &str);
70 std::vector<std::string_view> splitLinesV(std::vector<char> const &ba);
71 std::vector<std::string_view> splitLinesKeepNewLineV(std::string_view const &str);
72 std::vector<std::string> splitLines(std::string_view const &str);
73 #ifdef USE_QT
74 std::vector<QString> splitLines(QString const &text);
75 #endif
76 
77 std::vector<std::string_view> splitWords(std::string_view const &text);
78 std::vector<std::string_view> split(std::string_view const &sv, char sep);
79 std::string filename(std::string const &path);
80 bool starts_with(const std::string_view &str, const std::string_view &with);
81 bool starts_with(const std::string_view &str, char with);
82 bool ends_with(const std::string_view &str, const std::string_view &with);
83 bool ends_with(const std::string_view &str, char with);
84 std::string mid(std::string const &str, int start, int length = -1);
85 std::string replace_backslash_to_slash(std::string_view const &in);
86 std::string normalizePathSeparator(std::string const &str);
87 #ifdef USE_QT
88 QString normalizePathSeparator(QString const &str);
89 #endif
90 
91 void dump(const uint8_t *ptr, size_t len);
92 #ifdef USE_QT
93 void dump(QByteArray const *in);
94 #endif
95 bool isText(std::string const &mimetype);
96 bool isImage(std::string const &mimetype);
97 bool isSVG(std::string const &mimetype);
98 bool isPSD(std::string const &mimetype);
99 bool isPDF(std::string const &mimetype);
100 
101 std::string makeProxyServerURL(std::string text);
102 bool isExecutable(const std::string &cmd);
103 #ifdef USE_QT
104 bool isExecutable(QString const &cmd);
105 #endif
106 
107 bool isValidMailAddress(std::string const &email);
108 #ifdef USE_QT
109 bool isValidMailAddress(const QString &email);
110 #endif
111 
112 std::string_view trimmed(std::string_view const &s);
113 std::string_view trimQuotes(std::string_view s);
114 std::string_view trimNewLines(std::string_view s);
115 
116 std::string bin_to_hex_string(const void *begin, const void *end);
117 std::vector<uint8_t> hex_string_to_bin(std::string_view const &s, const char *sep = nullptr);
118 
119 int compare(uint8_t const *a, size_t n, uint8_t const *b, size_t m);
120 int compare(std::vector<uint8_t> const &a, std::vector<uint8_t> const &b);
121 
122 std::string toLower(std::string_view const &s);
123 std::string toUpper(std::string_view const &s);
124 
125 static inline std::vector<std::string> vector_string(std::vector<std::string_view> const &v)
126 {
127  std::vector<std::string> out;
128  for (auto const &s : v) {
129  out.emplace_back(s);
130  }
131  return out;
132 }
133 
134 template <typename T>
135 static inline T toi(std::string_view const &s, size_t *consumed = nullptr)
136 {
137  T n = 0;
138  size_t i = 0;
139  bool sign = false;
140  if (!s.empty()) {
141  while (i < s.size() && isspace((unsigned char)s[i])) {
142  i++;
143  }
144  if (i < s.size()) {
145  if (s[i] == '+') {
146  i++;
147  } else if (s[i] == '-') {
148  sign = true;
149  i++;
150  }
151  }
152  while (i < s.size()) {
153  if (s[i] < '0' || s[i] > '9') break;
154  n = n * 10 + (s[i] - '0');
155  i++;
156  }
157  }
158  if (consumed) {
159  *consumed = i;
160  }
161 
162 #ifdef _MSC_VER
163 #pragma warning(push)
164 #pragma warning(disable: 4146) // unary minus operator applied to unsigned type, result still unsigned
165 #endif
166 
167  return sign ? -n : n;
168 
169 #ifdef _MSC_VER
170 #pragma warning(pop)
171 #endif
172 }
173 
174 static inline void append(std::vector<char> *out, char const *ptr, size_t len)
175 {
176  if (out && ptr && len > 0) {
177  out->insert(out->end(), ptr, ptr + len);
178  }
179 }
180 
181 static inline void append(std::vector<char> *out, char c)
182 {
183  if (out) {
184  out->push_back(c);
185  }
186 }
187 
188 static inline void append(std::vector<char> *out, std::string_view const &v)
189 {
190  append(out, v.data(), v.size());
191 }
192 
193 std::string strip_vt(std::string_view const &s);
194 
195 std::string getProgram(std::string const &cmdline);
196 
197 } // namespace misc
198 
199 #endif // MISC_H
Definition: misc.h:20
std::string_view trimQuotes(std::string_view s)
文字列の両端から空白文字と引用符を取り除く
Definition: misc.cpp:546
bool isSVG(std::string const &mimetype)
MIMEタイプがSVG画像を表すか判定する
Definition: misc.cpp:382
static int strnicmp(char const *s1, char const *s2, size_t n)
Definition: misc.h:31
std::string replace_backslash_to_slash(std::string_view const &in)
バックスラッシュをスラッシュに置換する
Definition: misc.cpp:229
std::vector< uint8_t > hex_string_to_bin(std::string_view const &s, const char *sep=nullptr)
16進数文字列をバイナリデータに変換する
Definition: misc.cpp:634
std::vector< std::string_view > splitWords(std::string_view const &text)
文字列を単語に分割する
Definition: misc.cpp:96
std::vector< std::string_view > split(std::string_view const &sv, char sep)
Definition: misc.cpp:126
std::string toLower(std::string_view const &s)
Definition: misc.cpp:707
static int stricmp(std::string_view const &s1, std::string_view const &s2)
Definition: misc.h:40
void dump(const uint8_t *ptr, size_t len)
メモリダンプを16進数で表示する
Definition: misc.cpp:309
bool starts_with(const std::string_view &str, const std::string_view &with)
文字列が指定の文字列で始まるか判定する
Definition: misc.cpp:164
static void append(std::vector< char > *out, char const *ptr, size_t len)
Definition: misc.h:174
bool isImage(std::string const &mimetype)
MIMEタイプが画像ファイルを表すか判定する
Definition: misc.cpp:426
bool ends_with(const std::string_view &str, const std::string_view &with)
文字列が指定の文字列で終わるか判定する
Definition: misc.cpp:184
static std::vector< std::string > vector_string(std::vector< std::string_view > const &v)
Definition: misc.h:125
bool isValidMailAddress(std::string const &email)
Definition: misc.cpp:508
std::vector< std::string_view > splitLinesV(std::string_view const &str)
Definition: misc.cpp:60
bool isPSD(std::string const &mimetype)
MIMEタイプがPhotoshopファイルを表すか判定する
Definition: misc.cpp:397
bool isPDF(std::string const &mimetype)
MIMEタイプがPDFファイルを表すか判定する
Definition: misc.cpp:411
std::string strip_vt(std::string_view const &s)
VTシーケンスを取り除く
Definition: misc.cpp:737
std::string_view trimNewLines(std::string_view s)
文字列の両端から改行文字を取り除く
Definition: misc.cpp:569
std::string_view trimmed(std::string_view const &s)
文字列の両端から空白文字を取り除く
Definition: misc.cpp:528
std::string mid(std::string const &str, int start, int length=-1)
文字列の一部分を取得する
Definition: misc.cpp:205
static char const * stristr(const char *haystack, const char *needle)
Definition: misc.h:54
std::string normalizePathSeparator(std::string const &str)
パスの区切り文字を正規化する
Definition: misc.cpp:293
bool isExecutable(const std::string &cmd)
ファイルが実行可能か判定する
Definition: misc.cpp:475
std::vector< std::string_view > splitLinesKeepNewLineV(std::string_view const &str)
Definition: misc.cpp:70
std::string bin_to_hex_string(const void *begin, const void *end)
バイナリデータを16進数文字列に変換する
Definition: misc.cpp:607
static int stricmp(char const *s1, char const *s2)
Definition: misc.h:22
std::string makeProxyServerURL(std::string text)
プロキシサーバーURLを正規化する
Definition: misc.cpp:456
std::vector< std::string > splitLines(std::string_view const &str)
Definition: misc.cpp:75
std::string toUpper(std::string_view const &s)
Definition: misc.cpp:717
std::string filename(std::string const &path)
Definition: misc.cpp:149
bool isText(std::string const &mimetype)
バイナリデータの内容をヘキサでダンプする
Definition: misc.cpp:369
std::string getProgram(std::string const &cmdline)
Definition: misc.cpp:777
int compare(uint8_t const *a, size_t n, uint8_t const *b, size_t m)
2つのバイナリデータを比較する
Definition: misc.cpp:671
static T toi(std::string_view const &s, size_t *consumed=nullptr)
Definition: misc.h:135