[DEV] rewirk Regular expression to be Unicode complient and add backtrace in debug

This commit is contained in:
Edouard DUPIN 2013-05-16 21:24:27 +02:00
parent 5f8b094486
commit b75f2ea698
9 changed files with 751 additions and 1175 deletions

View File

@ -34,7 +34,10 @@ void GeneralDebugSetLevel(etk::logLevel_te ccc);
}while(0)
#define ETK_CRITICAL(libName, data) ETK_DBG_COMMON(libName, etk::LOG_LEVEL_CRITICAL, data)
#define ETK_CRITICAL(libName, data) do { \
ETK_DBG_COMMON(libName, etk::LOG_LEVEL_CRITICAL, data); \
etk::DisplayBacktrace(); \
}while(0)
#if DEBUG_LEVEL > 0
# define ETK_WARNING(libName, data) ETK_DBG_COMMON(libName, etk::LOG_LEVEL_WARNING, data)

View File

@ -64,21 +64,11 @@ const etk::convertionTable_ts etk::constConvertionTable[] = {
};
const int32_t etk::constConvertionTableSize = sizeof(etk::constConvertionTable) / sizeof(etk::convertionTable_ts) ;
void etk::DisplayData(etk::Vector<char> &data)
void etk::DisplayElem(const etk::Vector<etk::UniChar>& _data, int32_t _start, int32_t _stop)
{
int32_t i;
for (i=0; i<(int32_t)data.Size() ; i++) {
etk::cout<< (char)(data[i]&0x00FF );
}
}
void etk::DisplayElem(etk::Vector<int16_t> &data, int32_t start, int32_t stop)
{
int32_t i;
etk::cout<< ETK_BASH_COLOR_NORMAL;
for (i=start; i<(int32_t)data.Size() && i<stop ; i++) {
switch(data[i])
for (int32_t iii=_start; iii<_data.Size() && iii<_stop ; iii++) {
switch(_data[iii].Get())
{
case REGEXP_OPCODE_PTHESE_IN: etk::cout<<ETK_BASH_COLOR_RED << (char*)"(" << ETK_BASH_COLOR_NORMAL; break;
case REGEXP_OPCODE_PTHESE_OUT: etk::cout<<ETK_BASH_COLOR_RED << (char*)")" << ETK_BASH_COLOR_NORMAL; break;
@ -105,13 +95,13 @@ void etk::DisplayElem(etk::Vector<int16_t> &data, int32_t start, int32_t stop)
case REGEXP_OPCODE_WORD_NOT: etk::cout<<ETK_BASH_COLOR_MAGENTA << (char*)"\\W" << ETK_BASH_COLOR_NORMAL; break;
case '\n': etk::cout<<ETK_BASH_COLOR_MAGENTA << (char*)"\\n" << ETK_BASH_COLOR_NORMAL; break;
case '\t': etk::cout<<ETK_BASH_COLOR_MAGENTA << (char*)"\\t" << ETK_BASH_COLOR_NORMAL; break;
default: etk::cout<< (char)(data[i]&0x00FF ); break;
default: etk::cout<< (char)(_data[iii].Get()&0x00FF ); break;
}
}
}
char * etk::levelSpace(int32_t level)
char * etk::levelSpace(int32_t _level)
{
switch(level)
switch(_level)
{
case 0: return (char*)"";
case 1: return (char*)" ";
@ -135,79 +125,74 @@ char * etk::levelSpace(int32_t level)
}
int32_t etk::GetLenOfPTheseElem(etk::Vector<int16_t> &data, int32_t startPos)
int32_t etk::GetLenOfPTheseElem(const etk::Vector<etk::UniChar>& _data, int32_t _startPos)
{
if (startPos>=data.Size()){
if (_startPos>=_data.Size()){
return 0;
}
int32_t pos = startPos;
int32_t pos = _startPos;
int32_t nbOpen = 0;
// special case of the (...) or | ==> we search '|' or ')'
if( REGEXP_OPCODE_PTHESE_OUT == data[pos]
|| REGEXP_OPCODE_PIPE == data[pos]) {
if( _data[pos] == REGEXP_OPCODE_PTHESE_OUT
|| _data[pos] == REGEXP_OPCODE_PIPE) {
return 0;
}
// find size ...
while (pos < (int32_t)data.Size() ) {
if(REGEXP_OPCODE_PTHESE_IN == data[pos]) {
while (pos < (int32_t)_data.Size() ) {
if(_data[pos] == REGEXP_OPCODE_PTHESE_IN) {
// find a sub section :
nbOpen++;
} else if(0 < nbOpen) {
if (REGEXP_OPCODE_PTHESE_OUT == data[pos])
{
if (_data[pos] == REGEXP_OPCODE_PTHESE_OUT) {
nbOpen--;
if (0 > nbOpen) {
TK_ERROR("Error in the (...) find element at "<< pos);
return -1;
}
}
} else if( REGEXP_OPCODE_PTHESE_OUT == data[pos]
|| REGEXP_OPCODE_PIPE == data[pos])
{
} else if( _data[pos] == REGEXP_OPCODE_PTHESE_OUT
|| _data[pos] == REGEXP_OPCODE_PIPE) {
// Find the end of the (...)
// just return the size inside
int32_t sizeInside = pos - startPos;
int32_t sizeInside = pos - _startPos;
if (0 >= sizeInside) {
TK_ERROR("Error in the (...) no data at "<< pos-1);
return -1;
} else {
return sizeInside;
return sizeInside;
}
}
pos++;
}
return pos - startPos;
return pos - _startPos;
}
int32_t etk::GetLenOfPThese(etk::Vector<int16_t> &data, int32_t startPos)
int32_t etk::GetLenOfPThese(const etk::Vector<etk::UniChar>& _data, int32_t _startPos)
{
int32_t pos = startPos;
int32_t pos = _startPos;
int32_t nbOpen = 0;
// special case of the (...) or | ==> we search '|' or ')'
if( REGEXP_OPCODE_PTHESE_OUT == data[pos]) {
if(_data[pos]==REGEXP_OPCODE_PTHESE_OUT) {
return 0;
} else if( REGEXP_OPCODE_PTHESE_IN == data[pos])
{
} else if(_data[pos]==REGEXP_OPCODE_PTHESE_IN) {
pos++;
// find size ...
while (pos < (int32_t)data.Size() ) {
if(REGEXP_OPCODE_PTHESE_IN == data[pos]) {
while (pos < _data.Size() ) {
if(_data[pos]==REGEXP_OPCODE_PTHESE_IN) {
// find a sub section :
nbOpen++;
} else if(0 < nbOpen) {
if (REGEXP_OPCODE_PTHESE_OUT == data[pos])
{
if (_data[pos]==REGEXP_OPCODE_PTHESE_OUT) {
nbOpen--;
if (0 > nbOpen) {
TK_ERROR("Error in the (...) find element at "<< pos);
return -1;
}
}
} else if( REGEXP_OPCODE_PTHESE_OUT == data[pos])
{
} else if(_data[pos]==REGEXP_OPCODE_PTHESE_OUT) {
// Find the end of the (...)
// just return the size inside
int32_t sizeInside = pos - startPos-1;
int32_t sizeInside = pos - _startPos-1;
if (0 >= sizeInside) {
TK_ERROR("Error in the (...) no data at "<< pos-1);
return -1;
@ -224,31 +209,29 @@ int32_t etk::GetLenOfPThese(etk::Vector<int16_t> &data, int32_t startPos)
}
int32_t etk::GetLenOfBracket(etk::Vector<int16_t> &data, int32_t startPos)
int32_t etk::GetLenOfBracket(const etk::Vector<etk::UniChar>& _data, int32_t _startPos)
{
int32_t pos = startPos;
int32_t pos = _startPos;
// special case of the (...) or | ==> we search '|' or ')'
if( REGEXP_OPCODE_BRACKET_OUT == data[pos]) {
if(_data[pos]==REGEXP_OPCODE_BRACKET_OUT) {
return 0;
} else if( REGEXP_OPCODE_BRACKET_IN == data[pos]) {
} else if(_data[pos] == REGEXP_OPCODE_BRACKET_IN) {
pos++;
// find size ...
while (pos < (int32_t)data.Size() ) {
if(REGEXP_OPCODE_BRACKET_OUT == data[pos]) {
while (pos < _data.Size() ) {
if(_data[pos]==REGEXP_OPCODE_BRACKET_OUT) {
// Find the end of the [...]
// just return the size inside
int32_t sizeInside = pos - startPos -1 ;
int32_t sizeInside = pos - _startPos -1 ;
if (0 >= sizeInside) {
TK_ERROR("Error in the [...] no data at "<< pos-1);
return sizeInside;
} else {
return sizeInside;
}
} else if( REGEXP_OPCODE_TO != data[pos]
&& ( 0 > data[pos]
|| 0xFF < data[pos]) )
{
TK_ERROR("Error in the [...] not permited element at "<< pos << " '" << (char)data[pos] << "'");
} else if( _data[pos] != REGEXP_OPCODE_TO
&& _data[pos] > 0xFF ) {
TK_ERROR("Error in the [...] not permited element at "<< pos << " '" << (char)_data[pos].Get() << "'");
return false;
}
pos++;
@ -260,31 +243,30 @@ int32_t etk::GetLenOfBracket(etk::Vector<int16_t> &data, int32_t startPos)
}
int32_t etk::GetLenOfBrace(etk::Vector<int16_t> &data, int32_t startPos)
int32_t etk::GetLenOfBrace(const etk::Vector<etk::UniChar>& _data, int32_t _startPos)
{
int32_t pos = startPos;
int32_t pos = _startPos;
// special case of the (...) or | ==> we search '|' or ')'
if( REGEXP_OPCODE_BRACE_OUT == data[pos]) {
if(_data[pos]==REGEXP_OPCODE_BRACE_OUT) {
return 0;
} else if( REGEXP_OPCODE_BRACE_IN == data[pos]) {
} else if(_data[pos]==REGEXP_OPCODE_BRACE_IN) {
pos++;
// find size ...
while (pos < (int32_t)data.Size() ) {
if(REGEXP_OPCODE_BRACE_OUT == data[pos]) {
while (pos < _data.Size() ) {
if(_data[pos]==REGEXP_OPCODE_BRACE_OUT) {
// Find the end of the [...]
// just return the size inside
int32_t sizeInside = pos - startPos -1 ;
int32_t sizeInside = pos - _startPos -1 ;
if (0 >= sizeInside) {
TK_ERROR("Error in the {...} no data at "<< pos-1);
return sizeInside;
} else {
return sizeInside;
}
} else if( ',' != data[pos]
&& ( '0' > data[pos]
|| '9' < data[pos]) )
{
TK_ERROR("Error in the {...} not permited element at "<< pos << " '" << (char)data[pos] << "'");
} else if( _data[pos] != ','
&& ( _data[pos] < '0'
|| _data[pos] > '9') ) {
TK_ERROR("Error in the {...} not permited element at "<< pos << " '" << _data[pos].Get() << "'");
return false;
}
pos++;
@ -296,13 +278,13 @@ int32_t etk::GetLenOfBrace(etk::Vector<int16_t> &data, int32_t startPos)
}
int32_t etk::GetLenOfNormal(etk::Vector<int16_t> &data, int32_t startPos)
int32_t etk::GetLenOfNormal(const etk::Vector<etk::UniChar>& _data, int32_t _startPos)
{
int32_t pos = startPos;
int32_t pos = _startPos;
// find size ...
while (pos < (int32_t)data.Size() ) {
switch(data[pos])
while (pos < _data.Size() ) {
switch(_data[pos].Get())
{
case REGEXP_OPCODE_PTHESE_IN:
case REGEXP_OPCODE_PTHESE_OUT:
@ -328,7 +310,7 @@ int32_t etk::GetLenOfNormal(etk::Vector<int16_t> &data, int32_t startPos)
case REGEXP_OPCODE_WORD_NOT:
{
// just return the size inside
int32_t sizeInside = pos - startPos;
int32_t sizeInside = pos - _startPos;
if (0 >= sizeInside) {
TK_ERROR("Error in the normal data : no data ...");
}
@ -341,11 +323,11 @@ int32_t etk::GetLenOfNormal(etk::Vector<int16_t> &data, int32_t startPos)
}
pos++;
}
return pos - startPos ;
return pos - _startPos ;
}
bool etk::ParseBrace(etk::Vector<int16_t> &data, int32_t &min, int32_t &max)
bool etk::ParseBrace(const etk::Vector<etk::UniChar>& _data, int32_t& _min, int32_t& _max)
{
//TK_INFO("parse {...} in "; DisplayElem(data); );
int32_t k=0;
@ -353,36 +335,36 @@ bool etk::ParseBrace(etk::Vector<int16_t> &data, int32_t &min, int32_t &max)
int32_t firstElement = 0;
int32_t SecondElement = 0;
while(k<data.Size()) {
if (',' == (char)data[k]) {
while(k<_data.Size()) {
if (_data[k]==',') {
k++;
break;
} if ('}' == (char)data[k]) {
} if (_data[k]=='}') {
SecondElement = firstElement;
goto allIsSet;
} else if ('0' <= (char)data[k] && '9' >= (char)data[k]) {
} else if(true==_data[k].IsInteger()) {
firstElement *=10;
firstElement += (char)data[k] - '0';
firstElement += _data[k].ToInt32();
} else {
TK_ERROR("Can not parse this element " << (char)data[k] << " at pos " << k);
TK_ERROR("Can not parse this element " << (char)_data[k].Get() << " at pos " << k);
return false;
}
k++;
}
if (k==data.Size()) {
if (k==_data.Size()) {
SecondElement = firstElement;
}
while(k<data.Size()) {
if (',' == (char)data[k]) {
while(k<_data.Size()) {
if (_data[k]==',') {
TK_ERROR("Can not find a second , in {} at pos " << k);
return false;
} if ('}' == (char)data[k]) {
} if (_data[k]=='}') {
goto allIsSet;
} else if ('0' <= (char)data[k] && '9' >= (char)data[k]) {
} else if (true==_data[k].IsInteger()) {
SecondElement *=10;
SecondElement += (char)data[k] - '0';
SecondElement += _data[k].ToInt32();
} else {
TK_ERROR("Can not parse this element " << (char)data[k] << " at pos " << k);
TK_ERROR("Can not parse this element " << _data[k] << " at pos " << k);
return false;
}
k++;
@ -390,14 +372,14 @@ bool etk::ParseBrace(etk::Vector<int16_t> &data, int32_t &min, int32_t &max)
allIsSet:
if (SecondElement == 0 && firstElement != 0) {
min = 0;
max = firstElement;
_min = 0;
_max = firstElement;
} else {
min = firstElement;
max = SecondElement;
_min = firstElement;
_max = SecondElement;
}
if (min > max) {
TK_ERROR("Minimum=" << min << " can not be < maximum=" << max );
if (_min > _max) {
TK_ERROR("Minimum=" << _min << " can not be < maximum=" << _max );
return false;
}
return true;

File diff suppressed because it is too large Load Diff

View File

@ -8,18 +8,53 @@
#include <etk/types.h>
#include <etk/Stream.h>
#include <etk/DebugInternal.h>
#if defined(__TARGET_OS__Linux) && DEBUG_LEVEL > 2
#include <execinfo.h>
#include <cxxabi.h>
#include <dlfcn.h>
#define MAX_DEPTH (256)
void etk::DisplayBacktrace(void)
{
// retrieve call-stack
void * trace[MAX_DEPTH];
int stack_depth = backtrace(trace, MAX_DEPTH);
TK_ERROR("Back-trace : ");
for (int32_t i = 1; i < stack_depth; i++) {
Dl_info dlinfo;
if(!dladdr(trace[i], &dlinfo)) {
break;
}
const char * symname = dlinfo.dli_sname;
int status;
char * demangled = abi::__cxa_demangle(symname, NULL, 0, &status);
if(status == 0 && demangled) {
symname = demangled;
}
TK_WARNING(" " << dlinfo.dli_fname << ": ");
TK_ERROR(" " << symname);
if(NULL != demangled) {
free(demangled);
}
}
//assert(false);
}
#else
void etk::DisplayBacktrace(void)
{
}
#endif
etk::CCout etk::cout;
etk::CEndl etk::endl;
etk::CHex etk::hex;
etk::CStart etk::cstart;
#if defined(__TARGET_OS__Android)
# include <android/log.h>
# define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "EWOL", __VA_ARGS__))
# define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "EWOL", __VA_ARGS__))
# define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "EWOL", __VA_ARGS__))
#endif
etk::CCout& etk::operator <<(etk::CCout &os, const etk::logLevel_te obj)
@ -30,36 +65,54 @@ etk::CCout& etk::operator <<(etk::CCout &os, const etk::logLevel_te obj)
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_BOLD_RED;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_FATAL;
#endif
os << "[C]";
break;
case LOG_LEVEL_ERROR:
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_RED;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_ERROR;
#endif
os << "[E]";
break;
case LOG_LEVEL_WARNING:
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_MAGENTA;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_WARN;
#endif
os << "[W]";
break;
case LOG_LEVEL_INFO:
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_CYAN;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_INFO;
#endif
os << "[I]";
break;
case LOG_LEVEL_DEBUG:
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_YELLOW;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_DEBUG;
#endif
os << "[D]";
break;
case LOG_LEVEL_VERBOSE:
#if !defined(__TARGET_OS__Windows)
os << ETK_BASH_COLOR_WHITE;
#endif
#if defined(__TARGET_OS__Android)
m_levelAndroid = ANDROID_LOG_VERBOSE;
#endif
os << "[V]";
break;
default:
@ -73,7 +126,9 @@ etk::CCout& etk::operator <<(etk::CCout &os, const etk::logLevel_te obj)
etk::CCout::CCout()
{
hex=false;
#if defined(__TARGET_OS__Android)
m_levelAndroid = 0;
#endif
memset(m_tmpChar, 0, (MAX_LOG_SIZE+1)*sizeof(char));
};
@ -84,18 +139,10 @@ etk::CCout::~CCout()
};
etk::CCout& etk::CCout::operator << (CHex t)
{
hex = true;
return *this;
}
etk::CCout& etk::CCout::operator << (int t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%d", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -104,7 +151,6 @@ etk::CCout& etk::CCout::operator << (const etk::UniChar& t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%u", t.Get());
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -112,35 +158,22 @@ etk::CCout& etk::CCout::operator << (unsigned int t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%u", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
etk::CCout& etk::CCout::operator << (long t)
{
if (true == hex) {
snprintf(tmp, MAX_LOG_SIZE_TMP, "0x%08X", (unsigned int)t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
} else {
snprintf(tmp, MAX_LOG_SIZE_TMP, "%ld", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
}
snprintf(tmp, MAX_LOG_SIZE_TMP, "%ld", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
return *this;
}
etk::CCout& etk::CCout::operator << (long long t)
{
if (true == hex) {
snprintf(tmp, MAX_LOG_SIZE_TMP, "0x%08X%08X", (unsigned int)(t>>32), (unsigned int)(t));
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
} else {
snprintf(tmp, MAX_LOG_SIZE_TMP, "%lld", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
}
snprintf(tmp, MAX_LOG_SIZE_TMP, "%lld", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
return *this;
}
@ -149,7 +182,6 @@ etk::CCout& etk::CCout::operator << (double t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%f", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -158,7 +190,6 @@ etk::CCout& etk::CCout::operator << (float t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%f", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -167,7 +198,6 @@ etk::CCout& etk::CCout::operator << (char * t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%s", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -176,7 +206,6 @@ etk::CCout& etk::CCout::operator << (const char * t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%s", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -185,7 +214,6 @@ etk::CCout& etk::CCout::operator << (char t)
{
snprintf(tmp, MAX_LOG_SIZE_TMP, "%c", t);
strncat(m_tmpChar, tmp, MAX_LOG_SIZE);
hex = false;
return *this;
}
@ -214,7 +242,7 @@ etk::CCout& etk::CCout::operator << (etk::CEndl t)
strncat(m_tmpChar, "\n", MAX_LOG_SIZE);
m_tmpChar[MAX_LOG_SIZE] = '\0';
#if defined(__TARGET_OS__Android)
LOGI("%s", m_tmpChar);
__android_log_print(m_levelAndroid, "EWOL", "%s", m_tmpChar);
#else
printf("%s", m_tmpChar);
#endif

View File

@ -18,19 +18,19 @@ namespace etk
#define MAX_LOG_SIZE_TMP (512)
class CEndl{};
class CHex{};
class CStart{};
class CCout{
private:
bool hex;
char m_tmpChar[MAX_LOG_SIZE+1];
char tmp[MAX_LOG_SIZE_TMP];
#if defined(__TARGET_OS__Android)
int8_t m_levelAndroid; //!< specific level for Android
#endif
etk::Mutex m_mutex;
public:
CCout(void);
~CCout(void);
CCout& operator << (CHex t);
CCout& operator << (const etk::UniChar& t);;
CCout& operator << (int t);
CCout& operator << (unsigned int t);
@ -47,7 +47,6 @@ namespace etk
};
extern etk::CCout cout;
extern etk::CEndl endl;
extern etk::CHex hex;
extern etk::CStart cstart;
typedef enum {
@ -64,6 +63,8 @@ namespace etk
* @brief Debug operator To display the curent element in a Human redeable information
*/
etk::CCout& operator <<(etk::CCout &os, const etk::logLevel_te obj);
void DisplayBacktrace(void);
};
//regular colors

View File

@ -139,9 +139,14 @@ void etk::UString::Set(const int64_t& _inputData, etk::UString::printMode_te _mo
Set((uint64_t)_inputData, _mode, _preset);
return;
}
int64_t tmpData = _inputData * (int64_t)(-1);
uint64_t tmpData;
if (_inputData < 0) {
if (_mode != etk::UString::printModeString) {
tmpData = (uint64_t)((int64_t)_inputData * (int64_t)(-1));
} else {
tmpData = _inputData;
}
if (_inputData < 0) {
if (_mode == etk::UString::printModeString) {
m_data.PushBack('l');
m_data.PushBack('e');
m_data.PushBack('s');
@ -177,84 +182,49 @@ void etk::UString::Set(const uint64_t& _inputData, etk::UString::printMode_te _m
break;
}
}
bool startDisplay=false;
switch(_mode) {
case etk::UString::printModeBinary :
for(int32_t iii=63; iii>=0; iii--) {
if ((_inputData & (1<<iii)) != 0) {
m_data.PushBack('1');
startDisplay = true;
} else {
if (true == startDisplay) {
m_data.PushBack('0');
}
}
}
break;
case etk::UString::printModeOctal :
// special strt case ...
if ((_inputData & 0x80000000000000LL) != 0) {
m_data.PushBack('1');
startDisplay = true;
} else {
if (true == startDisplay) {
m_data.PushBack('0');
}
}
for(int32_t iii=59; iii>=0; iii-=3) {
uint64_t tmpVal = (_inputData & (((uint64_t)7)<<iii)) >> iii;
if (tmpVal != 0) {
startDisplay = true;
}
if (true == startDisplay) {
tmpVal += '0';
m_data.PushBack(tmpVal);
}
}
break;
case etk::UString::printModeDecimal :
{
uint64_t tmpVal = _inputData;
etk::UString tmpString;
while (tmpVal>0) {
int32_t val = tmpVal % 10;
tmpString.Add(0,(val+'0'));
tmpVal /= 10;
}
if (tmpString.Size() == 0) {
m_data.PushBack('0');
} else {
*this += tmpString;
}
}
break;
case etk::UString::printModeHexadecimal :
for(int32_t iii=59; iii>=0; iii-=4) {
uint64_t tmpVal = (_inputData & (((uint64_t)0xF)<<iii)) >> iii;
if (tmpVal != 0) {
startDisplay = true;
}
if (true == startDisplay) {
if (tmpVal < 10) {
tmpVal += '0';
} else {
tmpVal += 'A'-10;
}
m_data.PushBack(tmpVal);
}
}
break;
default:
case etk::UString::printModeString :
m_data.PushBack('T');
m_data.PushBack('O');
m_data.PushBack('D');
m_data.PushBack('O');
m_data.PushBack('.');
m_data.PushBack('.');
m_data.PushBack('.');
break;
if (_mode == etk::UString::printModeString) {
m_data.PushBack('T');
m_data.PushBack('O');
m_data.PushBack('D');
m_data.PushBack('O');
m_data.PushBack('.');
m_data.PushBack('.');
m_data.PushBack('.');
} else {
int32_t base=8;
//char ploppp[256]="";
switch(_mode) {
case etk::UString::printModeBinary :
base=2;
break;
case etk::UString::printModeOctal :
//sprintf(ploppp, "%llo", _inputData);
base=8;
break;
default:
case etk::UString::printModeDecimal :
//sprintf(ploppp, "%llu", _inputData);
base=10;
break;
case etk::UString::printModeHexadecimal :
//sprintf(ploppp, "%llx", _inputData);
base=16;
break;
}
uint64_t tmpVal = _inputData;
etk::UString tmpString;
while (tmpVal>0) {
uint64_t quotient = tmpVal / base;
uint64_t rest = tmpVal - quotient*base;
tmpString.Add(0,(rest+'0'));
tmpVal = quotient;
}
if (tmpString.Size() == 0) {
m_data.PushBack('0');
} else {
*this += tmpString;
}
//TK_ERROR (" " << ploppp);
}
m_data.PushBack('\0');
}
@ -708,7 +678,7 @@ bool etk::UString::EndWith(const etk::UString& _data, bool _caseSensitive) const
for( int32_t iii=Size()-1, jjj=_data.Size()-1;
iii>=0 && jjj>=0;
iii--, jjj--) {
if (false==m_data[iii].CompareNoCase(_data[iii])) {
if (false==m_data[iii].CompareNoCase(_data[jjj])) {
return false;
}
}

View File

@ -11,6 +11,35 @@
namespace etk
{
//in the unicode section we have : [E000..F8FF] private area ==> we will store element in this area:
// internal define to permit to have all needed system
typedef enum {
REGEXP_OPCODE_PTHESE_IN=0xE000, /* ( */
REGEXP_OPCODE_PTHESE_OUT,/* ) */
REGEXP_OPCODE_BRACKET_IN,/* [ */
REGEXP_OPCODE_BRACKET_OUT,/* ] */
REGEXP_OPCODE_BRACE_IN,/* { */
REGEXP_OPCODE_BRACE_OUT,/* } */
REGEXP_OPCODE_TO,/* - */
REGEXP_OPCODE_STAR,/* * */
REGEXP_OPCODE_DOT,/* . */
REGEXP_OPCODE_QUESTION,/* ? */
REGEXP_OPCODE_PLUS,/* + */
REGEXP_OPCODE_PIPE,/* | */
REGEXP_OPCODE_START_OF_LINE,/* ^ this is also NOT, but not manage */
REGEXP_OPCODE_END_OF_LINE,/* $ */
REGEXP_OPCODE_DIGIT,/* \d */
REGEXP_OPCODE_DIGIT_NOT,/* \D */
REGEXP_OPCODE_LETTER,/* \l */
REGEXP_OPCODE_LETTER_NOT,/* \L */
REGEXP_OPCODE_SPACE,/* \s */
REGEXP_OPCODE_SPACE_NOT,/* \S */
REGEXP_OPCODE_WORD,/* \w */
REGEXP_OPCODE_WORD_NOT,/* \W */
REGEXP_OPCODE_NO_CHAR,/* \@ */
} regExpPrivateSection_te;
class UniChar
{
private:
@ -24,6 +53,9 @@ namespace etk
UniChar(const char _obj) :
m_value((uint32_t)_obj)
{ };
UniChar(const regExpPrivateSection_te _obj) :
m_value((uint32_t)_obj)
{ };
~UniChar(void) {}
/*****************************************************

View File

@ -85,7 +85,7 @@ namespace etk
tmpStr.Remove(0,posComa+1);
m_floats[1] = tmpStr.ToBool();
}
TK_VERBOSE("Parse : \"" << _str << "\" ==> " << *this);
TK_DEBUG("Parse : \"" << _str << "\" ==> " << *this);
}
template<> Vector2D<int32_t>::operator etk::UString(void) const

View File

@ -56,6 +56,8 @@ def Create(target):
else:
myModule.AddExportFlag_CC("-DDEBUG_LEVEL=3")
myModule.AddExportFlag_CC("-DDEBUG=1")
# Bor backtrace display :
myModule.AddExportflag_LD("-ldl -rdynamic")
if target.name=="Windows":
None