int strstreambuf::overflow(int meta) { // try to extend write area if (meta == EOF) return (0); // nothing to write else if (pptr() != 0 && pptr() < epptr()) return ((unsigned char)(*_Pninc() = meta)); // room in buffer else if (!(_Strmode & _Dynamic) || _Strmode & (_Constant | _Frozen)) return (EOF); // can't extend else { // okay to extend int oldsize = gptr() == 0 ? 0 : epptr() - eback(); int newsize = oldsize; int inc = newsize / 2 < _Minsize ? _Minsize : newsize / 2; // grow by 50 per cent if possible _Minsize = _MINSIZE; // back to default for future growth char *ptr = 0; while (0 < inc && INT_MAX - inc < newsize) inc /= 2; // reduce growth increment if too big if (0 < inc) { // room to grow, increase size newsize += inc; ptr = _Palloc != 0 ? (char *)(*_Palloc)(newsize) : _NEW_CRT char[newsize]; } if (ptr == 0) return (EOF); // couldn't grow, return failure if (0 < oldsize) memcpy(ptr, eback(), oldsize); // copy existing buffer if (!(_Strmode & _Allocated)) ; // no buffer to free else if (_Pfree != 0) (*_Pfree)(eback()); // free with function call else _DELETE_CRT_VEC(eback()); // free by deleting array _Strmode |= _Allocated; if (oldsize == 0) { // set up new buffer _Seekhigh = ptr; setp(ptr, ptr + newsize); setg(ptr, ptr, ptr); } else { // revise old pointers _Seekhigh = _Seekhigh - eback() + ptr; setp(pbase() - eback() + ptr, pptr() - eback() + ptr, ptr + newsize); setg(ptr, gptr() - eback() + ptr, pptr() + 1); } return ((unsigned char)(*_Pninc() = meta)); }
_CRTIMP2 int strstreambuf::overflow(int ch) { // try to extend write area if (ch == EOF) return (0); else if (pptr() != 0 && pptr() < epptr()) return ((unsigned char)(*_Pninc() = (char)ch)); else if (!(_Strmode & _Dynamic) || _Strmode & (_Constant | _Frozen)) return (EOF); else { // okay to extend int osize = gptr() == 0 ? 0 : epptr() - eback(); int nsize = osize + _Alsize; char *p = _Palloc != 0 ? (char *)(*_Palloc)(nsize) : new char[nsize]; if (p == 0) return (EOF); if (0 < osize) memcpy(p, eback(), osize); else if (_ALSIZE < _Alsize) _Alsize = _ALSIZE; if (!(_Strmode & _Allocated)) ; else if (_Pfree != 0) (*_Pfree)(eback()); else delete[] eback(); _Strmode |= _Allocated; if (osize == 0) { // setup new buffer _Seekhigh = p; setp(p, p + nsize); setg(p, p, p); } else { // revise old pointers _Seekhigh = _Seekhigh - eback() + p; setp(pbase() - eback() + p, pptr() - eback() + p, p + nsize); setg(p, gptr() - eback() + p, pptr() + 1); } return ((unsigned char)(*_Pninc() = (char)ch)); } }