⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memzone.cpp

📁 可移植的xml库。已经在windows和linux上测试通过。只使用C++ Runtine
💻 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 + -