|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2004 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 |
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include "qgstring.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <assert.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define BLOCK_SIZE 64
|
|
Packit |
1c1d7e |
#define ROUND_SIZE(x) ((x)+BLOCK_SIZE-1)&~(BLOCK_SIZE-1)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define DBG_STR(x) do { } while(0)
|
|
Packit |
1c1d7e |
//#define DBG_STR(x) printf x
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString::QGString() // make null string
|
|
Packit |
1c1d7e |
: m_data(0), m_len(0), m_memSize(0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::QGString() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString::QGString(uint size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (size==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data=0;
|
|
Packit |
1c1d7e |
m_len=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_memSize = ROUND_SIZE(size+1);
|
|
Packit |
1c1d7e |
m_data = (char*)malloc(m_memSize);
|
|
Packit |
1c1d7e |
memset(m_data,' ',size);
|
|
Packit |
1c1d7e |
m_data[size]='\0';
|
|
Packit |
1c1d7e |
m_len=size;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::QGString(uint size=%d) %d:%s\n",
|
|
Packit |
1c1d7e |
this,size,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString::QGString( const QGString &s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (s.m_memSize==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = 0;
|
|
Packit |
1c1d7e |
m_len = 0;
|
|
Packit |
1c1d7e |
m_memSize = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = (char *)malloc(s.m_memSize);
|
|
Packit |
1c1d7e |
m_len = s.m_len;
|
|
Packit |
1c1d7e |
m_memSize = s.m_memSize;
|
|
Packit |
1c1d7e |
qstrcpy(m_data,s.m_data);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::QGString(const QGString &) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString::QGString( const char *str )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (str==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data=0;
|
|
Packit |
1c1d7e |
m_len=0;
|
|
Packit |
1c1d7e |
m_memSize=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_len = qstrlen(str);
|
|
Packit |
1c1d7e |
m_memSize = ROUND_SIZE(m_len+1);
|
|
Packit |
1c1d7e |
assert(m_memSize>=m_len+1);
|
|
Packit |
1c1d7e |
m_data = (char *)malloc(m_memSize);
|
|
Packit |
1c1d7e |
qstrcpy(m_data,str);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::QGString(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString::~QGString()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
free(m_data);
|
|
Packit |
1c1d7e |
m_data=0;
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::~QGString() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGString::resize( uint newlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_len = 0;
|
|
Packit |
1c1d7e |
if (newlen==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_data) { free(m_data); m_data=0; }
|
|
Packit |
1c1d7e |
m_memSize=0;
|
|
Packit |
1c1d7e |
DBG_STR(("%p: 1.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_memSize = ROUND_SIZE(newlen+1);
|
|
Packit |
1c1d7e |
assert(m_memSize>=newlen+1);
|
|
Packit |
1c1d7e |
if (m_data==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = (char *)malloc(m_memSize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = (char *)realloc(m_data,m_memSize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_data==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_STR(("%p: 2.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_data[newlen]='\0';
|
|
Packit |
1c1d7e |
m_len = qstrlen(m_data);
|
|
Packit |
1c1d7e |
DBG_STR(("%p: 3.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGString::enlarge( uint newlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (newlen==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_data) { free(m_data); m_data=0; }
|
|
Packit |
1c1d7e |
m_memSize=0;
|
|
Packit |
1c1d7e |
m_len=0;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
uint newMemSize = ROUND_SIZE(newlen+1);
|
|
Packit |
1c1d7e |
if (newMemSize==m_memSize) return TRUE;
|
|
Packit |
1c1d7e |
m_memSize = newMemSize;
|
|
Packit |
1c1d7e |
if (m_data==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = (char *)malloc(m_memSize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = (char *)realloc(m_data,m_memSize);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (m_data==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_data[newlen-1]='\0';
|
|
Packit |
1c1d7e |
if (m_len>newlen) m_len=newlen;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGString::setLen( uint newlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_len = newlen<=m_memSize ? newlen : m_memSize;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString &QGString::operator=( const QGString &s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_data) free(m_data);
|
|
Packit |
1c1d7e |
if (s.m_memSize==0) // null string
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = 0;
|
|
Packit |
1c1d7e |
m_len = 0;
|
|
Packit |
1c1d7e |
m_memSize = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_len = s.m_len;
|
|
Packit |
1c1d7e |
m_memSize = s.m_memSize;
|
|
Packit |
1c1d7e |
m_data = (char*)malloc(m_memSize);
|
|
Packit |
1c1d7e |
qstrcpy(m_data,s.m_data);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::operator=(const QGString &%p) %d:%s\n",
|
|
Packit |
1c1d7e |
this,&s,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString &QGString::operator=( const char *str )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_data) free(m_data);
|
|
Packit |
1c1d7e |
if (str==0) // null string
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = 0;
|
|
Packit |
1c1d7e |
m_len = 0;
|
|
Packit |
1c1d7e |
m_memSize = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_len = qstrlen(str);
|
|
Packit |
1c1d7e |
m_memSize = ROUND_SIZE(m_len+1);
|
|
Packit |
1c1d7e |
assert(m_memSize>=m_len+1);
|
|
Packit |
1c1d7e |
m_data = (char*)malloc(m_memSize);
|
|
Packit |
1c1d7e |
qstrcpy(m_data,str);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::operator=(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString &QGString::operator+=( const QGString &s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (s.m_memSize==0) return *this;
|
|
Packit |
1c1d7e |
uint len1 = length();
|
|
Packit |
1c1d7e |
uint len2 = s.length();
|
|
Packit |
1c1d7e |
uint memSize = ROUND_SIZE(len1 + len2 + 1);
|
|
Packit |
1c1d7e |
assert(memSize>=len1+len2+1);
|
|
Packit |
1c1d7e |
char *newData = memSize!=m_memSize ? (char*)realloc( m_data, memSize ) : m_data;
|
|
Packit |
1c1d7e |
m_memSize = memSize;
|
|
Packit |
1c1d7e |
if (newData)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = newData;
|
|
Packit |
1c1d7e |
memcpy( m_data + len1, s, len2 + 1 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_len = len1+len2;
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::operator+=(const QGString &) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString &QGString::operator+=( const char *str )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!str) return *this;
|
|
Packit |
1c1d7e |
uint len1 = length();
|
|
Packit |
1c1d7e |
uint len2 = qstrlen(str);
|
|
Packit |
1c1d7e |
uint memSize = ROUND_SIZE(len1 + len2 + 1);
|
|
Packit |
1c1d7e |
assert(memSize>=len1+len2+1);
|
|
Packit |
1c1d7e |
char *newData = memSize!=m_memSize ? (char *)realloc( m_data, memSize ) : m_data;
|
|
Packit |
1c1d7e |
m_memSize = memSize;
|
|
Packit |
1c1d7e |
if (newData)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = newData;
|
|
Packit |
1c1d7e |
memcpy( m_data + len1, str, len2 + 1 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_len+=len2;
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::operator+=(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGString &QGString::operator+=( char c )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
uint len = m_len;
|
|
Packit |
1c1d7e |
uint memSize = ROUND_SIZE(len+2);
|
|
Packit |
1c1d7e |
assert(memSize>=len+2);
|
|
Packit |
1c1d7e |
char *newData = memSize!=m_memSize ? (char *)realloc( m_data, memSize ) : m_data;
|
|
Packit |
1c1d7e |
m_memSize = memSize;
|
|
Packit |
1c1d7e |
if (newData)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_data = newData;
|
|
Packit |
1c1d7e |
m_data[len] = c;
|
|
Packit |
1c1d7e |
m_data[len+1] = '\0';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_len++;
|
|
Packit |
1c1d7e |
DBG_STR(("%p: QGString::operator+=(char s) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|