/** * @author Edouard DUPIN * * @copyright 2011, Edouard DUPIN, all right reserved * * @license BSD v3 (see license file) */ #include #include #include int32_t strlen(const uniChar_t * data) { if (NULL == data) { return 0; } int32_t iii=0; while (*data != 0) { data++; iii++; if (iii > 0x7FFFFFF0) { return iii; } } return iii; } #undef __class__ #define __class__ "etk::UString" etk::CCout& etk::operator <<(etk::CCout &os, const etk::UString &obj) { etk::Vector output_UTF8; unicode::convertUnicodeToUtf8(obj.m_data, output_UTF8); output_UTF8.PushBack('\0'); os << &output_UTF8[0]; return os; } etk::UString::~UString(void) { //m_data.Clear(); //m_dataUtf8.Clear(); } etk::UString::UString(void) { //TK_INFO("new etk::UString()"); m_data.Clear(); m_data.PushBack('\0'); } etk::UString::UString(const char* inputData, int32_t len) { m_data.Clear(); m_data.PushBack('\0'); Set(inputData, len); } etk::UString::UString(const uniChar_t* inputData, int32_t len) { m_data.Clear(); m_data.PushBack('\0'); Set(inputData, len); } /* etk::UString::UString(const uniChar_t inputData) { m_data.Clear(); m_data.PushBack('\0'); Set(&inputData, 1); } */ void etk::UString::Set(const char * inputData, int32_t len) { if (NULL == inputData) { // nothing to add ... return; } // overwrite the len if needed : if ((-1) == len) { len = strlen(inputData); } // convert the string etk::Vector tmpChar; for (int32_t iii=0; iii inputData) { etk::Vector output_Unicode; unicode::convertUtf8ToUnicode(inputData, output_Unicode); *this = output_Unicode; return *this; } const etk::UString& etk::UString::operator= (etk::Vector inputData) { etk::Vector output_Unicode; unicode::convertUtf8ToUnicode(inputData, output_Unicode); *this = output_Unicode; return *this; } const etk::UString& etk::UString::operator= (etk::Vector inputData) { m_data = inputData; if (m_data.Size()>0) { if (m_data[m_data.Size()-1] != '\0') { m_data.PushBack('\0'); } } //TK_DEBUG("m_dataLen="<'" << (char)etkS.m_data[iii] << "' ==> " << changeOrder(m_data[iii]) << ">" << changeOrder(etkS.m_data[iii]) << ""); uniChar_t elemA = changeOrder(m_data[iii]); uniChar_t elemB = changeOrder(etkS.m_data[iii]); if (elemA != elemB) { if (elemA > elemB) { return true; } return false; } } if (m_data.Size() > etkS.m_data.Size()) { return true; } } return false; } bool etk::UString::operator>= (const etk::UString& etkS) const { if( this != &etkS ) { for (int32_t iii=0; iii < m_data.Size() && iii < etkS.m_data.Size(); iii++) { uniChar_t elemA = changeOrder(m_data[iii]); uniChar_t elemB = changeOrder(etkS.m_data[iii]); if (elemA != elemB) { if (elemA > elemB) { return true; } return false; } } if (m_data.Size() >= etkS.m_data.Size()) { return true; } } return false; } bool etk::UString::operator< (const etk::UString& etkS) const { if( this != &etkS ) { for (int32_t iii=0; iii < m_data.Size() && iii < etkS.m_data.Size(); iii++) { uniChar_t elemA = changeOrder(m_data[iii]); uniChar_t elemB = changeOrder(etkS.m_data[iii]); if (elemA != elemB) { if (elemA < elemB) { return true; } return false; } } if (m_data.Size() < etkS.m_data.Size()) { return true; } } return false; } bool etk::UString::operator<= (const etk::UString& etkS) const { if( this != &etkS ) { for (int32_t iii=0; iii < m_data.Size() && iii < etkS.m_data.Size(); iii++) { uniChar_t elemA = changeOrder(m_data[iii]); uniChar_t elemB = changeOrder(etkS.m_data[iii]); if (elemA != elemB) { if (elemA < elemB) { return true; } return false; } } if (m_data.Size() <= etkS.m_data.Size()) { return true; } } return false; } bool etk::UString::operator== (const etk::UString& etkS) const { if( this != &etkS ) { if (etkS.m_data.Size() != m_data.Size()) { //TK_DEBUG(" not the same size : " << etkS.m_data.Size() << "!=" << m_data.Size()); return false; } for (int32_t iii= 0; iii= m_data.Size() ) { return true; } else { return false; } } int32_t etk::UString::Size(void) const { if (m_data.Size() == 0) { return 0; } else { return m_data.Size() - 1; } } void etk::UString::Add(int32_t currentID, const char* inputData) { etk::UString tmpString(inputData); Add(currentID, tmpString.pointer() ); } void etk::UString::Add(int32_t currentID, const uniChar_t* inputData) { // get the input lenght int32_t len = strlen(inputData); if (0 == len) { TK_WARNING("no data to add on the current UString"); return; } else if (currentID < 0) { TK_WARNING("Curent ID(" << currentID << ") < 0 ==> Add at the start"); currentID = 0; } else if (currentID > Size() ) { TK_ERROR("Curent ID(" << currentID << ") > maxSize ... (" << Size() << ") ==> add at the end ..."); m_data.PushBack(inputData, len); return; } m_data.Insert(currentID, inputData, len); } void etk::UString::Add(int32_t currentID, const uniChar_t inputData) { uniChar_t data[2]; data[0] = inputData; data[1] = 0; Add(currentID, data); } void etk::UString::Remove(int32_t currentID, int32_t len) { if (0 >= len) { TK_ERROR("no data to remove on the current UString"); return; } // TODO : check the size of the data m_data.EraseLen(currentID, len); } void etk::UString::Clear(void) { m_data.Clear(); m_data.PushBack('\0'); } int32_t etk::UString::FindForward(const char element, int32_t startPos) const { return FindForward((uniChar_t)element, startPos); } int32_t etk::UString::FindForward(const uniChar_t element, int32_t startPos) const { if (startPos < 0) { startPos = 0; } else if (startPos >= Size() ) { return -1; } for (int32_t iii=startPos; iii< Size(); iii++) { if (m_data[iii] == element) { return iii; } } return -1; } int32_t etk::UString::FindBack(const char element, int32_t startPos) const { return FindBack((uniChar_t)element, startPos); } int32_t etk::UString::FindBack(const uniChar_t element, int32_t startPos) const { if (startPos < 0) { return -1; } else if (startPos >= Size() ) { startPos = Size(); } for (int32_t iii=startPos; iii>=0; iii--) { if (m_data[iii] == element) { return iii; } } return -1; } etk::UString etk::UString::Extract(int32_t posStart, int32_t posEnd) const { etk::UString out; if (posStart < 0) { posStart = 0; } else if (posStart >= Size() ) { return out; } if (posEnd < 0) { return out; } else if (posEnd >= Size() ) { posEnd = Size(); } out.m_data = m_data.Extract(posStart, posEnd); out.m_data.PushBack('\0'); return out; } etk::Vector etk::UString::GetVector(void) { etk::Vector out = m_data; out.PopBack(); return out; } bool etk::UString::StartWith(const etk::UString& data) { if (data.Size() == 0) { return false; } if (data.Size() > Size()) { return false; } for (int32_t iii=0; iii Size()) { return false; } for( int32_t iii=Size()-1, jjj=data.Size()-1; iii>=0 && jjj>=0; iii--, jjj--) { if (data[jjj] != m_data[iii]) { return false; } } return true; } char * etk::UString::c_str(void) { // UTF8 generation : m_dataUtf8.Clear(); unicode::convertUnicodeToUtf8(m_data, m_dataUtf8); m_dataUtf8.PushBack('\0'); return &m_dataUtf8[0]; }