[DEV] add capacity at unichar and corect append of string

This commit is contained in:
Edouard DUPIN 2013-09-26 21:12:39 +02:00
parent 1826eb6fd9
commit e443c8a405
4 changed files with 99 additions and 35 deletions

View File

@ -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;
}

View File

@ -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];
}

View File

@ -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;
}
}

View File

@ -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);
};
};