xref: /aosp_15_r20/external/lzma/CPP/Common/DynLimBuf.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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 Worker CDynLimBuf::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 Worker CDynLimBuf & 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 Worker CDynLimBuf &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