libcopp  1.2.1
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 
30 #if defined(_MSC_VER) && _MSC_VER >= 1600
31 #define UTIL_STRFUNC_STRCASE_CMP(l, r) _stricmp(l, r)
32 #define UTIL_STRFUNC_STRNCASE_CMP(l, r, s) _strnicmp(l, r, s)
33 #define UTIL_STRFUNC_STRCMP(l, r) strcmp(l, r)
34 #define UTIL_STRFUNC_STRNCMP(l, r, s) strncmp(l, r, s)
35 #else
36 #define UTIL_STRFUNC_STRCASE_CMP(l, r) strcasecmp(l, r)
37 #define UTIL_STRFUNC_STRNCASE_CMP(l, r, s) strncasecmp(l, r, s)
38 #define UTIL_STRFUNC_STRCMP(l, r) strcmp(l, r)
39 #define UTIL_STRFUNC_STRNCMP(l, r, s) strncmp(l, r, s)
40 #endif
41 
42 #if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || 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) vsnprintf_s(buffer, static_cast<size_t>(bufsz), _TRUNCATE, fmt, arg)
47 #define UTIL_STRFUNC_SNPRINTF(...) sprintf_s(__VA_ARGS__)
48 #else
49 #define UTIL_STRFUNC_VSNPRINTF(buffer, bufsz, fmt, arg) vsnprintf_s(buffer, static_cast<size_t>(bufsz), fmt, arg)
50 #define UTIL_STRFUNC_SNPRINTF(...) snprintf_s(__VA_ARGS__)
51 #endif
52 
53 #define UTIL_STRFUNC_C11_SUPPORT 1
54 #else
55 #define UTIL_STRFUNC_SSCANF(...) sscanf(__VA_ARGS__)
56 #define UTIL_STRFUNC_SNPRINTF(...) snprintf(__VA_ARGS__)
57 #define UTIL_STRFUNC_VSNPRINTF(buffer, bufsz, fmt, arg) vsnprintf(buffer, static_cast<int>(bufsz), fmt, arg)
58 #endif
59 
60 namespace util {
61  namespace string {
68  template <typename TCH = char>
69  static TCH tolower(TCH c) {
70  if (c >= 'A' && c <= 'Z') {
71  return static_cast<TCH>(c - 'A' + 'a');
72  }
73 
74  return c;
75  }
76 
83  template <typename TCH = char>
84  static TCH toupper(TCH c) {
85  if (c >= 'a' && c <= 'z') {
86  return static_cast<TCH>(c - 'a' + 'A');
87  }
88 
89  return c;
90  }
91 
98  template <typename T>
99  void str2int(T &out, const char *str) {
100  out = static_cast<T>(0);
101  if (NULL == str || !(*str)) {
102  return;
103  }
104 
105  // negative
106  bool is_negative = false;
107  while (*str && *str == '-') {
108  is_negative = !is_negative;
109  ++str;
110  }
111 
112  if (!(*str)) {
113  return;
114  }
115 
116  if ('0' == str[0] && 'x' == tolower(str[1])) { // hex
117  for (size_t i = 2; str[i]; ++i) {
118  char c = tolower(str[i]);
119  if (c >= '0' && c <= '9') {
120  out <<= 4;
121  out += c - '0';
122  } else if (c >= 'a' && c <= 'f') {
123  out <<= 4;
124  out += c - 'a' + 10;
125  } else {
126  break;
127  }
128  }
129  } else if ('\\' == str[0]) { // oct
130  for (size_t i = 1; str[i] >= '0' && str[i] < '8'; ++i) {
131  out <<= 3;
132  out += str[i] - '0';
133  }
134  } else { // dec
135  for (size_t i = 0; str[i] >= '0' && str[i] <= '9'; ++i) {
136  out *= 10;
137  out += str[i] - '0';
138  }
139  }
140 
141  if (is_negative) {
142  out = (~out) + 1;
143  }
144  }
145 
151  template <typename T>
152  inline T to_int(const char *str) {
153  T ret = 0;
154  str2int(ret, str);
155  return ret;
156  }
157 
164  template <typename TStr, typename TCh>
165  void hex(TStr *out, TCh c, bool upper_case = false) {
166  out[0] = static_cast<TStr>((c >> 4) & 0x0F);
167  out[1] = static_cast<TStr>(c & 0x0F);
168 
169  for (int i = 0; i < 2; ++i) {
170  if (out[i] > 9) {
171  out[i] += (upper_case ? 'A' : 'a') - 10;
172  } else {
173  out[i] += '0';
174  }
175  }
176  }
177 
184  template <typename TStr, typename TCh>
185  void oct(TStr *out, TCh c) {
186  out[0] = static_cast<TStr>(((c >> 6) & 0x07) + '0');
187  out[1] = static_cast<TStr>(((c >> 3) & 0x07) + '0');
188  out[2] = static_cast<TStr>((c & 0x07) + '0');
189  }
190 
198  template <typename TCh>
199  void serialization(const void *src, size_t ss, TCh *out, size_t &os) {
200  const TCh *cs = reinterpret_cast<const TCh *>(src);
201  size_t i, j;
202  for (i = 0, j = 0; i < ss && j < os; ++i) {
203  if (cs[i] >= 32 && cs[i] < 127) {
204  out[j] = cs[i];
205  ++j;
206  } else if (j + 4 <= os) {
207  out[j++] = '\\';
208  oct(&out[j], cs[i]);
209  j += 3;
210  } else {
211  break;
212  }
213  }
214 
215  os = j;
216  }
217 
224  template <typename Elem, typename Traits>
225  void serialization(const void *src, size_t ss, std::basic_ostream<Elem, Traits> &out) {
226  const Elem *cs = reinterpret_cast<const Elem *>(src);
227  size_t i;
228  for (i = 0; i < ss; ++i) {
229  if (cs[i] >= 32 && cs[i] < 127) {
230  out.put(cs[i]);
231  } else {
232  Elem tmp[4] = {'\\', 0, 0, 0};
233  oct(&tmp[1], cs[i]);
234  out.write(tmp, 4);
235  }
236  }
237  }
238 
246  template <typename TCh>
247  void dumphex(const void *src, size_t ss, TCh *out, bool upper_case = false) {
248  const unsigned char *cs = reinterpret_cast<const unsigned char *>(src);
249  size_t i;
250  for (i = 0; i < ss; ++i) {
251  hex<TCh, unsigned char>(&out[i << 1], cs[i], upper_case);
252  }
253  }
254 
262  template <typename Elem, typename Traits>
263  void dumphex(const void *src, size_t ss, std::basic_ostream<Elem, Traits> &out, bool upper_case = false) {
264  const unsigned char *cs = reinterpret_cast<const unsigned char *>(src);
265  size_t i;
266  Elem tmp[2];
267  for (i = 0; i < ss; ++i) {
268  hex<Elem, unsigned char>(tmp, cs[i], upper_case);
269  out.write(tmp, 2);
270  }
271  }
272  } // namespace string
273 } // namespace util
274 
275 #endif /* _UTIL_COMMON_COMPILER_MESSAGE_H_ */
void oct(TStr *out, TCh c)
字符转8进制表示
Definition: string_oprs.h:185
void str2int(T &out, const char *str)
字符串转整数
Definition: string_oprs.h:99
void hex(TStr *out, TCh c, bool upper_case=false)
字符转十六进制表示
Definition: string_oprs.h:165
static TCH tolower(TCH c)
字符转小写
Definition: string_oprs.h:69
static TCH toupper(TCH c)
字符转大写
Definition: string_oprs.h:84
void serialization(const void *src, size_t ss, TCh *out, size_t &os)
字符转8进制表示
Definition: string_oprs.h:199
T to_int(const char *str)
字符串转整数
Definition: string_oprs.h:152
void dumphex(const void *src, size_t ss, TCh *out, bool upper_case=false)
字符转16进制表示
Definition: string_oprs.h:247