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); } }
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; }