15 #include "stringStreamBuf.h"
17 #include "config_express.h"
27 _buffer = (
char *)PANDA_MALLOC_ARRAY(2048);
28 char *ebuf = _buffer + 2048;
29 char *mbuf = _buffer + 1024;
30 setg(_buffer, mbuf, mbuf);
39 char *m = b + (t - b) / 2;
56 PANDA_FREE_ARRAY(_buffer);
71 pbump(pbase() - pptr());
72 gbump(egptr() - gptr());
91 if (_data.size() <= _gpos) {
95 length = min(length, _data.size() - _gpos);
96 memcpy(start, &_data[_gpos], length);
111 size_t n = egptr() - gptr();
115 if (_data.size() > _ppos) {
117 size_t remaining_length = _data.size() - _ppos;
118 size_t overwrite_length = min(remaining_length, length);
119 memcpy(&_data[_ppos], start, overwrite_length);
120 length -= overwrite_length;
121 _ppos += overwrite_length;
122 start += overwrite_length;
125 if (_data.size() < _ppos) {
127 _data.insert(_data.end(), _ppos - _data.size(), (
unsigned char)0);
132 _data.insert(_data.begin() + _ppos, (
const unsigned char *)start, (
const unsigned char *)start + length);
143 streampos StringStreamBuf::
144 seekoff(streamoff off, ios_seekdir dir, ios_openmode which) {
145 streampos result = -1;
150 if (which & ios::in) {
152 size_t n = egptr() - gptr();
155 size_t cur_pos = _gpos;
156 size_t new_pos = cur_pos;
161 new_pos = (size_t)off;
165 new_pos = (size_t)((
int)cur_pos + off);
169 new_pos = (size_t)((
int)_data.size() + off);
181 if (which & ios::out) {
183 size_t n = pptr() - pbase();
184 size_t cur_pos = _ppos + n;
185 size_t new_pos = cur_pos;
190 new_pos = (size_t)off;
194 new_pos = (size_t)((
int)cur_pos + off);
198 new_pos = (size_t)((
int)_data.size() + off);
227 streampos StringStreamBuf::
228 seekpos(streampos pos, ios_openmode which) {
229 return seekoff(pos, ios::beg, which);
238 int StringStreamBuf::
240 size_t n = pptr() - pbase();
261 int StringStreamBuf::
263 size_t n = pptr() - pbase();
277 int StringStreamBuf::
280 if (gptr() >= egptr()) {
282 size_t buffer_size = egptr() - eback();
283 gbump(-(
int)buffer_size);
285 size_t num_bytes = buffer_size;
286 size_t read_count =
read_chars(gptr(), buffer_size);
288 if (read_count != num_bytes) {
290 if (read_count == 0) {
296 nassertr(read_count < num_bytes, EOF);
297 size_t delta = num_bytes - read_count;
298 memmove(gptr() + delta, gptr(), read_count);
303 return (
unsigned char)*gptr();
void clear()
Empties the buffer.
void write_chars(const char *start, size_t length)
Appends the indicated stream of characters to the current file position.
size_t read_chars(char *start, size_t length)
Attempts to extract the indicated number of characters from the current file position.