|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
#ifndef _BUFSTR_H
|
|
Packit |
1c1d7e |
#define _BUFSTR_H
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qglobal.h>
|
|
Packit |
1c1d7e |
#include <qcstring.h>
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! @brief Buffer used to store strings
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* This buffer is used append characters and strings. It will automatically
|
|
Packit |
1c1d7e |
* resize itself, yet provide efficient random access to the content.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
class BufStr
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
BufStr(int size)
|
|
Packit |
1c1d7e |
: m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_buf = (char *)calloc(size,1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
~BufStr()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
free(m_buf);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void addChar(char c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
makeRoomFor(1);
|
|
Packit |
1c1d7e |
m_buf[m_writeOffset++]=c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void addArray(const char *a,int len)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
makeRoomFor(len);
|
|
Packit |
1c1d7e |
memcpy(m_buf+m_writeOffset,a,len);
|
|
Packit |
1c1d7e |
m_writeOffset+=len;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void skip(uint s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
makeRoomFor(s);
|
|
Packit |
1c1d7e |
m_writeOffset+=s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void shrink( uint newlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_writeOffset=newlen;
|
|
Packit |
1c1d7e |
resize(newlen);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void resize( uint newlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
uint oldsize = m_size;
|
|
Packit |
1c1d7e |
m_size=newlen;
|
|
Packit |
1c1d7e |
if (m_writeOffset>=m_size) // offset out of range -> enlarge
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_size=m_writeOffset+m_spareRoom;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_buf = (char *)realloc(m_buf,m_size);
|
|
Packit |
1c1d7e |
if (m_size>oldsize)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
memset(m_buf+oldsize,0,m_size-oldsize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int size() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_size;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
char *data() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_buf;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
char &at(uint i) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_buf[i];
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bool isEmpty() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_writeOffset==0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
operator const char *() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_buf;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
uint curPos() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_writeOffset;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void dropFromStart(uint bytes)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (bytes>m_size) bytes=m_size;
|
|
Packit |
1c1d7e |
if (bytes>0) qmemmove(m_buf,m_buf+bytes,m_size-bytes);
|
|
Packit |
1c1d7e |
m_size-=bytes;
|
|
Packit |
1c1d7e |
m_writeOffset-=bytes;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
void makeRoomFor(uint size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_writeOffset+size>=m_size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
resize(m_size+size+m_spareRoom);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
uint m_size;
|
|
Packit |
1c1d7e |
uint m_writeOffset;
|
|
Packit |
1c1d7e |
const int m_spareRoom; // 10Kb extra room to avoid frequent resizing
|
|
Packit |
1c1d7e |
char *m_buf;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#endif
|