libcopp  2.2.0
string_oprs.h
Go to the documentation of this file.
1 
15 #ifndef UTIL_COMMON_STRING_OPRS_H
16 #define UTIL_COMMON_STRING_OPRS_H
17 
18 // 目测主流编译器都支持且有优化, gcc 3.4 and upper, vc, clang, c++ builder xe3, intel c++ and etc.
19 #pragma once
20 
21 #include <stdint.h>
22 
23 #include <algorithm>
24 #include <cctype>
25 #include <cstdlib>
26 #include <cstring>
27 #include <ostream>
28 
29 #if defined(_MSC_VER) && _MSC_VER >= 1600
30 # define UTIL_STRFUNC_STRCASE_CMP(l, r) _stricmp(l, r)
31 # define UTIL_STRFUNC_STRNCASE_CMP(l, r, s) _strnicmp(l, r, s)
32 # define UTIL_STRFUNC_STRCMP(l, r) strcmp(l, r)
33 # define UTIL_STRFUNC_STRNCMP(l, r, s) strncmp(l, r, s)
34 #else
35 # define UTIL_STRFUNC_STRCASE_CMP(l, r) strcasecmp(l, r)
36 # define UTIL_STRFUNC_STRNCASE_CMP(l, r, s) strncasecmp(l, r, s)
37 # define UTIL_STRFUNC_STRCMP(l, r) strcmp(l, r)
38 # define UTIL_STRFUNC_STRNCMP(l, r, s) strncmp(l, r, s)
39 #endif
40 
41 #if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
42  defined(__STDC_LIB_EXT1__)
43 # define UTIL_STRFUNC_SSCANF(...) sscanf_s(__VA_ARGS__)
44 
45 # ifdef _MSC_VER
46 # define UTIL_STRFUNC_VSNPRINTF(buffer, bufsz, fmt, arg) \
47  vsnprintf_s(buffer, static_cast<size_t>(bufsz), _TRUNCATE, fmt, arg)
48 # define UTIL_STRFUNC_SNPRINTF(...) sprintf_s(__VA_ARGS__)
49 # else
50 # define UTIL_STRFUNC_VSNPRINTF(buffer, bufsz, fmt, arg) vsnprintf_s(buffer, static_cast<size_t>(bufsz), fmt, arg)
51 # define UTIL_STRFUNC_SNPRINTF(...) snprintf_s(__VA_ARGS__)
52 # endif
53 
54 # define UTIL_STRFUNC_C11_SUPPORT 1
55 #else
56 # define UTIL_STRFUNC_SSCANF(...) sscanf(__VA_ARGS__)
57 # define UTIL_STRFUNC_SNPRINTF(...) snprintf(__VA_ARGS__)
58 # define UTIL_STRFUNC_VSNPRINTF(buffer, bufsz, fmt, arg) vsnprintf(buffer, static_cast<int>(bufsz), fmt, arg)
59 #endif
60 
61 namespace util {
62 namespace string {
69 template <typename TCH = char>
70 static TCH tolower(TCH c) {
71  if (c >= 'A' && c <= 'Z') {
72  return static_cast<TCH>(c - 'A' + 'a');
73  }
74 
75  return c;
76 }
77 
84 template <typename TCH = char>
85 static TCH toupper(TCH c) {
86  if (c >= 'a' && c <= 'z') {
87  return static_cast<TCH>(c - 'a' + 'A');
88  }
89 
90  return c;
91 }
92 
99 template <typename T>
100 void str2int(T &out, const char *str) {
101  out = static_cast<T>(0);
102  if (nullptr == str || !(*str)) {
103  return;
104  }
105 
106  // negative
107  bool is_negative = false;
108  while (*str && *str == '-') {
109  is_negative = !is_negative;
110  ++str;
111  }
112 
113  if (!(*str)) {
114  return;
115  }
116 
117  if ('0' == str[0] && 'x' == tolower(str[1])) { // hex
118  for (size_t i = 2; str[i]; ++i) {
119  char c = tolower(str[i]);
120  if (c >= '0' && c <= '9') {
121  out <<= 4;
122  out += c - '0';
123  } else if (c >= 'a' && c <= 'f') {
124  out <<= 4;
125  out += c - 'a' + 10;
126  } else {
127  break;
128  }
129  }
130  } else if ('\\' == str[0]) { // oct
131  for (size_t i = 1; str[i] >= '0' && str[i] < '8'; ++i) {
132  out <<= 3;
133  out += str[i] - '0';
134  }
135  } else { // dec
136  for (size_t i = 0; str[i] >= '0' && str[i] <= '9'; ++i) {
137  out *= 10;
138  out += str[i] - '0';
139  }
140  }
141 
142  if (is_negative) {
143  out = (~out) + 1;
144  }
145 }
146 
152 template <typename T>
153 inline T to_int(const char *str) {
154  T ret = 0;
155  str2int(ret, str);
156  return ret;
157 }
158 
165 template <typename TStr, typename TCh>
166 void hex(TStr *out, TCh c, bool upper_case = false) {
167  out[0] = static_cast<TStr>((c >> 4) & 0x0F);
168  out[1] = static_cast<TStr>(c & 0x0F);
169 
170  for (int i = 0; i < 2; ++i) {
171  if (out[i] > 9) {
172  out[i] += (upper_case ? 'A' : 'a') - 10;
173  } else {
174  out[i] += '0';
175  }
176  }
177 }
178 
185 template <typename TStr, typename TCh>
186 void oct(TStr *out, TCh c) {
187  out[0] = static_cast<TStr>(((c >> 6) & 0x07) + '0');
188  out[1] = static_cast<TStr>(((c >> 3) & 0x07) + '0');
189  out[2] = static_cast<TStr>((c & 0x07) + '0');
190 }
191 
199 template <typename TCh>
200 void serialization(const void *src, size_t ss, TCh *out, size_t &os) {
201  const TCh *cs = reinterpret_cast<const TCh *>(src);
202  size_t i, j;
203  for (i = 0, j = 0; i < ss && j < os; ++i) {
204  if (cs[i] >= 32 && cs[i] < 127) {
205  out[j] = cs[i];
206  ++j;
207  } else if (j + 4 <= os) {
208  out[j++] = '\\';
209  oct(&out[j], cs[i]);
210  j += 3;
211  } else {
212  break;
213  }
214  }
215 
216  os = j;
217 }
218 
225 template <typename Elem, typename Traits>
226 void serialization(const void *src, size_t ss, std::basic_ostream<Elem, Traits> &out) {
227  const Elem *cs = reinterpret_cast<const Elem *>(src);
228  size_t i;
229  for (i = 0; i < ss; ++i) {
230  if (cs[i] >= 32 && cs[i] < 127) {
231  out.put(cs[i]);
232  } else {
233  Elem tmp[4] = {'\\', 0, 0, 0};
234  oct(&tmp[1], cs[i]);
235  out.write(tmp, 4);
236  }
237  }
238 }
239 
247 template <typename TCh>
248 void dumphex(const void *src, size_t ss, TCh *out, bool upper_case = false) {
249  const unsigned char *cs = reinterpret_cast<const unsigned char *>(src);
250  size_t i;
251  for (i = 0; i < ss; ++i) {
252  hex<TCh, unsigned char>(&out[i << 1], cs[i], upper_case);
253  }
254 }
255 
263 template <typename Elem, typename Traits>
264 void dumphex(const void *src, size_t ss, std::basic_ostream<Elem, Traits> &out, bool upper_case = false) {
265  const unsigned char *cs = reinterpret_cast<const unsigned char *>(src);
266  size_t i;
267  Elem tmp[2];
268  for (i = 0; i < ss; ++i) {
269  hex<Elem, unsigned char>(tmp, cs[i], upper_case);
270  out.write(tmp, 2);
271  }
272 }
273 } // namespace string
274 } // namespace util
275 
276 #endif /* _UTIL_COMMON_COMPILER_MESSAGE_H_ */
void str2int(T &out, const char *str)
字符串转整数
Definition: string_oprs.h:100
T to_int(const char *str)
字符串转整数
Definition: string_oprs.h:153
static TCH tolower(TCH c)
字符转小写
Definition: string_oprs.h:70
void hex(TStr *out, TCh c, bool upper_case=false)
字符转十六进制表示
Definition: string_oprs.h:166
void dumphex(const void *src, size_t ss, TCh *out, bool upper_case=false)
字符转16进制表示
Definition: string_oprs.h:248
void oct(TStr *out, TCh c)
字符转8进制表示
Definition: string_oprs.h:186
static TCH toupper(TCH c)
字符转大写
Definition: string_oprs.h:85
void serialization(const void *src, size_t ss, TCh *out, size_t &os)
字符转8进制表示
Definition: string_oprs.h:200