-/* see copyright notice in squirrel.h */\r
-#ifndef _SQSTD_BLOBIMPL_H_\r
-#define _SQSTD_BLOBIMPL_H_\r
-\r
-struct SQBlob : public SQStream\r
-{\r
- SQBlob(SQInteger size) {\r
- _size = size;\r
- _allocated = size;\r
- _buf = (unsigned char *)sq_malloc(size);\r
- memset(_buf, 0, _size);\r
- _ptr = 0;\r
- _owns = true;\r
- }\r
- ~SQBlob() {\r
- sq_free(_buf, _allocated);\r
- }\r
- SQInteger Write(void *buffer, SQInteger size) {\r
- if(!CanAdvance(size)) {\r
- GrowBufOf(_ptr + size - _size);\r
- }\r
- memcpy(&_buf[_ptr], buffer, size);\r
- _ptr += size;\r
- return size;\r
- }\r
- SQInteger Read(void *buffer,SQInteger size) {\r
- SQInteger n = size;\r
- if(!CanAdvance(size)) {\r
- if((_size - _ptr) > 0)\r
- n = _size - _ptr;\r
- else return 0;\r
- }\r
- memcpy(buffer, &_buf[_ptr], n);\r
- _ptr += n;\r
- return n;\r
- }\r
- bool Resize(SQInteger n) {\r
- if(!_owns) return false;\r
- if(n != _allocated) {\r
- unsigned char *newbuf = (unsigned char *)sq_malloc(n);\r
- memset(newbuf,0,n);\r
- if(_size > n)\r
- memcpy(newbuf,_buf,n);\r
- else\r
- memcpy(newbuf,_buf,_size);\r
- sq_free(_buf,_allocated);\r
- _buf=newbuf;\r
- _allocated = n;\r
- if(_size > _allocated)\r
- _size = _allocated;\r
- if(_ptr > _allocated)\r
- _ptr = _allocated;\r
- }\r
- return true;\r
- }\r
- bool GrowBufOf(SQInteger n)\r
- {\r
- bool ret = true;\r
- if(_size + n > _allocated) {\r
- if(_size + n > _size * 2)\r
- ret = Resize(_size + n);\r
- else\r
- ret = Resize(_size * 2);\r
- }\r
- _size = _size + n;\r
- return ret;\r
- }\r
- bool CanAdvance(SQInteger n) {\r
- if(_ptr+n>_size)return false;\r
- return true;\r
- }\r
- SQInteger Seek(SQInteger offset, SQInteger origin) {\r
- switch(origin) {\r
- case SQ_SEEK_SET:\r
- if(offset > _size || offset < 0) return -1;\r
- _ptr = offset;\r
- break;\r
- case SQ_SEEK_CUR:\r
- if(_ptr + offset > _size || _ptr + offset < 0) return -1;\r
- _ptr += offset;\r
- break;\r
- case SQ_SEEK_END:\r
- if(_size + offset > _size || _size + offset < 0) return -1;\r
- _ptr = _size + offset;\r
- break;\r
- default: return -1;\r
- }\r
- return 0;\r
- }\r
- bool IsValid() {\r
- return _buf?true:false;\r
- }\r
- bool EOS() {\r
- return _ptr == _size;\r
- }\r
- SQInteger Flush() { return 0; }\r
- SQInteger Tell() { return _ptr; }\r
- SQInteger Len() { return _size; }\r
- SQUserPointer GetBuf(){ return _buf; }\r
-private:\r
- SQInteger _size;\r
- SQInteger _allocated;\r
- SQInteger _ptr;\r
- unsigned char *_buf;\r
- bool _owns;\r
-};\r
-\r
-#endif //_SQSTD_BLOBIMPL_H_\r
+/* see copyright notice in squirrel.h */
+#ifndef _SQSTD_BLOBIMPL_H_
+#define _SQSTD_BLOBIMPL_H_
+
+struct SQBlob : public SQStream
+{
+ SQBlob(SQInteger size) {
+ _size = size;
+ _allocated = size;
+ _buf = (unsigned char *)sq_malloc(size);
+ memset(_buf, 0, _size);
+ _ptr = 0;
+ _owns = true;
+ }
+ virtual ~SQBlob() {
+ sq_free(_buf, _allocated);
+ }
+ SQInteger Write(void *buffer, SQInteger size) {
+ if(!CanAdvance(size)) {
+ GrowBufOf(_ptr + size - _size);
+ }
+ memcpy(&_buf[_ptr], buffer, size);
+ _ptr += size;
+ return size;
+ }
+ SQInteger Read(void *buffer,SQInteger size) {
+ SQInteger n = size;
+ if(!CanAdvance(size)) {
+ if((_size - _ptr) > 0)
+ n = _size - _ptr;
+ else return 0;
+ }
+ memcpy(buffer, &_buf[_ptr], n);
+ _ptr += n;
+ return n;
+ }
+ bool Resize(SQInteger n) {
+ if(!_owns) return false;
+ if(n != _allocated) {
+ unsigned char *newbuf = (unsigned char *)sq_malloc(n);
+ memset(newbuf,0,n);
+ if(_size > n)
+ memcpy(newbuf,_buf,n);
+ else
+ memcpy(newbuf,_buf,_size);
+ sq_free(_buf,_allocated);
+ _buf=newbuf;
+ _allocated = n;
+ if(_size > _allocated)
+ _size = _allocated;
+ if(_ptr > _allocated)
+ _ptr = _allocated;
+ }
+ return true;
+ }
+ bool GrowBufOf(SQInteger n)
+ {
+ bool ret = true;
+ if(_size + n > _allocated) {
+ if(_size + n > _size * 2)
+ ret = Resize(_size + n);
+ else
+ ret = Resize(_size * 2);
+ }
+ _size = _size + n;
+ return ret;
+ }
+ bool CanAdvance(SQInteger n) {
+ if(_ptr+n>_size)return false;
+ return true;
+ }
+ SQInteger Seek(SQInteger offset, SQInteger origin) {
+ switch(origin) {
+ case SQ_SEEK_SET:
+ if(offset > _size || offset < 0) return -1;
+ _ptr = offset;
+ break;
+ case SQ_SEEK_CUR:
+ if(_ptr + offset > _size || _ptr + offset < 0) return -1;
+ _ptr += offset;
+ break;
+ case SQ_SEEK_END:
+ if(_size + offset > _size || _size + offset < 0) return -1;
+ _ptr = _size + offset;
+ break;
+ default: return -1;
+ }
+ return 0;
+ }
+ bool IsValid() {
+ return _buf?true:false;
+ }
+ bool EOS() {
+ return _ptr == _size;
+ }
+ SQInteger Flush() { return 0; }
+ SQInteger Tell() { return _ptr; }
+ SQInteger Len() { return _size; }
+ SQUserPointer GetBuf(){ return _buf; }
+private:
+ SQInteger _size;
+ SQInteger _allocated;
+ SQInteger _ptr;
+ unsigned char *_buf;
+ bool _owns;
+};
+
+#endif //_SQSTD_BLOBIMPL_H_