1*f6dc9357SAndroid Build Coastguard Worker // Common/DynLimBuf.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "DynLimBuf.h" 6*f6dc9357SAndroid Build Coastguard Worker #include "MyString.h" 7*f6dc9357SAndroid Build Coastguard Worker CDynLimBuf(size_t limit)8*f6dc9357SAndroid Build Coastguard WorkerCDynLimBuf::CDynLimBuf(size_t limit) throw() 9*f6dc9357SAndroid Build Coastguard Worker { 10*f6dc9357SAndroid Build Coastguard Worker _chars = NULL; 11*f6dc9357SAndroid Build Coastguard Worker _pos = 0; 12*f6dc9357SAndroid Build Coastguard Worker _size = 0; 13*f6dc9357SAndroid Build Coastguard Worker _sizeLimit = limit; 14*f6dc9357SAndroid Build Coastguard Worker _error = true; 15*f6dc9357SAndroid Build Coastguard Worker unsigned size = 1 << 4; 16*f6dc9357SAndroid Build Coastguard Worker if (size > limit) 17*f6dc9357SAndroid Build Coastguard Worker size = (unsigned)limit; 18*f6dc9357SAndroid Build Coastguard Worker _chars = (Byte *)MyAlloc(size); 19*f6dc9357SAndroid Build Coastguard Worker if (_chars) 20*f6dc9357SAndroid Build Coastguard Worker { 21*f6dc9357SAndroid Build Coastguard Worker _size = size; 22*f6dc9357SAndroid Build Coastguard Worker _error = false; 23*f6dc9357SAndroid Build Coastguard Worker } 24*f6dc9357SAndroid Build Coastguard Worker } 25*f6dc9357SAndroid Build Coastguard Worker operator +=(char c)26*f6dc9357SAndroid Build Coastguard WorkerCDynLimBuf & CDynLimBuf::operator+=(char c) throw() 27*f6dc9357SAndroid Build Coastguard Worker { 28*f6dc9357SAndroid Build Coastguard Worker if (_error) 29*f6dc9357SAndroid Build Coastguard Worker return *this; 30*f6dc9357SAndroid Build Coastguard Worker if (_size == _pos) 31*f6dc9357SAndroid Build Coastguard Worker { 32*f6dc9357SAndroid Build Coastguard Worker size_t n = _sizeLimit - _size; 33*f6dc9357SAndroid Build Coastguard Worker if (n == 0) 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker _error = true; 36*f6dc9357SAndroid Build Coastguard Worker return *this; 37*f6dc9357SAndroid Build Coastguard Worker } 38*f6dc9357SAndroid Build Coastguard Worker if (n > _size) 39*f6dc9357SAndroid Build Coastguard Worker n = _size; 40*f6dc9357SAndroid Build Coastguard Worker 41*f6dc9357SAndroid Build Coastguard Worker n += _pos; 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker Byte *newBuf = (Byte *)MyAlloc(n); 44*f6dc9357SAndroid Build Coastguard Worker if (!newBuf) 45*f6dc9357SAndroid Build Coastguard Worker { 46*f6dc9357SAndroid Build Coastguard Worker _error = true; 47*f6dc9357SAndroid Build Coastguard Worker return *this; 48*f6dc9357SAndroid Build Coastguard Worker } 49*f6dc9357SAndroid Build Coastguard Worker memcpy(newBuf, _chars, _pos); 50*f6dc9357SAndroid Build Coastguard Worker MyFree(_chars); 51*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf; 52*f6dc9357SAndroid Build Coastguard Worker _size = n; 53*f6dc9357SAndroid Build Coastguard Worker } 54*f6dc9357SAndroid Build Coastguard Worker _chars[_pos++] = (Byte)c; 55*f6dc9357SAndroid Build Coastguard Worker return *this; 56*f6dc9357SAndroid Build Coastguard Worker } 57*f6dc9357SAndroid Build Coastguard Worker operator +=(const char * s)58*f6dc9357SAndroid Build Coastguard WorkerCDynLimBuf &CDynLimBuf::operator+=(const char *s) throw() 59*f6dc9357SAndroid Build Coastguard Worker { 60*f6dc9357SAndroid Build Coastguard Worker if (_error) 61*f6dc9357SAndroid Build Coastguard Worker return *this; 62*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(s); 63*f6dc9357SAndroid Build Coastguard Worker size_t rem = _sizeLimit - _pos; 64*f6dc9357SAndroid Build Coastguard Worker if (rem < len) 65*f6dc9357SAndroid Build Coastguard Worker { 66*f6dc9357SAndroid Build Coastguard Worker len = (unsigned)rem; 67*f6dc9357SAndroid Build Coastguard Worker _error = true; 68*f6dc9357SAndroid Build Coastguard Worker } 69*f6dc9357SAndroid Build Coastguard Worker if (_size - _pos < len) 70*f6dc9357SAndroid Build Coastguard Worker { 71*f6dc9357SAndroid Build Coastguard Worker size_t n = _pos + len; 72*f6dc9357SAndroid Build Coastguard Worker if (n - _size < _size) 73*f6dc9357SAndroid Build Coastguard Worker { 74*f6dc9357SAndroid Build Coastguard Worker n = _sizeLimit; 75*f6dc9357SAndroid Build Coastguard Worker if (n - _size > _size) 76*f6dc9357SAndroid Build Coastguard Worker n = _size * 2; 77*f6dc9357SAndroid Build Coastguard Worker } 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker Byte *newBuf = (Byte *)MyAlloc(n); 80*f6dc9357SAndroid Build Coastguard Worker if (!newBuf) 81*f6dc9357SAndroid Build Coastguard Worker { 82*f6dc9357SAndroid Build Coastguard Worker _error = true; 83*f6dc9357SAndroid Build Coastguard Worker return *this; 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker memcpy(newBuf, _chars, _pos); 86*f6dc9357SAndroid Build Coastguard Worker MyFree(_chars); 87*f6dc9357SAndroid Build Coastguard Worker _chars = newBuf; 88*f6dc9357SAndroid Build Coastguard Worker _size = n; 89*f6dc9357SAndroid Build Coastguard Worker } 90*f6dc9357SAndroid Build Coastguard Worker memcpy(_chars + _pos, s, len); 91*f6dc9357SAndroid Build Coastguard Worker _pos += len; 92*f6dc9357SAndroid Build Coastguard Worker return *this; 93*f6dc9357SAndroid Build Coastguard Worker } 94