/* Buffer Management Class v0.1 Date: 27/Jan/2011 Coded by: Alberto "Quequero" Pelliccione E-mail: quequero@hackingteam.it */ #include "Buffer.h" Buffer::Buffer() : p(0), p_size(0), p_pos(0), p_mark(0) { } Buffer::Buffer(unsigned int u_size) : p(0), p_size(0), p_pos(0), p_mark(0) { if (p || u_size == 0) return; p = new(std::nothrow) unsigned char[u_size]; if (p) p_size = u_size; zero(); } Buffer::Buffer(unsigned char *b, unsigned int u_size) : p(0), p_size(0), p_pos(0), p_mark(0) { if (p || b == 0 || u_size == 0) return; p = new(std::nothrow) unsigned char[u_size]; if (p) p_size = u_size; for (unsigned int i = 0; i < u_size; i++) p[i] = b[i]; } Buffer::~Buffer() { if (!p) return; zero(); delete[] p; } bool Buffer::setSize(unsigned int u_size) { if (p) delete[] p; p = new(std::nothrow) unsigned char[u_size]; if (p) return true; return false; } bool Buffer::setPos(unsigned int u_pos) { if (u_pos > p_size) return false; p_pos = u_pos; return true; } unsigned int Buffer::getSize() { return p_size; } unsigned int Buffer::getPos() { return p_pos; } bool Buffer::ok() { if (p_size) return true; return false; } void Buffer::free() { if (p_size == 0) return; zero(); delete[] p; p_size = p_pos = p_mark = 0; p = 0; } void Buffer::zero() { if (p_size == 0) return; for (unsigned i = 0; i < p_size; i++) p[i] = 0; } bool Buffer::append(unsigned char *s, unsigned int u_len) { if (p_pos + u_len <= p_size) { memcpy(p + p_pos, s, u_len); p_pos += u_len; return true; } unsigned int i, j; unsigned char *t = new(std::nothrow) unsigned char[p_pos + u_len]; if (t == 0) return false; for (i = 0; i < p_pos + u_len; i++) t[i] = 0; // new size p_size = p_pos + u_len; for (i = 0; i < p_pos; i++) t[i] = p[i]; // append for (i = p_pos, j = 0; j < u_len; i++, j++) t[i] = s[j]; delete[] p; p = t; p_pos += u_len; return true; } bool Buffer::repeat(unsigned char c, unsigned int times) { unsigned int i, j; if (p_pos + times <= p_size) { for (i = p_pos; i < p_pos + times; i++) p[i] = c; p_pos += times; return true; } unsigned char *t = new(std::nothrow) unsigned char[p_pos + times]; if (t == 0) return false; for (i = 0; i < p_pos + times; i++) t[i] = 0; // new size p_size = p_pos + times; for (i = 0; i < p_pos; i++) t[i] = p[i]; // append for (i = p_pos, j = 0; j < times; i++, j++) t[i] = c; delete[] p; p = t; p_pos += times; return true; } bool Buffer::mark(unsigned int m) { if (m > p_pos) return false; p_mark = m; return true; } void Buffer::mark() { p_mark = p_pos; } unsigned int Buffer::getMark() { return p_mark; } void Buffer::clear() { p_mark = 0; } void Buffer::end() { p_pos = p_size; } void Buffer::begin() { p_pos = 0; } const unsigned char* Buffer::getBuf() { return p; } const unsigned char* Buffer::getCurBuf() { return p + p_pos; } unsigned int Buffer::getInt() { if (p_pos > p_size - sizeof(int)) return 0; unsigned int val; memcpy(&val, &p[p_pos], sizeof(unsigned int)); p_pos += sizeof(int); return val; } bool Buffer::read(unsigned char *b, unsigned int u_len) { if (p_pos + u_len > p_size) return false; for (unsigned int i = 0; i < u_len; i++) b[i] = p[p_pos + i]; p_pos += u_len; return true; } const unsigned char* Buffer::read(unsigned int i) { if (i > p_size) return 0; return p + i; } const unsigned char* Buffer::getMarkBuf() { return p + p_mark; } void Buffer::reset() { p_pos = 0; } .