[DEV] add capacity at unichar and corect append of string
This commit is contained in:
parent
1826eb6fd9
commit
e443c8a405
@ -54,7 +54,7 @@ etk::CCout& etk::operator <<(etk::CCout& _os, const etk::Vector<etk::UString>& _
|
||||
etk::UString::UString(void)
|
||||
{
|
||||
//TK_INFO("new etk::UString()");
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
|
||||
|
||||
@ -73,8 +73,8 @@ etk::UString::UString(const char* _data, unicode::charset_te _inputCharset)
|
||||
unicode::convertIsoToUnicode(_inputCharset, transformData, m_data);
|
||||
}
|
||||
if( 0 == m_data.Size()
|
||||
|| m_data[m_data.Size()-1]!='\0') {
|
||||
m_data.PushBack('\0');
|
||||
|| m_data[m_data.Size()-1]!=etk::UniChar::Null) {
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -131,7 +131,7 @@ etk::UString::UString(const bool _inputData, etk::UString::printMode_te _mode, b
|
||||
}
|
||||
break;
|
||||
}
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
|
||||
etk::UString::UString(const etk::UString& _obj)
|
||||
@ -143,7 +143,7 @@ etk::UString::UString(const etk::UString& _obj)
|
||||
etk::UString::UString(const etk::UniChar& _inputData)
|
||||
{
|
||||
m_data.PushBack(_inputData);
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
|
||||
etk::UString::UString(const float _inputData)
|
||||
@ -289,9 +289,9 @@ void etk::UString::SetNumber(bool _negative, const uint64_t& _inputData, etk::US
|
||||
//TK_ERROR (" " << ploppp);
|
||||
}
|
||||
if (m_data.Size()==0) {
|
||||
m_data.PushBack('\0');
|
||||
} else if (m_data[m_data.Size()-1]!='\0') {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
} else if (m_data[m_data.Size()-1]!=etk::UniChar::Null) {
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
//TK_ERROR(" convert : " << _inputData << " in : " << *this << " len=" << m_data.Size());
|
||||
}
|
||||
@ -369,11 +369,11 @@ void etk::UString::Set(const etk::Vector<etk::UniChar>& _inputData)
|
||||
{
|
||||
m_data = _inputData;
|
||||
if (m_data.Size()>0) {
|
||||
if (m_data[m_data.Size()-1] != '\0') {
|
||||
m_data.PushBack('\0');
|
||||
if (m_data[m_data.Size()-1] != etk::UniChar::Null) {
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
} else {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
//TK_DEBUG("m_dataLen="<<m_dataLen << " m_dataLenUTF8="<<m_dataLenUTF8 << " description=" << m_data);
|
||||
}
|
||||
@ -383,7 +383,7 @@ void etk::UString::Set(const char* _inputData, int32_t _len)
|
||||
// clear all the data
|
||||
m_data.Clear();
|
||||
if (NULL == _inputData) {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
// nothing to add ... ==> just exit
|
||||
return;
|
||||
}
|
||||
@ -406,9 +406,9 @@ void etk::UString::Set(const char* _inputData, int32_t _len)
|
||||
unicode::convertUtf8ToUnicode(tmpChar, m_data);
|
||||
}
|
||||
if (m_data.Size()==0) {
|
||||
m_data.PushBack('\0');
|
||||
} else if (m_data[m_data.Size()-1]!='\0') {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
} else if (m_data[m_data.Size()-1]!=etk::UniChar::Null) {
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -417,7 +417,7 @@ void etk::UString::Set(const etk::UniChar* _inputData, int32_t _len)
|
||||
// clear all the data
|
||||
m_data.Clear();
|
||||
if (NULL == _inputData) {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
// nothing to add ... ==> just exit
|
||||
return;
|
||||
}
|
||||
@ -430,9 +430,9 @@ void etk::UString::Set(const etk::UniChar* _inputData, int32_t _len)
|
||||
m_data.PushBack(_inputData, _len);
|
||||
}
|
||||
if (m_data.Size()==0) {
|
||||
m_data.PushBack('\0');
|
||||
} else if (m_data[m_data.Size()-1]!='\0') {
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
} else if (m_data[m_data.Size()-1]!=etk::UniChar::Null) {
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -592,7 +592,7 @@ const etk::UString& etk::UString::operator+= (const etk::UString &_obj)
|
||||
// This previous include the \0 in case of the 2 UString are different...
|
||||
if( this == &_obj ) {
|
||||
// add the removed end UString
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
@ -606,7 +606,7 @@ const etk::UString& etk::UString::operator+= (const etk::UniChar& _obj)
|
||||
// copy the data ...
|
||||
m_data.PushBack(_obj);
|
||||
// add the last '\0' element
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
return *this;
|
||||
}
|
||||
*/
|
||||
@ -670,13 +670,15 @@ void etk::UString::Add(int32_t _currentID, const etk::UniChar _inputData)
|
||||
{
|
||||
etk::UniChar data[2];
|
||||
data[0] = _inputData;
|
||||
data[1] = 0;
|
||||
data[1] = etk::UniChar::Null;
|
||||
Add(_currentID, data);
|
||||
}
|
||||
|
||||
void etk::UString::Append(const etk::UniChar& _inputData)
|
||||
{
|
||||
m_data.PopBack();
|
||||
m_data.PushBack(_inputData);
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
|
||||
|
||||
@ -694,7 +696,7 @@ void etk::UString::Remove(int32_t _currentID, int32_t _len)
|
||||
void etk::UString::Clear(void)
|
||||
{
|
||||
m_data.Clear();
|
||||
m_data.PushBack('\0');
|
||||
m_data.PushBack(etk::UniChar::Null);
|
||||
}
|
||||
|
||||
int32_t etk::UString::FindForward(const etk::UniChar _element, int32_t _startPos) const
|
||||
@ -742,7 +744,7 @@ etk::UString etk::UString::Extract(int32_t _posStart, int32_t _posEnd) const
|
||||
_posEnd = Size();
|
||||
}
|
||||
out.m_data = m_data.Extract(_posStart, _posEnd);
|
||||
out.m_data.PushBack('\0');
|
||||
out.m_data.PushBack(etk::UniChar::Null);
|
||||
return out;
|
||||
}
|
||||
|
||||
@ -775,7 +777,7 @@ etk::UString etk::UString::ExtractLine(int32_t _pos) const
|
||||
stopPos = Size();
|
||||
}
|
||||
out.m_data = m_data.Extract(startPos, stopPos);
|
||||
out.m_data.PushBack('\0');
|
||||
out.m_data.PushBack(etk::UniChar::Null);
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -117,10 +117,10 @@ namespace etk
|
||||
/*****************************************************
|
||||
* [] operator
|
||||
*****************************************************/
|
||||
const etk::UniChar& operator[] (int32_t _pos) const {
|
||||
const etk::UniChar& operator[] (esize_t _pos) const {
|
||||
return m_data[_pos];
|
||||
}
|
||||
etk::UniChar& operator[] (int32_t _pos) {
|
||||
etk::UniChar& operator[] (esize_t _pos) {
|
||||
return m_data[_pos];
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <etk/Vector.h>
|
||||
#include <etk/Char.h>
|
||||
|
||||
const etk::UniChar etk::UniChar::Null('\0');
|
||||
const etk::UniChar etk::UniChar::Return('\n');
|
||||
const etk::UniChar etk::UniChar::CarrierReturn('\r');
|
||||
const etk::UniChar etk::UniChar::Tabulation('\t');
|
||||
@ -179,33 +180,92 @@ int8_t etk::UniChar::GetUtf8(char _output[5]) const
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
/*
|
||||
etk::Vector<int8_t> etk::UniChar::GetUtf8(void) const
|
||||
{
|
||||
etk::Vector<int8_t> ret;
|
||||
uint32_t value = GetUtf8();
|
||||
if (0xFF >= value) {
|
||||
ret.PushBack((char)value);
|
||||
} else if (0xFFFF >= value) {
|
||||
ret.PushBack((char)((value>>8) & 0x000000FF));
|
||||
ret.PushBack((char)value);
|
||||
} else if (0xFFFFFF >= value) {
|
||||
ret.PushBack((char)((value>>16) & 0x000000FF));
|
||||
ret.PushBack((char)((value>>8) & 0x000000FF));
|
||||
ret.PushBack((char)value);
|
||||
} else {
|
||||
ret.PushBack((char)((value>>24) & 0x000000FF));
|
||||
ret.PushBack((char)((value>>16) & 0x000000FF));
|
||||
ret.PushBack((char)((value>>8) & 0x000000FF));
|
||||
ret.PushBack((char)value);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
*/
|
||||
uint8_t SizeElement(const char* _data, int32_t _lenMax)
|
||||
{
|
||||
uint8_t size = 0;
|
||||
TK_ASSERT(0 <= _lenMax, "size can not be < 0 ...");
|
||||
if (0 > _lenMax) {
|
||||
return 0;
|
||||
}
|
||||
//4 case
|
||||
if( _lenMax >= 1
|
||||
&& (_data[0] & 0x80) == 0x00 ) {
|
||||
// One Char Element
|
||||
size = 1;
|
||||
} else if( _lenMax >= 2
|
||||
&& (_data[0] & 0xE0) == 0xC0
|
||||
&& (_data[1] & 0xC0) == 0x80) {
|
||||
size = 2;
|
||||
} else if( _lenMax >= 3
|
||||
&& (_data[0] & 0xF0) == 0xE0
|
||||
&& (_data[1] & 0xC0) == 0x80
|
||||
&& (_data[2] & 0xC0) == 0x80) {
|
||||
size = 3;
|
||||
} else if( _lenMax >= 4
|
||||
&& (_data[0] & 0xF8) == 0xF0
|
||||
&& (_data[1] & 0xC0) == 0x80
|
||||
&& (_data[2] & 0xC0) == 0x80
|
||||
&& (_data[3] & 0xC0) == 0x80) {
|
||||
size = 4;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
void etk::UniChar::SetUtf8(const char* _input)
|
||||
|
||||
int8_t etk::UniChar::SetUtf8(const char* _input)
|
||||
{
|
||||
m_value = 0;
|
||||
if (NULL == _input) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
int32_t len = strlen(_input);
|
||||
len = SizeElement(_input, len);
|
||||
switch (len) {
|
||||
default:
|
||||
// case 0 : An error occured...
|
||||
m_value = _input[0];
|
||||
return 0;
|
||||
case 1:
|
||||
m_value = (uint8_t)(_input[0]) & 0x7F;
|
||||
break;
|
||||
return 1;
|
||||
case 2:
|
||||
m_value = (((uint8_t)_input[0]) & 0x1F)<< 6;
|
||||
m_value += ((uint8_t)_input[1]) & 0x3F;
|
||||
break;
|
||||
return 2;
|
||||
case 3:
|
||||
m_value = (((uint8_t)_input[0]) & 0x0F)<< 12;
|
||||
m_value += (((uint8_t)_input[1]) & 0x3F)<< 6;
|
||||
m_value += ((uint8_t)_input[2]) & 0x3F;
|
||||
break;
|
||||
default:
|
||||
return 3;
|
||||
case 4:
|
||||
m_value = (((uint8_t)_input[0]) & 0x07)<< 18;
|
||||
m_value += (((uint8_t)_input[1]) & 0x3F)<< 12;
|
||||
m_value += (((uint8_t)_input[2]) & 0x3F)<< 6;
|
||||
m_value += ((uint8_t)_input[3]) & 0x3F;
|
||||
break;
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,7 @@ namespace etk
|
||||
class UniChar
|
||||
{
|
||||
public: // classic unicar code :
|
||||
static const UniChar Null; //!< '\0'
|
||||
static const UniChar Return; //!< '\n'
|
||||
static const UniChar CarrierReturn; //!< '\r' CR
|
||||
static const UniChar Tabulation; //!< '\t' TAB
|
||||
@ -175,7 +176,8 @@ namespace etk
|
||||
|
||||
uint32_t GetUtf8(void) const;
|
||||
int8_t GetUtf8(char _output[5]) const;
|
||||
void SetUtf8(const char* _input);
|
||||
//etk::Vector<int8_t> GetUtf8(void) const;
|
||||
int8_t SetUtf8(const char* _input);
|
||||
};
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user