15 #ifndef INCG_IRIS_IUTEST_STRING_HPP_E22B02D7_E9E7_412C_B609_DC3D9C66895D_
16 #define INCG_IRIS_IUTEST_STRING_HPP_E22B02D7_E9E7_412C_B609_DC3D9C66895D_
20 #if defined(__MWERKS__)
29 #if defined(IUTEST_OS_CYGWIN) || defined(__arm__)
37 IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()
43 ::std::string StringFormat(
const char* format, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
44 ::std::
string StringFormat(const
char* format, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);
49 inline int iu_mbicmp(
char l,
char r)
51 const int ul =
static_cast<int>(
static_cast<unsigned char>(toupper(l)));
52 const int ur =
static_cast<int>(
static_cast<unsigned char>(toupper(r)));
56 inline int iu_stricmp(
const char* str1,
const char* str2)
62 const int ret = iu_mbicmp(*l, *r);
70 return iu_mbicmp(*l, *r);
73 inline int iu_wcicmp(
wchar_t l,
wchar_t r)
75 const ::std::wint_t ul = towupper(l);
76 const ::std::wint_t ur = towupper(r);
80 inline int iu_wcsicmp(
const wchar_t * str1,
const wchar_t * str2)
82 const wchar_t* l = str1;
83 const wchar_t* r = str2;
86 const int ret = iu_wcicmp(*l, *r);
94 return iu_wcicmp(*l, *r);
103 inline int iu_stricmp(
const char* str1,
const char* str2)
105 #if defined(__BORLANDC__)
106 return stricmp(str1, str2);
107 #elif defined(_MSC_VER)
108 return _stricmp(str1, str2);
109 #elif defined(IUTEST_OS_WINDOWS) && !defined(IUTEST_OS_WINDOWS_MINGW) && !defined(__STRICT_ANSI__)
110 return _stricmp(str1, str2);
111 #elif !defined(__MWERKS__) && !defined(IUTEST_OS_WINDOWS) && !defined(IUTEST_OS_CYGWIN)
113 return strcasecmp(str1, str2);
115 return wrapper::iu_stricmp(str1, str2);
123 inline int iu_wcsicmp(
const wchar_t * str1,
const wchar_t * str2)
125 #if defined(_MSC_VER)
126 return _wcsicmp(str1, str2);
127 #elif defined(IUTEST_OS_LINUX) && !defined(IUTEST_ARCH_ARM)
128 return wcscasecmp(str1, str2);
130 return wrapper::iu_wcsicmp(str1, str2);
137 int iu_vsnprintf(
char* dst,
size_t size,
const char* format, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(3, 0);
139 inline int iu_vsnprintf(
char* dst,
size_t size,
const char* format, va_list va)
141 char buffer[4096] = {0};
142 char* write_buffer = dst != NULL && size >= 4096 ? dst : buffer;
143 const int ret = vsprintf(write_buffer, format, va);
146 const size_t length =
static_cast<size_t>(ret);
147 const size_t write = (size <= length) ? size - 1 : length;
148 if( write_buffer == buffer ) {
149 strncpy(dst, buffer, write);
158 int iu_vsnprintf(
char* dst,
size_t size,
const char* format, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(3, 0);
159 int iu_snprintf(
char* dst,
size_t size,
const char* format, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(3, 4);
165 inline
int iu_vsnprintf(
char* dst,
size_t size, const
char* format, va_list va)
167 if( dst == NULL && size > 0 )
171 #if defined(_MSC_VER)
172 if( dst == NULL || size <= 0 )
174 return _vscprintf(format, va);
176 # if IUTEST_HAS_WANT_SECURE_LIB
177 return _vsnprintf_s(dst, size, _TRUNCATE, format, va);
179 return _vsnprintf(dst, size, format, va);
181 #elif defined(__CYGWIN__) \
182 && (defined(__STRICT_ANSI__) && (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) && (__cplusplus >= 201103L))
183 return wrapper::iu_vsnprintf(dst, size, format, va);
184 #elif (defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)) && defined(__STRICT_ANSI__)
185 return wrapper::iu_vsnprintf(dst, size, format, va);
187 return vsnprintf(dst, size, format, va);
195 inline int iu_snprintf(
char* dst,
size_t size,
const char* format, ...)
198 va_start(va, format);
199 const int ret = iu_vsnprintf(dst, size, format, va);
204 IUTEST_PRAGMA_CONSTEXPR_CALLED_AT_RUNTIME_WARN_DISABLE_BEGIN()
206 inline
bool IsEmpty(const
char* p) {
return p == NULL || *p ==
'\0'; }
208 inline const char* NullableString(
const char* str) {
return str == NULL ?
"" : str; }
211 return p == NULL ? NULL : (IsSpace(*p) ? SkipSpace(++p) : p);
215 return (p == NULL || *p ==
'\0') ? NULL : ((*p ==
',') ? p : FindComma(++p));
217 inline bool IsStringEqual(
const char* str1,
const char* str2) {
return strcmp(str1, str2) == 0; }
218 inline bool IsStringEqual(const ::std::string& str1,
const char* str2) {
return str1.compare(str2) == 0; }
219 inline bool IsStringEqual(const ::std::string& str1, const ::std::string& str2) {
return str1.compare(str2) == 0; }
220 inline bool IsStringCaseEqual(
const char* str1,
const char* str2) {
return iu_stricmp(str1, str2) == 0; }
221 inline bool IsStringCaseEqual(const ::std::string& str1,
const char* str2) {
return iu_stricmp(str1.c_str(), str2) == 0; }
222 inline bool IsStringCaseEqual(const ::std::string& str1, const ::std::string& str2) {
return iu_stricmp(str1.c_str(), str2.c_str()) == 0; }
223 inline bool IsStringForwardMatching(
const char* str1,
const char* str2) {
return strstr(str1, str2) == str1; }
224 inline bool IsStringForwardMatching(const ::std::string& str1,
const char* str2) {
return str1.find(str2) == 0; }
225 inline bool IsStringForwardMatching(const ::std::string& str1,
const std::string& str2) {
return str1.find(str2) == 0; }
226 inline bool IsStringContains(
const char* str1,
const char* str2) {
return strstr(str1, str2) != NULL; }
227 inline bool IsStringContains(const ::std::string& str1,
const char* str2) {
return str1.find(str2) != ::std::string::npos; }
228 inline bool IsStringContains(const ::std::string& str1, const ::std::string& str2) {
return str1.find(str2) != ::std::string::npos; }
230 inline void StringReplace(::std::string& str,
const char* from,
size_t n,
const char* to)
232 ::std::string::size_type pos = 0;
233 while(
static_cast<void>(pos = str.find(from, pos)), pos != ::std::string::npos )
235 str.replace(pos, n, to);
239 inline void StringReplace(::std::string& str,
char a,
const char* to)
242 return StringReplace(str, s, 1, to);
244 inline ::std::string StripLeadingSpace(const ::std::string& str)
246 ::std::string::const_iterator it = str.begin();
247 while( it != str.end() && IsSpace(*it) )
251 return ::std::string(it, str.end());
253 inline ::std::string StripTrailingSpace(const ::std::string& str)
255 ::std::string::const_iterator it = str.end()-1;
256 while(it != str.begin() && IsSpace(*it))
260 return ::std::string(str.begin(), it+1);
262 inline ::std::string StripSpace(const ::std::string& str)
264 ::std::string::const_iterator start = str.begin();
265 while( start != str.end() && IsSpace(*start) )
269 ::std::string::const_iterator end = str.end()-1;
270 while( end != str.begin() && IsSpace(*end) )
274 return ::std::string(start, end+1);
277 inline bool StringIsBlank(const ::std::string& str)
279 ::std::string::const_iterator it = str.begin();
280 while( it != str.end() )
283 if( !IsSpace(ch) && ch !=
'\r' && ch !=
'\n' )
292 inline void StringReplaceToLF(::std::string& str)
294 StringReplace(str,
"\r\n", 2,
"\n");
295 StringReplace(str,
"\r" , 1,
"\n");
297 inline ::std::string StringRemoveComment(const ::std::string& str)
300 ::std::string::size_type prev = 0;
301 ::std::string::size_type pos = str.find(
'\n', 0);
302 while( pos != ::std::string::npos )
305 if( str[prev] !=
'#' ) {
306 r += str.substr(prev, pos-prev);
309 pos = str.find(
'\n', pos);
311 if( str[prev] !=
'#' ) {
312 r += str.substr(prev);
317 inline void StringSplit(const ::std::string& str,
char delimiter, ::std::vector< ::std::string >& dst)
319 ::std::string::size_type prev = 0;
320 ::std::string::size_type pos = 0;
321 ::std::vector< ::std::string > parsed;
322 while(
static_cast<void>(pos = str.find(delimiter, prev)), pos != ::std::string::npos)
324 parsed.push_back(str.substr(prev, pos - prev));
328 parsed.push_back(str.substr(prev));
333 inline ::std::string ToOctString(T value)
335 const size_t kB =
sizeof(T) * 8;
336 const size_t kN = (kB + 2) / 3;
337 const size_t kD = kB - (kN - 1) * 3;
338 const size_t kMask = (1u << kD) - 1u;
339 const T head = (value >> ((kN - 1) * 3)) & kMask;
340 char buf[kN + 1] = {
static_cast<char>(
'0' + (head & 0x7)), 0 };
341 for(
size_t i = 1; i < kN; ++i)
343 const T n = (value >> ((kN - i - 1) * 3));
344 buf[i] =
static_cast<char>(
'0' + (n & 0x7));
352 return static_cast<char>((n&0xF) >= 0xA ?
'A'+((n&0xF)-0xA) :
'0'+(n&0xF));
356 inline ::std::string ToHexString(T value)
358 const size_t kN =
sizeof(T)*2;
359 char buf[kN + 1] = {0};
360 for(
size_t i=0; i < kN; ++i )
362 buf[i] = ToHex(
static_cast<unsigned int>((value>>((kN-i-1)*4))));
369 inline ::std::string ToHexString(
const T* str,
int length)
372 for(
int i=0; (length < 0 || i < length) && *str != 0; ++str, ++i)
374 r += ToHexString(*str);
379 inline ::std::string FormatIntWidthN(
int value,
int digit)
381 char buf[128] = { 0 };
382 int idx = IUTEST_PP_COUNTOF(buf) - 2;
384 for(
int i=0; i < digit; ++i, --idx )
386 buf[idx] =
static_cast<char>(::std::abs(x%10) +
'0');
391 buf[idx] =
static_cast<char>(::std::abs(x%10) +
'0');
398 return buf + idx + 1;
401 inline ::std::string FormatIntWidth2(
int value)
403 return FormatIntWidthN(value, 2);
406 #if IUTEST_HAS_STD_TO_CHARS
409 ::std::string iu_to_string(
const T& value)
411 const size_t kN = 128;
412 char buf[kN] = { 0 };
413 const ::std::to_chars_result r = ::std::to_chars(buf, buf + kN, value);
420 #define IIUT_DECL_TOSTRING(fmt_, type_) \
421 inline ::std::string iu_to_string(type_ value) {\
422 char buf[128] = { 0 }; \
423 iu_snprintf(buf, sizeof(buf), fmt_, value); \
427 IIUT_DECL_TOSTRING(
"%d",
int)
428 IIUT_DECL_TOSTRING(
"%u",
unsigned int)
429 IIUT_DECL_TOSTRING(
"%ld",
long)
430 IIUT_DECL_TOSTRING(
"%lu",
unsigned long)
431 IIUT_DECL_TOSTRING(
"%lld",
long long)
432 IIUT_DECL_TOSTRING(
"%llu",
unsigned long long)
434 #undef IIUT_DECL_TOSTRING
438 inline ::std::string FormatSizeByte(
UInt64 value)
440 const char* suffixes[] = {
447 const size_t suffixes_length = IUTEST_PP_COUNTOF(suffixes);
449 double view_value =
static_cast<double>(value);
450 while(view_value >= 1024 && index + 1 < suffixes_length)
456 const UInt32 n =
static_cast<UInt32>(::std::floor(view_value));
457 const UInt32 f =
static_cast<UInt32>(view_value * 10.0 - n * 10.0);
458 const char* suffix = suffixes[index];
459 if(view_value - n <= 0.0)
461 return iu_to_string(n) + suffix;
465 return iu_to_string(n) +
"." + iu_to_string(f) + suffix;
469 inline ::std::string ShowStringQuoted(
const char* str)
471 ::std::string s =
"\""; s += str; s +=
"\"";
474 inline ::std::string ShowStringQuoted(const ::std::string& str)
476 ::std::string s =
"\""; s += str; s +=
"\"";
480 inline ::std::string StringFormat(
const char* format, ...)
483 va_start(va, format);
484 ::std::string str = StringFormat(format, va);
488 inline ::std::string StringFormat(
const char* format, va_list va)
490 size_t n = strlen(format) * 2 + 1;
494 const int ret = iu_vsnprintf(NULL, 0u, format, va2);
498 n =
static_cast<size_t>(ret + 1);
503 char* dst =
new char[n];
506 const int written = iu_vsnprintf(dst, n, format, va2);
510 #if defined(EOVERFLOW)
511 if( errno == EOVERFLOW )
523 else if(
static_cast<size_t>(written) < n )
525 ::std::string s = ::std::string(dst,
static_cast<size_t>(written));
535 IUTEST_PRAGMA_CONSTEXPR_CALLED_AT_RUNTIME_WARN_DISABLE_END()
#define IUTEST_CXX_CONSTEXPR
constexpr
Definition: iutest_compiler.hpp:372
iutest root namespace
Definition: iutest_charcode.hpp:33
detail::type_fit_t< 4 >::UInt UInt32
32 bit 符号なし整数型
Definition: iutest_defs.hpp:503
detail::type_fit_t< 8 >::UInt UInt64
64 bit 符号なし整数型
Definition: iutest_defs.hpp:505