[DEV] update to the etk::Buffer system
This commit is contained in:
parent
af38aaf01a
commit
311c009fff
@ -124,7 +124,7 @@ void EdnBuf::GetAll(etk::Vector<int8_t> &text)
|
|||||||
// Clean output vector
|
// Clean output vector
|
||||||
text.Clear();
|
text.Clear();
|
||||||
// Set data on the vector
|
// Set data on the vector
|
||||||
m_data.Get(0, m_data.Size(), text);
|
text = m_data.Get(0, m_data.Size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ void EdnBuf::GetRange(int32_t start, int32_t end, etk::Vector<int8_t> &output)
|
|||||||
// Remove all data ...
|
// Remove all data ...
|
||||||
output.Clear();
|
output.Clear();
|
||||||
// import data :
|
// import data :
|
||||||
m_data.Get(start, end-start, output);
|
output = m_data.Get(start, end-start);
|
||||||
//APPL_DEBUG("request start=" << start << " end="<< end << " size="<< end-start << " result size=" << output.Size() );
|
//APPL_DEBUG("request start=" << start << " end="<< end << " size="<< end-start << " result size=" << output.Size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,8 +162,7 @@ void EdnBuf::GetRange(int32_t start, int32_t end, etk::UString &output)
|
|||||||
// Remove all data ...
|
// Remove all data ...
|
||||||
output = "";
|
output = "";
|
||||||
// import data :
|
// import data :
|
||||||
etk::Vector<int8_t> localOutput;
|
etk::Vector<int8_t> localOutput = m_data.Get(start, end-start);
|
||||||
m_data.Get(start, end-start, localOutput);
|
|
||||||
// transcript in UNICODE ...
|
// transcript in UNICODE ...
|
||||||
if (true == m_isUtf8) {
|
if (true == m_isUtf8) {
|
||||||
localOutput.PushBack('\0');
|
localOutput.PushBack('\0');
|
||||||
@ -763,16 +762,11 @@ int32_t EdnBuf::CharWidth(char c, int32_t indent)
|
|||||||
*/
|
*/
|
||||||
int32_t EdnBuf::CountDispChars(int32_t lineStartPos, int32_t targetPos)
|
int32_t EdnBuf::CountDispChars(int32_t lineStartPos, int32_t targetPos)
|
||||||
{
|
{
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(lineStartPos);
|
|
||||||
int32_t charCount = 0;
|
int32_t charCount = 0;
|
||||||
|
|
||||||
char expandedChar[MAX_EXP_CHAR_LEN];
|
char expandedChar[MAX_EXP_CHAR_LEN];
|
||||||
//APPL_DEBUG("lineStartPos="<< lineStartPos << " targetPos=" << targetPos);
|
//APPL_DEBUG("lineStartPos="<< lineStartPos << " targetPos=" << targetPos);
|
||||||
while( myPosIt
|
for(int32_t iii = lineStartPos; iii< targetPos && iii<m_data.Size() ; iii++ ) {
|
||||||
&& myPosIt.Position() < targetPos )
|
charCount += ExpandCharacter(m_data[iii], charCount, expandedChar);
|
||||||
{
|
|
||||||
charCount += ExpandCharacter(*myPosIt, charCount, expandedChar);
|
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
//APPL_DEBUG(" result=" << charCount);
|
//APPL_DEBUG(" result=" << charCount);
|
||||||
return charCount;
|
return charCount;
|
||||||
@ -780,102 +774,74 @@ int32_t EdnBuf::CountDispChars(int32_t lineStartPos, int32_t targetPos)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return the position of the nth diplaye char
|
* @brief Return the position of the nth diplaye char
|
||||||
*
|
|
||||||
* @param[in] lineStartPos Position of the start of the line
|
* @param[in] lineStartPos Position of the start of the line
|
||||||
* @param[in] nChars search in the next nChars elements
|
* @param[in] nChars search in the next nChars elements
|
||||||
*
|
|
||||||
* @return number of diaplay char
|
* @return number of diaplay char
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
int32_t EdnBuf::CountForwardDispChars(int32_t lineStartPos, int32_t nChars)
|
int32_t EdnBuf::CountForwardDispChars(int32_t lineStartPos, int32_t nChars)
|
||||||
{
|
{
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(lineStartPos);
|
|
||||||
int32_t charCount = 0;
|
int32_t charCount = 0;
|
||||||
char c;
|
int32_t iii = 0;
|
||||||
|
for(iii = lineStartPos; charCount<nChars && iii<m_data.Size() ; iii++ ) {
|
||||||
while( charCount < nChars
|
char c = m_data[iii];
|
||||||
&& myPosIt)
|
|
||||||
{
|
|
||||||
c = *myPosIt;
|
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
return myPosIt.Position();
|
return iii;
|
||||||
}
|
}
|
||||||
charCount += CharWidth(c, charCount);
|
charCount += CharWidth(c, charCount);
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
return myPosIt.Position();
|
return iii;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Count the number of newlines ('\n') between startPos and endPos
|
* @brief Count the number of newlines ('\n') between startPos and endPos
|
||||||
*
|
|
||||||
* @param[in,out] startPos Fist position in the buffer
|
* @param[in,out] startPos Fist position in the buffer
|
||||||
* @param[in,out] endPos Last position in the buffer (not counted)
|
* @param[in,out] endPos Last position in the buffer (not counted)
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
int32_t EdnBuf::CountLines(int32_t startPos, int32_t endPos)
|
int32_t EdnBuf::CountLines(int32_t startPos, int32_t endPos)
|
||||||
{
|
{
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(startPos);
|
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
|
for(int32_t iii = startPos; iii<m_data.Size() ; iii++ ) {
|
||||||
while (myPosIt) {
|
if (iii == endPos) {
|
||||||
if (myPosIt.Position() == endPos) {
|
|
||||||
return lineCount;
|
return lineCount;
|
||||||
}
|
}
|
||||||
if ('\n' == *myPosIt) {
|
if ('\n' == m_data[iii]) {
|
||||||
lineCount++;
|
lineCount++;
|
||||||
}
|
}
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
return lineCount;
|
return lineCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief count the number of '\n' in the vector of elements
|
* @brief count the number of '\n' in the vector of elements
|
||||||
*
|
|
||||||
* @param[in] text Data to count the lines
|
* @param[in] text Data to count the lines
|
||||||
*
|
|
||||||
* @return number of line found
|
* @return number of line found
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
int32_t EdnBuf::CountLines(etk::Vector<int8_t> &data)
|
int32_t EdnBuf::CountLines(etk::Vector<int8_t> &data)
|
||||||
{
|
{
|
||||||
etk::Vector<int8_t>::Iterator myPosIt = data.Begin();
|
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
|
for(int32_t iii=0 ; iii<m_data.Size() ; iii++ ) {
|
||||||
while(myPosIt) {
|
if ('\n' == data[iii]) {
|
||||||
if ('\n' == *myPosIt) {
|
|
||||||
lineCount++;
|
lineCount++;
|
||||||
}
|
}
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
return lineCount;
|
return lineCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t EdnBuf::CountLines(void)
|
int32_t EdnBuf::CountLines(void)
|
||||||
{
|
{
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Begin();
|
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
|
for(int32_t iii=0 ; iii<m_data.Size() ; iii++ ) {
|
||||||
while(myPosIt) {
|
if ('\n' == m_data[iii]) {
|
||||||
if ('\n' == *myPosIt) {
|
|
||||||
lineCount++;
|
lineCount++;
|
||||||
}
|
}
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
return lineCount;
|
return lineCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Calculate the number of line
|
* @brief Calculate the number of line
|
||||||
*
|
|
||||||
* @param ---
|
|
||||||
*
|
|
||||||
* @return the number of line in the buffer [1..n]
|
* @return the number of line in the buffer [1..n]
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
void EdnBuf::CountNumberOfLines(void)
|
void EdnBuf::CountNumberOfLines(void)
|
||||||
{
|
{
|
||||||
@ -900,22 +866,20 @@ int32_t EdnBuf::CountForwardNLines(int32_t startPos, int32_t nLines)
|
|||||||
} else if (startPos > m_data.Size() ) {
|
} else if (startPos > m_data.Size() ) {
|
||||||
return m_data.Size();
|
return m_data.Size();
|
||||||
}
|
}
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(startPos);
|
|
||||||
int32_t lineCount = 0;
|
int32_t lineCount = 0;
|
||||||
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
||||||
while(myPosIt)
|
int32_t iii = 0;
|
||||||
{
|
for(iii = startPos; iii<m_data.Size() ; iii++ ) {
|
||||||
if ('\n' == *myPosIt) {
|
if ('\n' == m_data[iii]) {
|
||||||
lineCount++;
|
lineCount++;
|
||||||
if (lineCount == nLines) {
|
if (lineCount == nLines) {
|
||||||
//APPL_INFO(" ==> (1) at position=" << myPosIt.Position()+1 );
|
//APPL_INFO(" ==> (1) at position=" << myPosIt.Position()+1 );
|
||||||
return myPosIt.Position()+1;
|
return iii+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
//APPL_INFO(" ==> (2) at position=" << myPosIt.Position() );
|
//APPL_INFO(" ==> (2) at position=" << myPosIt.Position() );
|
||||||
return myPosIt.Position();
|
return iii;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -937,18 +901,15 @@ int32_t EdnBuf::CountBackwardNLines(int32_t startPos, int32_t nLines)
|
|||||||
}
|
}
|
||||||
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
|
||||||
|
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(startPos-1);
|
|
||||||
int32_t lineCount = -1;
|
int32_t lineCount = -1;
|
||||||
|
for(int32_t iii = startPos-1; iii>=0 ; iii-- ) {
|
||||||
while(myPosIt) {
|
if ('\n' == m_data[iii]) {
|
||||||
if ('\n' == *myPosIt) {
|
|
||||||
lineCount++;
|
lineCount++;
|
||||||
if (lineCount >= nLines) {
|
if (lineCount >= nLines) {
|
||||||
//APPL_INFO(" ==> (1) at position=" << myPosIt.Position()+1 );
|
//APPL_INFO(" ==> (1) at position=" << myPosIt.Position()+1 );
|
||||||
return myPosIt.Position()+1;
|
return iii+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
myPosIt--;
|
|
||||||
}
|
}
|
||||||
//APPL_INFO(" ==> (2) at position=0");
|
//APPL_INFO(" ==> (2) at position=0");
|
||||||
return 0;
|
return 0;
|
||||||
@ -1276,15 +1237,12 @@ void EdnBuf::eventModification(int32_t pos, int32_t nInserted, etk::Vector<int8_
|
|||||||
*/
|
*/
|
||||||
bool EdnBuf::SearchForward(int32_t startPos, char searchChar, int32_t *foundPos)
|
bool EdnBuf::SearchForward(int32_t startPos, char searchChar, int32_t *foundPos)
|
||||||
{
|
{
|
||||||
// Create iterator
|
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(startPos);
|
|
||||||
// move in the string
|
// move in the string
|
||||||
while (myPosIt) {
|
for(int32_t iii=startPos ; iii<m_data.Size() ; iii++ ) {
|
||||||
if (*myPosIt == searchChar) {
|
if (m_data[iii] == searchChar) {
|
||||||
*foundPos = myPosIt.Position();
|
*foundPos = iii;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
myPosIt++;
|
|
||||||
}
|
}
|
||||||
*foundPos = m_data.Size();
|
*foundPos = m_data.Size();
|
||||||
return false;
|
return false;
|
||||||
@ -1303,15 +1261,12 @@ bool EdnBuf::SearchForward(int32_t startPos, char searchChar, int32_t *foundPos)
|
|||||||
*/
|
*/
|
||||||
bool EdnBuf::SearchBackward(int32_t startPos, char searchChar, int32_t *foundPos)
|
bool EdnBuf::SearchBackward(int32_t startPos, char searchChar, int32_t *foundPos)
|
||||||
{
|
{
|
||||||
// Create iterator
|
|
||||||
EdnVectorBuf::Iterator myPosIt = m_data.Position(startPos-1);
|
|
||||||
// move in the string
|
// move in the string
|
||||||
while (myPosIt) {
|
for(int32_t iii=startPos-1 ; iii>=0 ; iii-- ) {
|
||||||
if (*myPosIt == searchChar) {
|
if (m_data[iii] == searchChar) {
|
||||||
*foundPos = myPosIt.Position();
|
*foundPos = iii;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
myPosIt--;
|
|
||||||
}
|
}
|
||||||
*foundPos = 0;
|
*foundPos = 0;
|
||||||
return false;
|
return false;
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
class EdnBuf;
|
class EdnBuf;
|
||||||
|
|
||||||
#include <EdnVectorBuf.h>
|
#include <etk/Buffer.h>
|
||||||
#include <EdnBufHistory.h>
|
#include <EdnBufHistory.h>
|
||||||
#include <HighlightManager.h>
|
#include <HighlightManager.h>
|
||||||
#include <etk/unicode.h>
|
#include <etk/unicode.h>
|
||||||
@ -166,7 +166,7 @@ class EdnBuf {
|
|||||||
colorInformation_ts * GetElementColorAtPosition(int32_t pos, int32_t &starPos);
|
colorInformation_ts * GetElementColorAtPosition(int32_t pos, int32_t &starPos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EdnVectorBuf m_data; //!< buffer of the data in the mode int8_t
|
etk::Buffer m_data; //!< buffer of the data in the mode int8_t
|
||||||
void CountNumberOfLines(void);
|
void CountNumberOfLines(void);
|
||||||
int32_t m_nbLine; //!< Number of line in the biffer
|
int32_t m_nbLine; //!< Number of line in the biffer
|
||||||
|
|
||||||
|
@ -1,704 +0,0 @@
|
|||||||
/**
|
|
||||||
*******************************************************************************
|
|
||||||
* @file EdnEdnVectorBuf.cpp
|
|
||||||
* @brief Editeur De N'ours : Basic EdnVectorBuf Basic binary vector for all type of storage
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @date 07/04/2011
|
|
||||||
* @par Project
|
|
||||||
* Edn
|
|
||||||
*
|
|
||||||
* @par Copyright
|
|
||||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY.
|
|
||||||
*
|
|
||||||
* Licence summary :
|
|
||||||
* You can modify and redistribute the sources code and binaries.
|
|
||||||
* You can send me the bug-fix
|
|
||||||
* You can not earn money with this Software (if the source extract from Edn
|
|
||||||
* represent less than 50% of original Sources)
|
|
||||||
* Term of the licence in in the file licence.txt.
|
|
||||||
*
|
|
||||||
*******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <appl/Debug.h>
|
|
||||||
#include <appl/global.h>
|
|
||||||
#include <EdnVectorBuf.h>
|
|
||||||
|
|
||||||
#undef __class__
|
|
||||||
#define __class__ "EdnEdnVectorBuf"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create an empty vector
|
|
||||||
*
|
|
||||||
* @param[in] count Minimum request size of the Buffer
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
EdnVectorBuf::EdnVectorBuf(int32_t count)
|
|
||||||
{
|
|
||||||
m_data = NULL;
|
|
||||||
m_allocated = 0;
|
|
||||||
m_gapStart = 0;
|
|
||||||
m_gapEnd = GAP_SIZE_MIN;
|
|
||||||
ChangeAllocation(count+GAP_SIZE_MIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Re-copy constructor (copy all needed data)
|
|
||||||
*
|
|
||||||
* @param[in] Evb Vector that might be copy
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
EdnVectorBuf::EdnVectorBuf(const EdnVectorBuf & Evb)
|
|
||||||
{
|
|
||||||
m_allocated = Evb.m_allocated;
|
|
||||||
m_data = NULL;
|
|
||||||
m_gapStart = Evb.m_gapStart;
|
|
||||||
m_gapEnd = Evb.m_gapEnd;
|
|
||||||
|
|
||||||
// allocate all same data
|
|
||||||
m_data = (int8_t *)malloc( m_allocated * sizeof(int8_t) );
|
|
||||||
APPL_ASSERT(NULL!=m_data, "Error in data allocation");
|
|
||||||
// Copy all data ...
|
|
||||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(int8_t) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructor of the current Class
|
|
||||||
*
|
|
||||||
* @param ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
EdnVectorBuf::~EdnVectorBuf()
|
|
||||||
{
|
|
||||||
if (NULL!=m_data) {
|
|
||||||
free(m_data);
|
|
||||||
m_data = NULL;
|
|
||||||
m_allocated = 0;
|
|
||||||
m_gapStart = 0;
|
|
||||||
m_gapEnd = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int32_t getFileSize(FILE *myFile)
|
|
||||||
{
|
|
||||||
if (NULL == myFile) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int32_t size = 0;
|
|
||||||
|
|
||||||
fseek(myFile, 0, SEEK_END);
|
|
||||||
size = ftell(myFile);
|
|
||||||
fseek(myFile, 0, SEEK_SET);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Save in the current file open
|
|
||||||
*
|
|
||||||
* @param[in,out] myFile pointer on the file where data might be writed
|
|
||||||
*
|
|
||||||
* @return true if OK / false if an error occured
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
bool EdnVectorBuf::DumpIn(etk::FSNode &file)
|
|
||||||
{
|
|
||||||
bool ret = true;
|
|
||||||
// write Data
|
|
||||||
(void)file.FileWrite(m_data, sizeof(int8_t), m_gapStart);
|
|
||||||
(void)file.FileWrite(&m_data[m_gapEnd], sizeof(int8_t), m_allocated - m_gapEnd);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Load in the current file open
|
|
||||||
*
|
|
||||||
* @param[in,out] myFile pointer on the file where data might be read
|
|
||||||
*
|
|
||||||
* @return true if OK / false if an error occured
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
bool EdnVectorBuf::DumpFrom(etk::FSNode &file)
|
|
||||||
{
|
|
||||||
bool ret = true;
|
|
||||||
uint32_t length = file.FileSize();
|
|
||||||
// error case ...
|
|
||||||
if (length > 2000000000) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// allocate the current buffer :
|
|
||||||
ChangeAllocation(length + GAP_SIZE_MIN);
|
|
||||||
|
|
||||||
// insert Data
|
|
||||||
int32_t nbReadData = file.FileRead(&m_data[GAP_SIZE_MIN], sizeof(int8_t), length);
|
|
||||||
APPL_INFO("load data : filesize=" << length << ", readData=" << nbReadData);
|
|
||||||
// check ERROR
|
|
||||||
if (nbReadData != length) {
|
|
||||||
APPL_ERROR("load data pb : filesize=" << length << ", readData=" << nbReadData);
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
// set the gapsize at the end ...
|
|
||||||
m_gapStart = 0;
|
|
||||||
m_gapEnd = GAP_SIZE_MIN;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Re-copy operator
|
|
||||||
*
|
|
||||||
* @param[in] Evb Vector that might be copy
|
|
||||||
*
|
|
||||||
* @return reference on the curent re-copy vector
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
EdnVectorBuf& EdnVectorBuf::operator=(const EdnVectorBuf & Evb)
|
|
||||||
{
|
|
||||||
if( this != &Evb ) // avoid copy to itself
|
|
||||||
{
|
|
||||||
if (NULL!=m_data) {
|
|
||||||
free(m_data);
|
|
||||||
m_data = NULL;
|
|
||||||
}
|
|
||||||
// Set the new value
|
|
||||||
m_allocated = Evb.m_allocated;
|
|
||||||
m_gapStart = Evb.m_gapStart;
|
|
||||||
m_gapEnd = Evb.m_gapEnd;
|
|
||||||
// allocate all same data
|
|
||||||
m_data = (int8_t *)malloc( m_allocated * sizeof(int8_t) );
|
|
||||||
APPL_ASSERT(NULL!=m_data, "Error in data allocation");
|
|
||||||
// Copy all data ...
|
|
||||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(int8_t) );
|
|
||||||
}
|
|
||||||
// Return the curent pointer
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t EdnVectorBuf::operator[] (int32_t pos)
|
|
||||||
{
|
|
||||||
APPL_ASSERT(0 <= pos || pos < Size(), "try to read an element non existing");
|
|
||||||
if (pos < m_gapStart) {
|
|
||||||
return m_data[pos];
|
|
||||||
}
|
|
||||||
return m_data[pos + m_gapEnd-m_gapStart];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get a current element in the vector
|
|
||||||
*
|
|
||||||
* @param[in] pos Desired position read
|
|
||||||
*
|
|
||||||
* @return Reference on the Element
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int8_t& EdnVectorBuf::Get(int32_t pos)
|
|
||||||
{
|
|
||||||
APPL_ASSERT(0 <= pos || pos < Size(), "try to read an element non existing");
|
|
||||||
if (pos < m_gapStart) {
|
|
||||||
return m_data[pos];
|
|
||||||
}
|
|
||||||
return m_data[pos + m_gapEnd-m_gapStart];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Get(int32_t pos, int32_t nbElement, etk::Vector<int8_t> &tmpBuffer)
|
|
||||||
{
|
|
||||||
tmpBuffer.Clear();
|
|
||||||
if (pos < m_gapStart) {
|
|
||||||
if (pos + nbElement < m_gapStart) {
|
|
||||||
tmpBuffer.PushBack(&m_data[pos], nbElement);
|
|
||||||
} else {
|
|
||||||
tmpBuffer.PushBack(&m_data[pos], m_gapStart - pos);
|
|
||||||
tmpBuffer.PushBack(&m_data[m_gapEnd], nbElement - (m_gapStart - pos) );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tmpBuffer.PushBack(&m_data[pos+(m_gapEnd-m_gapStart)], nbElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Add at the Last position of the Vector
|
|
||||||
*
|
|
||||||
* @param[in] item Element to add at the end of vector
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::PushBack(const int8_t& item)
|
|
||||||
{
|
|
||||||
Insert( Size(), item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove the last element of the vector
|
|
||||||
*
|
|
||||||
* @param ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::PopBack(void)
|
|
||||||
{
|
|
||||||
if (Size()>0) {
|
|
||||||
Remove( Size() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove data in the buffer
|
|
||||||
*
|
|
||||||
* @param[in]
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Remove(int32_t pos, int32_t nbRemoveElement)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( pos+nbRemoveElement > Size() ) {
|
|
||||||
APPL_ERROR("Request remove more element than expected in the buffer pos+nbRemoveElement="<<pos+nbRemoveElement<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (false == GapMove(pos) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Remove elements :
|
|
||||||
if (m_allocated==m_gapEnd) {
|
|
||||||
m_gapStart -= nbRemoveElement;
|
|
||||||
} else {
|
|
||||||
m_gapEnd += nbRemoveElement;
|
|
||||||
}
|
|
||||||
// Resize buffer if needed...
|
|
||||||
GapCheckMaxSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Change the current allocation to the corect one (depend on the current size)
|
|
||||||
*
|
|
||||||
* @param[in] newSize Minimum number of element needed
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Clear(void)
|
|
||||||
{
|
|
||||||
// Remove all element in the buffer
|
|
||||||
Remove(0, Size() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Change the current allocation to the corect one (depend on the current size)
|
|
||||||
*
|
|
||||||
* @param[in] newSize Minimum number of element needed
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::ChangeAllocation(int32_t newSize)
|
|
||||||
{
|
|
||||||
// set the minimal size to 1
|
|
||||||
if(newSize <= 0) {
|
|
||||||
newSize = 1;
|
|
||||||
}
|
|
||||||
// set the size with the corect chose type :
|
|
||||||
if (newSize == m_allocated) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
APPL_DEBUG("Change Allocation : " << m_allocated << " ==> " << newSize);
|
|
||||||
// check if something is allocated :
|
|
||||||
if (NULL == m_data) {
|
|
||||||
// no data allocated ==> request an allocation (might be the first)
|
|
||||||
m_data = (int8_t *)malloc( newSize * sizeof(int8_t) );
|
|
||||||
} else {
|
|
||||||
// move datas
|
|
||||||
m_data = (int8_t *)realloc( m_data, newSize* sizeof(int8_t) );
|
|
||||||
}
|
|
||||||
// Check result with assert :
|
|
||||||
APPL_ASSERT(NULL!=m_data, "Error in data allocation");
|
|
||||||
// set the new allocation size
|
|
||||||
m_allocated = newSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Insert(int32_t pos, const int8_t& item)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( 0 == GapSize() ) {
|
|
||||||
if (false == GapResize(pos, GAP_SIZE_MIN + 1) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if( pos == m_gapStart
|
|
||||||
&& pos == m_gapEnd-1 )
|
|
||||||
{
|
|
||||||
// mothing to do ...
|
|
||||||
} else {
|
|
||||||
if (false == GapMove(pos)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pos == m_gapStart) {
|
|
||||||
m_data[m_gapStart] = item;
|
|
||||||
m_gapStart++;
|
|
||||||
} else {
|
|
||||||
m_data[m_gapEnd-1] = item;
|
|
||||||
m_gapEnd--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Insert(int32_t pos, etk::Vector<int8_t>& items)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( items.Size() > GapSize() ) {
|
|
||||||
if (false == GapResize(pos, GAP_SIZE_MIN + items.Size()) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (false == GapMove(pos) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int32_t i;
|
|
||||||
for(i=0; i<items.Size(); i++) {
|
|
||||||
m_data[m_gapStart+i] = items[i];
|
|
||||||
}
|
|
||||||
m_gapStart += items.Size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Replace(int32_t pos, const int8_t& item)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// just replace the element, not update Gap position
|
|
||||||
if (pos < m_gapStart) {
|
|
||||||
m_data[pos] = item;
|
|
||||||
} else {
|
|
||||||
m_data[pos+GapSize()] = item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Replace(int32_t pos, int32_t nbRemoveElement, etk::Vector<int8_t>& items)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( pos+nbRemoveElement > Size() ) {
|
|
||||||
APPL_ERROR("Request remove more element than expected in the buffer pos+nbRemoveElement="<<pos+nbRemoveElement<< " bufferSize="<<Size());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (false == GapMove(pos)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Remove elements :
|
|
||||||
m_gapEnd += nbRemoveElement;
|
|
||||||
//Display();
|
|
||||||
// insert elements
|
|
||||||
Insert(pos, items);
|
|
||||||
// Resize buffer if needed...
|
|
||||||
GapCheckMaxSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
bool EdnVectorBuf::GapMove(int32_t pos)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int32_t gapLen = m_gapEnd - m_gapStart;
|
|
||||||
if (pos > m_gapStart) {
|
|
||||||
memmove(&m_data[m_gapStart], &m_data[m_gapEnd], pos - m_gapStart);
|
|
||||||
} else {
|
|
||||||
memmove(&m_data[pos + gapLen], &m_data[pos], m_gapStart - pos);
|
|
||||||
}
|
|
||||||
m_gapEnd += pos - m_gapStart;
|
|
||||||
m_gapStart += pos - m_gapStart;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
bool EdnVectorBuf::GapResize(int32_t pos, int32_t newGapLen)
|
|
||||||
{
|
|
||||||
if( pos > Size()
|
|
||||||
|| pos < 0 ) {
|
|
||||||
APPL_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int32_t previousSize = Size();
|
|
||||||
if (newGapLen == GapSize() ) {
|
|
||||||
// nothing to do ...
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
if (newGapLen > GapSize() ) {
|
|
||||||
// reallocation
|
|
||||||
ChangeAllocation( previousSize + newGapLen);
|
|
||||||
}
|
|
||||||
// move Data
|
|
||||||
if (pos <= m_gapStart) {
|
|
||||||
// just move the end of the gap
|
|
||||||
memmove(&m_data[m_gapStart + newGapLen], &m_data[m_gapEnd], previousSize - m_gapStart);
|
|
||||||
// update gap end position
|
|
||||||
m_gapEnd = m_gapStart + newGapLen;
|
|
||||||
if (pos < m_gapStart) {
|
|
||||||
if (false == GapMove(pos)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// no else
|
|
||||||
} else {
|
|
||||||
if (false == GapMove(pos) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
memmove(&m_data[m_gapStart + newGapLen], &m_data[m_gapEnd], previousSize - m_gapStart);
|
|
||||||
}
|
|
||||||
if (newGapLen < GapSize() ) {
|
|
||||||
// rellocation
|
|
||||||
ChangeAllocation(previousSize + newGapLen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// update gap position
|
|
||||||
m_gapStart = pos;
|
|
||||||
m_gapEnd = pos + newGapLen;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::GapCheckMaxSize(void)
|
|
||||||
{
|
|
||||||
if(GapSize() > GAP_SIZE_MAX) {
|
|
||||||
int32_t currentSize = Size();
|
|
||||||
// Change the gap Size
|
|
||||||
if (false == GapResize(m_gapStart, GAP_SIZE_MAX) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// remove deprecated elements at the end of the buffer ...
|
|
||||||
ChangeAllocation(currentSize + GAP_SIZE_MAX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void EdnVectorBuf::Display(void)
|
|
||||||
{
|
|
||||||
APPL_INFO(" Display Buffer : Size="<<Size()<<" m_allocated="<<m_allocated<<" m_gapStart="<<m_gapStart<<" m_gapEnd="<<m_gapEnd);
|
|
||||||
for(int32_t i=0; i<m_allocated; i++) {
|
|
||||||
if (i>= m_gapStart && i< m_gapEnd) {
|
|
||||||
APPL_INFO( "Element " << i << " : GAP");
|
|
||||||
} else {
|
|
||||||
APPL_INFO( "Element " << i << " : " << m_data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void TestEdnVectorBuf(void)
|
|
||||||
{
|
|
||||||
EdnVectorBuf myBufferTmp;
|
|
||||||
int32_t i;
|
|
||||||
|
|
||||||
//invert data
|
|
||||||
for (i=0; i<50; i++) {
|
|
||||||
myBufferTmp.Insert(0, 'a' + i%26);
|
|
||||||
}
|
|
||||||
myBufferTmp.Display();
|
|
||||||
myBufferTmp.Clear();
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
myBufferTmp.Remove(2, 300);
|
|
||||||
/*
|
|
||||||
char plop='a';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='b';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='c';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='d';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='e';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='f';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='g';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='h';
|
|
||||||
myBufferTmp.Insert(0, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
plop='m';
|
|
||||||
|
|
||||||
etk::Vector<int8_t> items;
|
|
||||||
items.PushBack('i');
|
|
||||||
items.PushBack('j');
|
|
||||||
items.PushBack('k');
|
|
||||||
items.PushBack('l');
|
|
||||||
items.PushBack('m');
|
|
||||||
items.PushBack('n');
|
|
||||||
items.PushBack('o');
|
|
||||||
items.PushBack('p');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
myBufferTmp.Insert(3, items);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
plop='7';
|
|
||||||
myBufferTmp.Insert(7, plop);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
myBufferTmp.Replace(8, 'z');
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
items.Clear();
|
|
||||||
items.PushBack('1');
|
|
||||||
items.PushBack('2');
|
|
||||||
items.PushBack('3');
|
|
||||||
myBufferTmp.Replace(10, 4, items);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
|
|
||||||
myBufferTmp.PushBack('a');
|
|
||||||
myBufferTmp.PushBack('a');
|
|
||||||
myBufferTmp.PushBack('a');
|
|
||||||
myBufferTmp.PushBack('a');
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
|
|
||||||
myBufferTmp.PopBack();
|
|
||||||
myBufferTmp.PopBack();
|
|
||||||
myBufferTmp.PopBack();
|
|
||||||
myBufferTmp.PopBack();
|
|
||||||
myBufferTmp.Display();
|
|
||||||
|
|
||||||
myBufferTmp.Remove(2, 3);
|
|
||||||
myBufferTmp.Display();
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,342 +0,0 @@
|
|||||||
/**
|
|
||||||
*******************************************************************************
|
|
||||||
* @file EdnEdnVectorBuf.h
|
|
||||||
* @brief Editeur De N'ours : Basic EdnVectorBuf for direct data insertion (template)
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @date 07/04/2011
|
|
||||||
* @par Project
|
|
||||||
* Edn
|
|
||||||
*
|
|
||||||
* @par Copyright
|
|
||||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY.
|
|
||||||
*
|
|
||||||
* Licence summary :
|
|
||||||
* You can modify and redistribute the sources code and binaries.
|
|
||||||
* You can send me the bug-fix
|
|
||||||
* You can not earn money with this Software (if the source extract from Edn
|
|
||||||
* represent less than 50% of original Sources)
|
|
||||||
* Term of the licence in in the file licence.txt.
|
|
||||||
*
|
|
||||||
*******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EDN_VECTOR_BUF_H__
|
|
||||||
#define __EDN_VECTOR_BUF_H__
|
|
||||||
|
|
||||||
#include <etk/Vector.h>
|
|
||||||
#include <etk/os/FSNode.h>
|
|
||||||
|
|
||||||
#undef __class__
|
|
||||||
#define __class__ "EdnVectorBuf"
|
|
||||||
|
|
||||||
// minimum gapSize when allocated
|
|
||||||
#define GAP_SIZE_MIN (80)
|
|
||||||
// maximum gap that is automaticly resize
|
|
||||||
#define GAP_SIZE_MAX (GAP_SIZE_MIN*4)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
______________________________________________________________________________________
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| <GapStart |
|
|
||||||
| *******************************************************************|
|
|
||||||
|****************************************** |
|
|
||||||
| Gap Stop > |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
|____________________________________________________________________________________|
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief EdnVectorBuf classes ...
|
|
||||||
*/
|
|
||||||
class EdnVectorBuf
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
class Iterator
|
|
||||||
{
|
|
||||||
// Private data :
|
|
||||||
private:
|
|
||||||
int32_t m_current; // curent Id on the vector
|
|
||||||
EdnVectorBuf * m_EdnVectorBuf; // Pointer on the curent element of the vectorBin
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Basic itarator constructor with no link with an EdnVector
|
|
||||||
*/
|
|
||||||
Iterator(void):
|
|
||||||
m_current(-1),
|
|
||||||
m_EdnVectorBuf(NULL)
|
|
||||||
{
|
|
||||||
// nothing to do ...
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Recopy constructor on a specific EdnVector.
|
|
||||||
* @param[in] otherIterator The Iterator that might be copy
|
|
||||||
*/
|
|
||||||
Iterator(const Iterator & otherIterator):
|
|
||||||
m_current(otherIterator.m_current),
|
|
||||||
m_EdnVectorBuf(otherIterator.m_EdnVectorBuf)
|
|
||||||
{
|
|
||||||
// nothing to do ...
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Asignation operator.
|
|
||||||
* @param[in] otherIterator The Iterator that might be copy
|
|
||||||
* @return reference on the curent Iterator
|
|
||||||
*/
|
|
||||||
Iterator& operator=(const Iterator & otherIterator)
|
|
||||||
{
|
|
||||||
m_current = otherIterator.m_current;
|
|
||||||
m_EdnVectorBuf = otherIterator.m_EdnVectorBuf;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Basic destructor
|
|
||||||
*/
|
|
||||||
~Iterator(void)
|
|
||||||
{
|
|
||||||
m_current = -1;
|
|
||||||
m_EdnVectorBuf = NULL;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief gaet element position in the system
|
|
||||||
*/
|
|
||||||
int32_t Position(void)
|
|
||||||
{
|
|
||||||
if(0 > m_current) {
|
|
||||||
return 0;
|
|
||||||
} else if (m_EdnVectorBuf->Size() <= m_current) {
|
|
||||||
return m_EdnVectorBuf->Size();
|
|
||||||
} else {
|
|
||||||
return m_current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief basic boolean cast
|
|
||||||
* @return true if the element is present in the EdnVector size
|
|
||||||
*/
|
|
||||||
operator bool ()
|
|
||||||
{
|
|
||||||
if( 0 <= m_current
|
|
||||||
&& m_current < m_EdnVectorBuf->Size() )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Incremental operator
|
|
||||||
* @return Reference on the current iterator incremented
|
|
||||||
*/
|
|
||||||
Iterator& operator++ ()
|
|
||||||
{
|
|
||||||
if( NULL != m_EdnVectorBuf
|
|
||||||
&& m_current < m_EdnVectorBuf->Size() )
|
|
||||||
{
|
|
||||||
m_current++;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Decremental operator
|
|
||||||
* @return Reference on the current iterator decremented
|
|
||||||
*/
|
|
||||||
Iterator& operator-- ()
|
|
||||||
{
|
|
||||||
if (m_current >= 0) {
|
|
||||||
m_current--;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Incremental operator
|
|
||||||
* @return Reference on a new iterator and increment the other one
|
|
||||||
*/
|
|
||||||
Iterator operator++ (int32_t)
|
|
||||||
{
|
|
||||||
Iterator it(*this);
|
|
||||||
++(*this);
|
|
||||||
return it;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Decremental operator
|
|
||||||
* @return Reference on a new iterator and decrement the other one
|
|
||||||
*/
|
|
||||||
Iterator operator-- (int32_t)
|
|
||||||
{
|
|
||||||
Iterator it(*this);
|
|
||||||
--(*this);
|
|
||||||
return it;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Get reference on the current Element
|
|
||||||
* @return the reference on the current Element
|
|
||||||
*/
|
|
||||||
int8_t & operator-> () const
|
|
||||||
{
|
|
||||||
APPL_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBuf->Size());
|
|
||||||
return m_EdnVectorBuf->Get(m_current);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Get reference on the current Element
|
|
||||||
* @return the reference on the current Element
|
|
||||||
*/
|
|
||||||
int8_t & operator* () const
|
|
||||||
{
|
|
||||||
APPL_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBuf->Size());
|
|
||||||
return m_EdnVectorBuf->Get(m_current);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* @brief
|
|
||||||
*
|
|
||||||
* @param[in,out] ---
|
|
||||||
*
|
|
||||||
* @return ---
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Iterator(EdnVectorBuf * Evb, int32_t pos):
|
|
||||||
m_current(pos),
|
|
||||||
m_EdnVectorBuf(Evb)
|
|
||||||
{
|
|
||||||
// nothing to do ...
|
|
||||||
}
|
|
||||||
friend class EdnVectorBuf;
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
int8_t * m_data; //!< pointer on the curetn table of Data
|
|
||||||
int32_t m_allocated; //!< Current allocated size
|
|
||||||
// empty part of the buffer data
|
|
||||||
int32_t m_gapStart; //!< points to the first character of the gap
|
|
||||||
int32_t m_gapEnd; //!< points to the first char after the gap
|
|
||||||
public:
|
|
||||||
EdnVectorBuf(int32_t count = 0);
|
|
||||||
EdnVectorBuf(const EdnVectorBuf & Evb);
|
|
||||||
~EdnVectorBuf();
|
|
||||||
|
|
||||||
bool DumpIn( etk::FSNode &file);
|
|
||||||
bool DumpFrom( etk::FSNode &file);
|
|
||||||
|
|
||||||
EdnVectorBuf & operator=( const EdnVectorBuf & Evb);
|
|
||||||
int8_t operator[] (int32_t pos);
|
|
||||||
int8_t & Get( int32_t pos);
|
|
||||||
void Get( int32_t pos, int32_t nbElement, etk::Vector<int8_t> &tmpBuffer);
|
|
||||||
// insert functions
|
|
||||||
void PushBack( const int8_t& item);
|
|
||||||
void Insert( int32_t pos, const int8_t& item);
|
|
||||||
void Insert( int32_t pos, etk::Vector<int8_t>& items);
|
|
||||||
// Remove and insert functions
|
|
||||||
void Replace( int32_t pos, const int8_t& item);
|
|
||||||
void Replace( int32_t pos, int32_t nbRemoveElement, etk::Vector<int8_t>& items);
|
|
||||||
// Revove fonctions
|
|
||||||
void Remove( int32_t pos, int32_t nbRemoveElement = 1);
|
|
||||||
void PopBack( void);
|
|
||||||
void Clear( void);
|
|
||||||
|
|
||||||
|
|
||||||
void Fit(void);
|
|
||||||
|
|
||||||
void Display(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get a current element in the vector (iterator system)
|
|
||||||
* @param[in] RealElementPosition Real position in the buffer (only use in the ITERATOR)
|
|
||||||
* @return Reference on the Element
|
|
||||||
*/
|
|
||||||
int8_t & GetDirect(int32_t RealElementPosition){ return m_data[RealElementPosition]; };
|
|
||||||
/**
|
|
||||||
* @brief Get the number of element in the vector
|
|
||||||
* @return The number requested
|
|
||||||
*/
|
|
||||||
int32_t Size(void) { return m_allocated - GapSize(); };
|
|
||||||
|
|
||||||
Iterator Position(int32_t pos)
|
|
||||||
{
|
|
||||||
return Iterator(this, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get an Iterator on the start position of the Vector
|
|
||||||
* @return The Iterator
|
|
||||||
*/
|
|
||||||
Iterator Begin()
|
|
||||||
{
|
|
||||||
return Position(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get an Iterator on the end position of the Vector
|
|
||||||
* @return The Iterator
|
|
||||||
*/
|
|
||||||
Iterator End()
|
|
||||||
{
|
|
||||||
return Position( Size()-1 );
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
// TODO : Set a boolean at the return value to prevent internal error ...
|
|
||||||
void ChangeAllocation( int32_t newSize);
|
|
||||||
bool GapMove( int32_t pos);
|
|
||||||
bool GapResize( int32_t pos, int32_t newGapLen);
|
|
||||||
// get current gap Size
|
|
||||||
int32_t GapSize( void) { return m_gapEnd - m_gapStart; };
|
|
||||||
void GapCheckMaxSize( void);
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef __class__
|
|
||||||
#define __class__ NULL
|
|
||||||
|
|
||||||
void TestEdnVectorBuf(void);
|
|
||||||
|
|
||||||
#endif
|
|
@ -238,7 +238,7 @@ void Highlight::Parse(int32_t start,
|
|||||||
int32_t stop,
|
int32_t stop,
|
||||||
etk::Vector<colorInformation_ts> &metaData,
|
etk::Vector<colorInformation_ts> &metaData,
|
||||||
int32_t addingPos,
|
int32_t addingPos,
|
||||||
EdnVectorBuf &buffer)
|
etk::Buffer &buffer)
|
||||||
{
|
{
|
||||||
if (0 > addingPos) {
|
if (0 > addingPos) {
|
||||||
addingPos = 0;
|
addingPos = 0;
|
||||||
@ -301,7 +301,7 @@ void Highlight::Parse(int32_t start,
|
|||||||
void Highlight::Parse2(int32_t start,
|
void Highlight::Parse2(int32_t start,
|
||||||
int32_t stop,
|
int32_t stop,
|
||||||
etk::Vector<colorInformation_ts> &metaData,
|
etk::Vector<colorInformation_ts> &metaData,
|
||||||
EdnVectorBuf &buffer)
|
etk::Buffer &buffer)
|
||||||
{
|
{
|
||||||
//APPL_DEBUG("Parse element 0 => " << m_listHighlightPass2.size() << " ==> position search: (" << start << "," << stop << ")" );
|
//APPL_DEBUG("Parse element 0 => " << m_listHighlightPass2.size() << " ==> position search: (" << start << "," << stop << ")" );
|
||||||
int32_t elementStart = start;
|
int32_t elementStart = start;
|
||||||
|
@ -45,7 +45,7 @@ extern "C" {
|
|||||||
#include <etk/os/FSNode.h>
|
#include <etk/os/FSNode.h>
|
||||||
#include <HighlightPattern.h>
|
#include <HighlightPattern.h>
|
||||||
#include <Colorize.h>
|
#include <Colorize.h>
|
||||||
#include <EdnVectorBuf.h>
|
#include <etk/Buffer.h>
|
||||||
#include <tinyXML/tinyxml.h>
|
#include <tinyXML/tinyxml.h>
|
||||||
|
|
||||||
class Highlight {
|
class Highlight {
|
||||||
@ -61,14 +61,14 @@ class Highlight {
|
|||||||
int32_t stop,
|
int32_t stop,
|
||||||
etk::Vector<colorInformation_ts> &metaData,
|
etk::Vector<colorInformation_ts> &metaData,
|
||||||
int32_t addingPos,
|
int32_t addingPos,
|
||||||
EdnVectorBuf &buffer);
|
etk::Buffer &buffer);
|
||||||
void Parse2(int32_t start,
|
void Parse2(int32_t start,
|
||||||
int32_t stop,
|
int32_t stop,
|
||||||
etk::Vector<colorInformation_ts> &metaData,
|
etk::Vector<colorInformation_ts> &metaData,
|
||||||
EdnVectorBuf &buffer);
|
etk::Buffer &buffer);
|
||||||
private:
|
private:
|
||||||
void ParseRules(TiXmlNode *child, etk::Vector<HighlightPattern*> &mListPatern, int32_t level);
|
void ParseRules(TiXmlNode *child, etk::Vector<HighlightPattern*> &mListPatern, int32_t level);
|
||||||
etk::UString m_styleName; //!< curent style name (like "c++" or "c" or "script Bash")
|
etk::UString m_styleName; //!< curent style name (like "c++" or "c" or "script Bash")
|
||||||
etk::Vector<etk::UString*> m_listExtentions; //!< List of possible extention for this high-light, like : ".c", ".cpp", ".h"
|
etk::Vector<etk::UString*> m_listExtentions; //!< List of possible extention for this high-light, like : ".c", ".cpp", ".h"
|
||||||
etk::Vector<HighlightPattern*> m_listHighlightPass1; //!< List of ALL hightlight modules (pass 1 ==> when we load and wride data on the buffer)
|
etk::Vector<HighlightPattern*> m_listHighlightPass1; //!< List of ALL hightlight modules (pass 1 ==> when we load and wride data on the buffer)
|
||||||
etk::Vector<HighlightPattern*> m_listHighlightPass2; //!< List of ALL hightlight modules (pass 2 ==> When we display the buffer( only the display area (100 lines)) )
|
etk::Vector<HighlightPattern*> m_listHighlightPass2; //!< List of ALL hightlight modules (pass 2 ==> When we display the buffer( only the display area (100 lines)) )
|
||||||
|
@ -38,8 +38,8 @@ HighlightPattern::HighlightPattern(void)
|
|||||||
m_haveStopPatern = false;
|
m_haveStopPatern = false;
|
||||||
m_multiline = false;
|
m_multiline = false;
|
||||||
m_color = ColorizeManager::Get("normal");
|
m_color = ColorizeManager::Get("normal");
|
||||||
m_regExpStart = new etk::RegExp<EdnVectorBuf>();
|
m_regExpStart = new etk::RegExp<etk::Buffer>();
|
||||||
m_regExpStop = new etk::RegExp<EdnVectorBuf>();
|
m_regExpStop = new etk::RegExp<etk::Buffer>();
|
||||||
m_escapeChar = 0;
|
m_escapeChar = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ void HighlightPattern::ParseRules(TiXmlNode *child, int32_t level)
|
|||||||
* @return HLP_FIND_OK_NO_END Xe find a partial pattern (missing end)
|
* @return HLP_FIND_OK_NO_END Xe find a partial pattern (missing end)
|
||||||
* @return HLP_FIND_ERROR Not find the pattern
|
* @return HLP_FIND_ERROR Not find the pattern
|
||||||
*/
|
*/
|
||||||
resultFind_te HighlightPattern::Find(int32_t start, int32_t stop, colorInformation_ts &resultat, EdnVectorBuf &buffer)
|
resultFind_te HighlightPattern::Find(int32_t start, int32_t stop, colorInformation_ts &resultat, etk::Buffer &buffer)
|
||||||
{
|
{
|
||||||
//APPL_DEBUG(" try to find the element");
|
//APPL_DEBUG(" try to find the element");
|
||||||
resultat.beginStart = -1;
|
resultat.beginStart = -1;
|
||||||
|
@ -35,7 +35,7 @@ class HighlightPattern;
|
|||||||
#include <Colorize.h>
|
#include <Colorize.h>
|
||||||
#include <etk/Vector.h>
|
#include <etk/Vector.h>
|
||||||
#include <tinyXML/tinyxml.h>
|
#include <tinyXML/tinyxml.h>
|
||||||
#include <EdnVectorBuf.h>
|
#include <etk/Buffer.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HLP_FIND_ERROR,
|
HLP_FIND_ERROR,
|
||||||
@ -65,7 +65,7 @@ class HighlightPattern {
|
|||||||
|
|
||||||
bool IsEnable(void);
|
bool IsEnable(void);
|
||||||
void Display(void);
|
void Display(void);
|
||||||
resultFind_te Find(int32_t start, int32_t stop, colorInformation_ts &resultat, EdnVectorBuf &buffer);
|
resultFind_te Find(int32_t start, int32_t stop, colorInformation_ts &resultat, etk::Buffer &buffer);
|
||||||
Colorize * GetColor(void) { return m_color; };
|
Colorize * GetColor(void) { return m_color; };
|
||||||
void ParseRules(TiXmlNode *child, int32_t level);
|
void ParseRules(TiXmlNode *child, int32_t level);
|
||||||
|
|
||||||
@ -76,13 +76,13 @@ class HighlightPattern {
|
|||||||
etk::UString m_paternName; //!< Current style name (like "c++" or "c" or "script Bash")
|
etk::UString m_paternName; //!< Current style name (like "c++" or "c" or "script Bash")
|
||||||
etk::UString m_colorName; //!< Current color name
|
etk::UString m_colorName; //!< Current color name
|
||||||
Colorize * m_color; //!< Link to the color manager
|
Colorize * m_color; //!< Link to the color manager
|
||||||
etk::RegExp<EdnVectorBuf> * m_regExpStart; //!< Start of Regular expression
|
etk::RegExp<etk::Buffer> * m_regExpStart; //!< Start of Regular expression
|
||||||
etk::RegExp<EdnVectorBuf> * m_regExpStop; //!< Stop of Regular Expression
|
etk::RegExp<etk::Buffer> * m_regExpStop; //!< Stop of Regular Expression
|
||||||
bool m_haveStopPatern; //!< Stop patern presence
|
bool m_haveStopPatern; //!< Stop patern presence
|
||||||
bool m_multiline; //!< The patern is multiline
|
bool m_multiline; //!< The patern is multiline
|
||||||
uniChar_t m_escapeChar; //!< Escape char to prevent exeit of patern ....
|
uniChar_t m_escapeChar; //!< Escape char to prevent exeit of patern ....
|
||||||
etk::Vector<HighlightPattern *> m_subPatern; //!< Under patern of this one
|
etk::Vector<HighlightPattern *> m_subPatern; //!< Under patern of this one
|
||||||
// etk::Vector<HighlightPattern *> m_subColor; //!< Under Color in the start RegExp ...
|
// etk::Vector<HighlightPattern *> m_subColor; //!< Under Color in the start RegExp ...
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,8 +23,7 @@ FILE_LIST+= appl/Gui/BufferView.cpp \
|
|||||||
appl/Gui/TagFileList.cpp
|
appl/Gui/TagFileList.cpp
|
||||||
|
|
||||||
# All needed for the buffer management :
|
# All needed for the buffer management :
|
||||||
FILE_LIST+= appl/Buffer/EdnVectorBuf.cpp \
|
FILE_LIST+= appl/Buffer/EdnBuf/EdnBuf.cpp \
|
||||||
appl/Buffer/EdnBuf/EdnBuf.cpp \
|
|
||||||
appl/Buffer/EdnBuf/EdnBuf_HighLight.cpp \
|
appl/Buffer/EdnBuf/EdnBuf_HighLight.cpp \
|
||||||
appl/Buffer/EdnBuf/EdnBuf_History.cpp \
|
appl/Buffer/EdnBuf/EdnBuf_History.cpp \
|
||||||
appl/Buffer/EdnBuf/EdnBuf_Selection.cpp \
|
appl/Buffer/EdnBuf/EdnBuf_Selection.cpp \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user