@ -38,46 +38,18 @@
# ifndef headerfile_picotools_convert_text
# define headerfile_picotools_convert_text
# include "text_private.h"
# include <string>
namespace PT
{
bool IsWhite ( wchar_t c , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
bool IsDigit ( wchar_t c , int base = 10 , int * digit = 0 ) ;
char ToLower ( char c ) ;
wchar_t ToLower ( wchar_t c ) ;
bool is_white ( wchar_t c , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
bool is_digit ( wchar_t c , int base = 10 , int * digit = 0 ) ;
char ToUpper ( char c ) ;
wchar_t ToUpper ( wchar_t c ) ;
const char * skip_white ( const char * str , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
const wchar_t * skip_white ( const wchar_t * str , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
// rename to something like to_lower_emplace
// and add to_lower which returns string
void ToLower ( std : : string & str ) ;
void ToLower ( std : : wstring & str ) ;
void ToUpper ( std : : string & str ) ;
void ToUpper ( std : : wstring & str ) ;
////////////////////////////
template < class CharType >
CharType * SkipWhite ( CharType * str , bool check_additional_chars = true , bool treat_new_line_as_white = true )
{
while ( IsWhite ( static_cast < wchar_t > ( * str ) , check_additional_chars , treat_new_line_as_white ) )
{
str + = 1 ;
}
return str ;
}
/*
@ -88,205 +60,87 @@ CharType * SkipWhite(CharType * str, bool check_additional_chars = true, bool tr
* or to the last + one if there is no any white characters
*
*/
template < class CharType >
CharType * SkipWhiteFromBack ( CharType * str_begin , CharType * str_end , bool check_additional_chars = true , bool treat_new_line_as_white = true )
{
while ( str_end > str_begin & & IsWhite ( static_cast < wchar_t > ( * ( str_end - 1 ) ) , check_additional_chars , treat_new_line_as_white ) )
{
str_end - = 1 ;
}
return str_end ;
}
template < class CharType >
CharType * SkipWhiteFromBack ( CharType * str , bool check_additional_chars = true , bool treat_new_line_as_white = true )
{
CharType * str_begin = str ;
while ( * str ! = 0 )
{
str + = 1 ;
}
return SkipWhiteFromBack ( str_begin , str , check_additional_chars , treat_new_line_as_white ) ;
}
template < class StringType1 , class StringType2 >
int CompareNoCase ( const StringType1 * str1 , const StringType2 * str2 )
{
while ( * str1 & & * str2 & & ToLower ( * str1 ) = = ToLower ( * str2 ) )
{
+ + str1 ;
+ + str2 ;
}
if ( * str1 = = 0 & & * str2 = = 0 )
return 0 ;
int c1 ;
int c2 ;
if constexpr ( sizeof ( StringType1 ) = = 1 & & sizeof ( StringType2 ) = = 1 )
{
c1 = ToLower ( ( wchar_t ) ( unsigned char ) ( * str1 ) ) ;
c2 = ToLower ( ( wchar_t ) ( unsigned char ) ( * str2 ) ) ;
}
else
{
c1 = ToLower ( * str1 ) ;
c2 = ToLower ( * str2 ) ;
}
return c1 - c2 ;
}
template < class StringType1 , class StringType2 >
int CompareNoCase ( const StringType1 & str1 , const StringType2 & str2 )
{
return CompareNoCase ( str1 . c_str ( ) , str2 . c_str ( ) ) ;
}
template < class StringType1 , class StringType2 >
int CompareNoCasep ( const StringType1 * str1 , const StringType2 * str2 )
{
return CompareNoCase ( str1 , str2 ) ;
}
const char * skip_white_from_back ( const char * str_begin , const char * str_end , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
const wchar_t * skip_white_from_back ( const wchar_t * str_begin , const wchar_t * str_end , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
const char * skip_white_from_back ( const char * str , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
const wchar_t * skip_white_from_back ( const wchar_t * str , bool check_additional_chars = true , bool treat_new_line_as_white = true ) ;
template < class StringType1 , class StringType2 >
int CompareNoCase ( const StringType1 * str1_begin , const StringType1 * str1_end , const StringType2 * str2 )
{
while ( str1_begin < str1_end & & * str2 & & ToLower ( * str1_begin ) = = ToLower ( * str2 ) )
{
+ + str1_begin ;
+ + str2 ;
}
if ( str1_begin = = str1_end & & * str2 = = 0 )
return 0 ;
int c1 ;
int c2 ;
if constexpr ( sizeof ( StringType1 ) = = 1 & & sizeof ( StringType2 ) = = 1 )
{
c1 = str1_begin < str1_end ? ToLower ( ( wchar_t ) ( unsigned char ) ( * str1_begin ) ) : 0 ;
c2 = ToLower ( ( wchar_t ) ( unsigned char ) ( * str2 ) ) ;
}
else
{
c1 = str1_begin < str1_end ? ToLower ( * str1_begin ) : 0 ;
c2 = ToLower ( * str2 ) ;
}
return c1 - c2 ;
}
char to_lower ( char c ) ;
wchar_t to_lower ( wchar_t c ) ;
char to_upper ( char c ) ;
wchar_t to_upper ( wchar_t c ) ;
void to_lower_emplace ( std : : string & str ) ;
void to_lower_emplace ( std : : wstring & str ) ;
void to_upper_emplace ( std : : string & str ) ;
void to_upper_emplace ( std : : wstring & str ) ;
template < class StringType1 , class StringType2 >
bool EqualNoCase ( const StringType1 * str1 , const StringType2 * str2 )
{
return CompareNoCase ( str1 , str2 ) = = 0 ;
}
template < class StringType1 , class StringType2 >
bool EqualNoCase ( const StringType1 & str1 , const StringType2 & str2 )
{
return EqualNoCase ( str1 . c_str ( ) , str2 . c_str ( ) ) ;
}
std : : string to_lower ( const std : : string & str ) ;
std : : wstring to_lower ( const std : : wstring & str ) ;
template < class StringType1 , class StringType2 >
bool EqualNoCasep ( const StringType1 * str1 , const StringType2 * str2 )
{
return EqualNoCase ( str1 , str2 ) ;
}
template < class StringType1 , class StringType2 >
bool EqualNoCase ( const StringType1 * str1_begin , const StringType1 * str1_end , const StringType2 * str2 )
{
return CompareNoCase ( str1_begin , str1_end , str2 ) = = 0 ;
}
std : : string to_upper ( const std : : string & str ) ;
std : : wstring to_upper ( const std : : wstring & str ) ;
int compare ( const char * str1 , const char * str2 ) ;
int compare ( const wchar_t * str1 , const wchar_t * str2 ) ;
int compare ( const std : : string & str1 , const std : : string & str2 ) ;
int compare ( const std : : wstring & str1 , const std : : wstring & str2 ) ;
int compare ( const char * str1_begin , const char * str1_end , const char * str2 ) ;
int compare ( const wchar_t * str1_begin , const wchar_t * str1_end , const wchar_t * str2 ) ;
/*
* compare no case
*/
int compare_nc ( const char * str1 , const char * str2 ) ;
int compare_nc ( const wchar_t * str1 , const wchar_t * str2 ) ;
template < class StringType1 , class StringType2 >
bool IsSubStringp ( const StringType1 * short_str , const StringType2 * long_str )
{
while ( * short_str & & * long_str & & wchar_t ( * short_str ) = = wchar_t ( * long_str ) )
{
+ + short_str ;
+ + long_str ;
}
if ( * short_str = = 0 )
return true ;
return false ;
}
int compare_nc ( const std : : string & str1 , const std : : string & str2 ) ;
int compare_nc ( const std : : wstring & str1 , const std : : wstring & str2 ) ;
int compare_nc ( const char * str1_begin , const char * str1_end , const char * str2 ) ;
int compare_nc ( const wchar_t * str1_begin , const wchar_t * str1_end , const wchar_t * str2 ) ;
template < class StringType1 , class StringType2 >
bool IsSubString ( const StringType1 * short_str , const StringType2 * long_str )
{
return IsSubStringp ( short_str , long_str ) ;
}
template < class StringType1 , class StringType2 >
bool IsSubString ( const StringType1 & short_str , const StringType2 & long_str )
{
return IsSubStringp ( short_str . c_str ( ) , long_str . c_str ( ) ) ;
}
bool is_equal ( const char * str1 , const char * str2 ) ;
bool is_equal ( const wchar_t * str1 , const wchar_t * str2 ) ;
bool is_equal ( const std : : string & str1 , const std : : string & str2 ) ;
bool is_equal ( const std : : wstring & str1 , const std : : wstring & str2 ) ;
template < class StringType1 , class StringType2 >
bool IsSubStringNoCasep ( const StringType1 * short_str , const StringType2 * long_str )
{
while ( * short_str & & * long_str & & ToLower ( * short_str ) = = ToLower ( * long_str ) )
{
+ + short_str ;
+ + long_str ;
}
bool is_equal ( const char * str1_begin , const char * str1_end , const char * str2 ) ;
bool is_equal ( const wchar_t * str1_begin , const wchar_t * str1_end , const wchar_t * str2 ) ;
if ( * short_str = = 0 )
return true ;
bool is_equal_nc ( const char * str1 , const char * str2 ) ;
bool is_equal_nc ( const wchar_t * str1 , const wchar_t * str2 ) ;
return false ;
}
bool is_equal_nc ( const std : : string & str1 , const std : : string & str2 ) ;
bool is_equal_nc ( const std : : wstring & str1 , const std : : wstring & str2 ) ;
bool is_equal_nc ( const char * str1_begin , const char * str1_end , const char * str2 ) ;
bool is_equal_nc ( const wchar_t * str1_begin , const wchar_t * str1_end , const wchar_t * str2 ) ;
template < class StringType1 , class StringType2 >
bool IsSubStringNoCase ( const StringType1 * short_str , const StringType2 * long_str )
{
return IsSubStringNoCasep ( short_str , long_str ) ;
}
bool is_substr ( const char * short_str , const char * long_str ) ;
bool is_substr ( const wchar_t * short_str , const wchar_t * long_str ) ;
template < class StringType1 , class StringType2 >
bool IsSubStringNoCase ( const StringType1 & short_str , const StringType2 & long_str )
{
return IsSubStringNoCasep ( short_str . c_str ( ) , long_str . c_str ( ) ) ;
}
bool is_substr ( const std : : string & short_str , const std : : string & long_str ) ;
bool is_substr ( const std : : wstring & short_str , const std : : wstring & long_str ) ;
bool is_substr_nc ( const char * short_str , const char * long_str ) ;
bool is_substr_nc ( const wchar_t * short_str , const wchar_t * long_str ) ;
bool is_substr_nc ( const std : : string & short_str , const std : : string & long_str ) ;
bool is_substr_nc ( const std : : wstring & short_str , const std : : wstring & long_str ) ;