updated: to the new Ezc API
removed statements: [if-index ...] [is ...] [is-no ...] added: generic ezc functions: and, any (the same as and), or, one (the same as or), not, cmp, trim to_lower, to_upper, index changed: in misc: added treat_new_line_as_white flag to IsWhite() SkipWhite() and TrimWhite() TrimWhite(), TrimFirst(), TrimLast(), Trim() are using only wide characters now (they were templates before) added: IsInt(), IsSize(), IsFloat() changed: version to 0.6.4 git-svn-id: svn://ttmath.org/publicrep/winix/trunk@989 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
225
core/misc.cpp
225
core/misc.cpp
@@ -51,7 +51,7 @@ namespace Winix
|
||||
namespace misc_private
|
||||
{
|
||||
// white_chars table should be sorted
|
||||
// we do not treat a new line character (10) as a white character
|
||||
// we do not treat a new line character (10) as a white character here
|
||||
static const wchar_t white_chars[] = { 0x0009, 0x000B, 0x000C, 0x000D, 0x0020, 0x0085, 0x00A0,
|
||||
0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004,
|
||||
0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x2028,
|
||||
@@ -61,7 +61,16 @@ namespace misc_private
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* IMPROVE ME
|
||||
* we ca add our own functions with treat_new_line_as_white flag
|
||||
* and with a pointer pointing after the number
|
||||
*
|
||||
* Toi(const wchar_t * str, const wchar_t ** str_after, bool treat_new_line_as_white);
|
||||
* Toi(const wchar_t * str, bool treat_new_line_as_white);
|
||||
* Toi(const std::wstring & str, bool treat_new_line_as_white);
|
||||
*
|
||||
*/
|
||||
int Toi(const std::string & str, int base)
|
||||
{
|
||||
return Toi(str.c_str(), base);
|
||||
@@ -471,9 +480,9 @@ PT::WTextStream IPToStr(int ip)
|
||||
|
||||
|
||||
/*
|
||||
we do not treat a new line character (10) as a white character
|
||||
by default we do not treat a new line character (10) as a white character
|
||||
*/
|
||||
bool IsWhite(wchar_t c)
|
||||
bool IsWhite(wchar_t c, bool treat_new_line_as_white)
|
||||
{
|
||||
using misc_private::white_chars;
|
||||
|
||||
@@ -481,6 +490,9 @@ using misc_private::white_chars;
|
||||
size_t o1 = 0;
|
||||
size_t o2 = len - 1;
|
||||
|
||||
if( c == 10 )
|
||||
return treat_new_line_as_white ? true : false;
|
||||
|
||||
if( c < white_chars[o1] || c > white_chars[o2] )
|
||||
return false;
|
||||
|
||||
@@ -513,13 +525,7 @@ bool IsWhite(const wchar_t * str, bool treat_new_line_as_white)
|
||||
{
|
||||
for( ; *str != 0 ; ++str )
|
||||
{
|
||||
if( *str == '\n' )
|
||||
{
|
||||
if( !treat_new_line_as_white )
|
||||
return false;
|
||||
}
|
||||
else
|
||||
if( !IsWhite(*str) )
|
||||
if( !IsWhite(*str, treat_new_line_as_white) )
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -538,6 +544,95 @@ bool IsWhite(const std::wstring & str, bool treat_new_line_as_white)
|
||||
|
||||
|
||||
|
||||
void TrimWhite(std::wstring & s, bool trim_new_line_too)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if( s.empty() )
|
||||
return;
|
||||
|
||||
// looking for white characters at the end
|
||||
for(i=s.size()-1 ; i>0 && IsWhite(s[i], trim_new_line_too) ; --i);
|
||||
|
||||
if( i==0 && IsWhite(s[i], trim_new_line_too) )
|
||||
{
|
||||
// the whole string has white characters
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
// deleting white characters at the end
|
||||
if( i != s.size() - 1 )
|
||||
s.erase(i+1, std::wstring::npos);
|
||||
|
||||
// looking for white characters at the beginning
|
||||
for(i=0 ; i<s.size() && IsWhite(s[i], trim_new_line_too) ; ++i);
|
||||
|
||||
// deleting white characters at the beginning
|
||||
if( i != 0 )
|
||||
s.erase(0, i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const wchar_t * SkipWhite(const wchar_t * s, bool treat_new_line_as_white)
|
||||
{
|
||||
while( IsWhite(*s, treat_new_line_as_white) )
|
||||
++s;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TrimFirst(std::wstring & s, wchar_t c)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if( s.empty() )
|
||||
return;
|
||||
|
||||
// looking for the 'c' characters at the beginning
|
||||
for(i=0 ; i<s.size() && s[i]==c ; ++i);
|
||||
|
||||
// deleting the 'c' characters at the beginning
|
||||
if( i != 0 )
|
||||
s.erase(0, i);
|
||||
}
|
||||
|
||||
|
||||
void TrimLast(std::wstring & s, wchar_t c)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if( s.empty() )
|
||||
return;
|
||||
|
||||
// looking for the 'c' characters at the end
|
||||
for(i=s.size()-1 ; i>0 && s[i]==c ; --i);
|
||||
|
||||
if( i==0 && s[i]==c )
|
||||
{
|
||||
// the whole string has the 'c' characters
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
// deleting 'c' characters at the end
|
||||
if( i != s.size() - 1 )
|
||||
s.erase(i+1, std::wstring::npos);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Trim(std::wstring & s, wchar_t c)
|
||||
{
|
||||
if( s.empty() )
|
||||
return;
|
||||
|
||||
TrimLast(s, c);
|
||||
TrimFirst(s, c);
|
||||
}
|
||||
|
||||
|
||||
bool IsLastSlash(const std::wstring & path)
|
||||
@@ -549,6 +644,97 @@ return path[path.size()-1] == '/';
|
||||
}
|
||||
|
||||
|
||||
bool IsInt(const wchar_t * str, bool treat_new_line_as_white, bool allow_negative_value)
|
||||
{
|
||||
size_t digit = 0;
|
||||
|
||||
str = SkipWhite(str, treat_new_line_as_white);
|
||||
|
||||
if( allow_negative_value && *str == '-' )
|
||||
str += 1;
|
||||
|
||||
while( *str>='0' && *str<='9' )
|
||||
{
|
||||
digit += 1;
|
||||
str += 1;
|
||||
}
|
||||
|
||||
if( digit == 0 )
|
||||
return false;
|
||||
|
||||
str = SkipWhite(str, treat_new_line_as_white);
|
||||
|
||||
if( *str != 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsInt(const wchar_t * str, bool treat_new_line_as_white)
|
||||
{
|
||||
return IsInt(str, treat_new_line_as_white, true);
|
||||
}
|
||||
|
||||
|
||||
bool IsInt(const std::wstring & str, bool treat_new_line_as_white)
|
||||
{
|
||||
return IsInt(str.c_str(), treat_new_line_as_white);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool IsSize(const wchar_t * str, bool treat_new_line_as_white)
|
||||
{
|
||||
return IsInt(str, treat_new_line_as_white, false);
|
||||
}
|
||||
|
||||
|
||||
bool IsSize(const std::wstring & str, bool treat_new_line_as_white)
|
||||
{
|
||||
return IsSize(str.c_str(), treat_new_line_as_white);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool IsFloat(const wchar_t * str, bool treat_new_line_as_white)
|
||||
{
|
||||
size_t digit = 0;
|
||||
size_t comma = 0;
|
||||
|
||||
str = SkipWhite(str, treat_new_line_as_white);
|
||||
|
||||
if( *str == '-' )
|
||||
str += 1;
|
||||
|
||||
while( (*str == ',' || *str == '.') || (*str>='0' && *str<='9') )
|
||||
{
|
||||
if( *str == ',' || *str == '.' )
|
||||
comma += 1;
|
||||
else
|
||||
digit += 1;
|
||||
|
||||
str += 1;
|
||||
}
|
||||
|
||||
if( comma > 1 || digit == 0 )
|
||||
return false;
|
||||
|
||||
str = SkipWhite(str, treat_new_line_as_white);
|
||||
|
||||
if( *str != 0 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool IsFloat(const std::wstring & str, bool treat_new_line_as_white)
|
||||
{
|
||||
return IsFloat(str.c_str(), treat_new_line_as_white);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Overwrite(std::string & str)
|
||||
{
|
||||
@@ -564,23 +750,6 @@ void Overwrite(std::wstring & str)
|
||||
|
||||
|
||||
|
||||
const char * SkipWhite(const char * s)
|
||||
{
|
||||
while( IsWhite(*s) )
|
||||
++s;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
const wchar_t * SkipWhite(const wchar_t * s)
|
||||
{
|
||||
while( IsWhite(*s) )
|
||||
++s;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
wchar_t ToSmall(wchar_t c)
|
||||
{
|
||||
|
Reference in New Issue
Block a user