📄 memzone.cpp
字号:
//memzone.cpp
#include "xml.h"
CMemZone::CMemZone()
{
init();
}
CMemZone::~CMemZone()
{
clean();
}
void CMemZone::clean()
{
if(m_buf)
{
free(m_buf);
m_buf = 0;
m_used = m_total = 0;
}
}
int CMemZone::grow(unsigned g)
{
++g;
if(!g) return 0;
if(m_total-m_used<g)
{
g -= m_total - m_used;
if(m_limit && m_total+g>m_limit) return E_BEYOND_LIMIT;
g += m_total;
char *p = (char *)realloc(m_buf,g);
if(!p) return E_OUTOF_MEMORY;
m_buf = p;
m_total = g;
}
return 0;
}
int CMemZone::growTo(unsigned to)
{
++to;
if(!to) return 0;
if(m_total>m_limit) return E_BEYOND_LIMIT;
if(m_total<to)
{
to -= m_total;
char *p = (char *)realloc(m_buf,to);
if(!p) return E_OUTOF_MEMORY;
m_buf = p;
m_total = to;
}
return 0;
}
int CMemZone::append(const char *p,unsigned bytes)
{
assert(p);
if(!bytes)
{
bytes = strlen(p);
if(!bytes) return 0;
}
int e = grow(bytes);
if(e) return e;
memcpy(m_buf+m_used,p,bytes);
m_used += bytes;
return 0;
}
int CMemZone::preppend(const char *p,unsigned bytes)
{
assert(p);
if(!bytes)
{
bytes = strlen(p);
if(!bytes) return 0;
}
int e = grow(bytes);
if(e) return e;
if(m_used) memmove(m_buf+bytes,m_buf,m_used);
memcpy(m_buf,p,bytes);
m_used += bytes;
return 0;
}
int CMemZone::insert(unsigned idx,const char *p,unsigned bytes,bool behind)
{
assert(idx<m_used);
if(idx==m_used-1 && behind) return append(p,bytes);
else if(!idx && !behind) return preppend(p,bytes);
assert(p);
if(!bytes)
{
bytes = strlen(p);
if(!bytes) return 0;
}
int e = grow(bytes);
if(e) return e;
if(!behind) --idx;
if(m_used) memmove(m_buf+idx+bytes,m_buf+idx,m_used-idx);
memcpy(m_buf+idx,p,bytes);
m_used += bytes;
return 0;
}
void CMemZone::trimLeft(unsigned n)
{
assert(n<=m_used);
m_used -= n;
if(m_used) memmove(m_buf,m_buf+n,m_used);
}
void CMemZone::trimRight(unsigned n)
{
assert(n<=m_used);
m_used -= n;
}
void CMemZone::trimMiddle(unsigned start,unsigned n)
{
assert(start<m_used && start+n<=m_used);
if(start==0) trimLeft(n);
else if(start+n==m_used) trimRight(n);
else
{
memmove(m_buf+start,m_buf+start+n,m_used-start);
m_used -= n;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -