char* fbtPtrCopy(const char* old, int len)
{
	char* ret = new char [len + 1];
	fbtMemcpy(ret, old, len);
	ret [len] = 0;
	return ret;
}
void fbtMemoryStream::open(const void* buffer, FBTsize size, fbtStream::StreamMode mode)
{
	if (buffer && size > 0 && size != FBT_NPOS)
	{
		m_mode = mode;
		m_size = size;
		m_pos  = 0;
		fbtMemcpy(m_buffer, buffer, m_size);
	}
}
Esempio n. 3
0
fbtBinTables* fbtBuilder::write(void)
{
	fbtMemoryStream ms;
	ms.open(fbtStream::SM_WRITE);
	m_writeMode = -1;

	writeStream(&ms);

	void* buffer = fbtMalloc(ms.size() + 1);
	fbtMemcpy(buffer, ms.ptr(), ms.size());

	return new fbtBinTables(buffer, ms.size());
}
FBTsize fbtMemoryStream::read(void* dest, FBTsize nr) const
{
	if (m_mode == fbtStream::SM_WRITE) return -1;
	if (m_pos > m_size) return 0;
	if (!dest || !m_buffer) return 0;

	if ((m_size - m_pos) < nr) nr = m_size - m_pos;

	char* cp = (char*)dest;
	char* op = (char*)&m_buffer[m_pos];
	fbtMemcpy(cp, op, nr);
	m_pos += nr;
	return nr;
}
void fbtMemoryStream::reserve(FBTsize nr)
{
	if (m_capacity < nr)
	{
		char* buf = new char[nr + 1];
		if (m_buffer != 0)
		{
			fbtMemcpy(buf, m_buffer, m_size);
			delete [] m_buffer;
		}

		m_buffer = buf;
		m_buffer[m_size] = 0;
		m_capacity = nr;
	}
}
FBTsize fbtMemoryStream::write(const void* src, FBTsize nr)
{
	if (m_mode == fbtStream::SM_READ || !src)
		return -1;

	if (m_pos > m_size) return 0;

	if (m_buffer == 0)
		reserve(m_pos + (nr));
	else if (m_pos + nr > m_capacity)
		reserve(m_pos + (nr > 65535 ? nr : nr + 65535));

	char* cp = &m_buffer[m_pos];
	fbtMemcpy(cp, (char*)src, nr);

	m_pos   += nr;
	m_size  += nr;
	return nr;
}