From bd48f19dd8931c871c9b79371ff68cf87d2ccc11 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Mon, 28 Jun 1999 23:51:15 +0000 Subject: Optimization for speed. --- lib/bufferstore.cc | 158 +++++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 77 deletions(-) (limited to 'lib/bufferstore.cc') diff --git a/lib/bufferstore.cc b/lib/bufferstore.cc index 8138ad2..886b952 100644 --- a/lib/bufferstore.cc +++ b/lib/bufferstore.cc @@ -26,141 +26,145 @@ #include "bufferstore.h" bufferStore::bufferStore() { - lenAllocd = 0; - buff = NULL; - len = 0; - start = 0; + lenAllocd = 0; + buff = NULL; + len = 0; + start = 0; } bufferStore::bufferStore(const bufferStore &a) { - lenAllocd = (a.getLen() > MIN_LEN) ? a.getLen() : MIN_LEN; - buff = new unsigned char [lenAllocd]; - len = a.getLen(); - for (long i=0; i MIN_LEN) ? a.getLen() : MIN_LEN; + buff = new unsigned char [lenAllocd]; + len = a.getLen(); + memcpy(buff, a.getString(0), len); + start = 0; } bufferStore::bufferStore(const unsigned char*_buff, long _len) { - lenAllocd = (_len > MIN_LEN) ? _len : MIN_LEN; - buff = new unsigned char [lenAllocd]; - len = _len; - for (long i=0; i MIN_LEN) ? _len : MIN_LEN; + buff = new unsigned char [lenAllocd]; + len = _len; + memcpy(buff, _buff, len); + start = 0; } void bufferStore::operator =(const bufferStore &a) { - checkAllocd(a.getLen()); - len = a.getLen(); - for (long i=0; i len) return 0; - return len - start; + return (start > len) ? 0 : len - start; } unsigned char bufferStore::getByte(long pos) const { - return buff[pos+start]; + return buff[pos+start]; } unsigned int bufferStore::getWord(long pos) const { - return buff[pos+start] + (buff[pos+start+1] << 8); + return buff[pos+start] + (buff[pos+start+1] << 8); } unsigned int bufferStore::getDWord(long pos) const { - return buff[pos+start] + - (buff[pos+start+1] << 8) + - (buff[pos+start+2] << 16) + - (buff[pos+start+3] << 24); + return buff[pos+start] + + (buff[pos+start+1] << 8) + + (buff[pos+start+2] << 16) + + (buff[pos+start+3] << 24); } const char* bufferStore::getString(long pos) const { - return (const char*)buff+pos+start; + return (const char*)buff+pos+start; } ostream &operator<<(ostream &s, const bufferStore &m) { - { - for (int i = m.start; i < m.len; i++) - s << hex << setw(2) << setfill('0') << (int)m.buff[i] << " "; - } - s << "("; - { - for (int i = m.start; i < m.len; i++) { - unsigned char c = m.buff[i]; - if (c>=' ' && c <= 'z') s << c; - } - } - s<< ")"; - return s; + { + for (int i = m.start; i < m.len; i++) + s << hex << setw(2) << setfill('0') << (int)m.buff[i] << " "; + } + s << "("; + { + for (int i = m.start; i < m.len; i++) { + unsigned char c = m.buff[i]; + if (c>=' ' && c <= 'z') s << c; + } + } + s<< ")"; + return s; } void bufferStore::discardFirstBytes(int n) { - start += n; - if (start > len) start = len; + start += n; + if (start > len) start = len; } void bufferStore::checkAllocd(long newLen) { - if (newLen >= lenAllocd) { - do { - if (lenAllocd < MIN_LEN) - lenAllocd = MIN_LEN; - else - lenAllocd *= 2; - } while (newLen >= lenAllocd); - unsigned char* newBuff = new unsigned char [lenAllocd]; - for (int i=start; i= lenAllocd) { + do { + lenAllocd = (lenAllocd < MIN_LEN)?MIN_LEN:(lenAllocd*2); + } while (newLen >= lenAllocd); + unsigned char* newBuff = new unsigned char [lenAllocd]; + memcpy(&newBuff[start], &buff[start], len - start); + delete [] buff; + buff = newBuff; + } } void bufferStore::addByte(unsigned char cc) { - checkAllocd(len + 1); - buff[len++] = cc; + checkAllocd(len + 1); + buff[len++] = cc; } void bufferStore::addString(const char* s) { - checkAllocd(len + strlen(s)); - for (int i=0; s[i]; i++) buff[len++] = s[i]; + int l = strlen(s); + checkAllocd(len + l); + memcpy(&buff[len], s, l); + len += l; } void bufferStore::addStringT(const char* s) { - addString(s); - addByte(0); + addString(s); + addByte(0); } void bufferStore::addBuff(const bufferStore &s, long maxLen) { - checkAllocd(len + s.getLen()); - for (unsigned long i=0; i < s.getLen() && (maxLen < 0 || i < (unsigned long)maxLen); i++) buff[len++] = s.getByte(i); + long l = s.getLen(); + checkAllocd(len + l); + if ((maxLen >= 0) && (maxLen < l)) + l = maxLen; + if (l > 0) { + memcpy(&buff[len], s.getString(0), l); + len += l; + } } void bufferStore::addWord(int a) { - checkAllocd(len + 2); - buff[len++] = a & 0xff; - buff[len++] = (a>>8) & 0xff; + checkAllocd(len + 2); + buff[len++] = a & 0xff; + buff[len++] = (a>>8) & 0xff; } void bufferStore::addDWord(long a) { - checkAllocd(len + 4); - buff[len++] = a & 0xff; - buff[len++] = (a>>8) & 0xff; - buff[len++] = (a>>16) & 0xff; - buff[len++] = (a>>24) & 0xff; + checkAllocd(len + 4); + buff[len++] = a & 0xff; + buff[len++] = (a>>8) & 0xff; + buff[len++] = (a>>16) & 0xff; + buff[len++] = (a>>24) & 0xff; } -- cgit v1.2.3