1 /* see copyright notice in squirrel.h */
\r
2 #ifndef _SQSTD_BLOBIMPL_H_
\r
3 #define _SQSTD_BLOBIMPL_H_
\r
5 struct SQBlob : public SQStream
\r
7 SQBlob(SQInteger size) {
\r
10 _buf = (unsigned char *)sq_malloc(size);
\r
11 memset(_buf, 0, _size);
\r
16 sq_free(_buf, _allocated);
\r
18 SQInteger Write(void *buffer, SQInteger size) {
\r
19 if(!CanAdvance(size)) {
\r
20 GrowBufOf(_ptr + size - _size);
\r
22 memcpy(&_buf[_ptr], buffer, size);
\r
26 SQInteger Read(void *buffer,SQInteger size) {
\r
28 if(!CanAdvance(size)) {
\r
29 if((_size - _ptr) > 0)
\r
33 memcpy(buffer, &_buf[_ptr], n);
\r
37 bool Resize(SQInteger n) {
\r
38 if(!_owns) return false;
\r
39 if(n != _allocated) {
\r
40 unsigned char *newbuf = (unsigned char *)sq_malloc(n);
\r
43 memcpy(newbuf,_buf,n);
\r
45 memcpy(newbuf,_buf,_size);
\r
46 sq_free(_buf,_allocated);
\r
49 if(_size > _allocated)
\r
51 if(_ptr > _allocated)
\r
56 bool GrowBufOf(SQInteger n)
\r
59 if(_size + n > _allocated) {
\r
60 if(_size + n > _size * 2)
\r
61 ret = Resize(_size + n);
\r
63 ret = Resize(_size * 2);
\r
68 bool CanAdvance(SQInteger n) {
\r
69 if(_ptr+n>_size)return false;
\r
72 SQInteger Seek(SQInteger offset, SQInteger origin) {
\r
75 if(offset > _size || offset < 0) return -1;
\r
79 if(_ptr + offset > _size || _ptr + offset < 0) return -1;
\r
83 if(_size + offset > _size || _size + offset < 0) return -1;
\r
84 _ptr = _size + offset;
\r
91 return _buf?true:false;
\r
94 return _ptr == _size;
\r
96 SQInteger Flush() { return 0; }
\r
97 SQInteger Tell() { return _ptr; }
\r
98 SQInteger Len() { return _size; }
\r
99 SQUserPointer GetBuf(){ return _buf; }
\r
102 SQInteger _allocated;
\r
104 unsigned char *_buf;
\r
108 #endif //_SQSTD_BLOBIMPL_H_
\r