mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-06-27 04:27:11 +02:00
.github
bin
module
vendor
CPR
CivetWeb
ConcurrentQueue
Fmt
MDBC
MaxmindDB
POCO
PUGIXML
SAJSON
SimpleIni
Squirrel
include
stdlib
sqstdaux.cpp
sqstdblob.cpp
sqstdblobimpl.h
sqstdio.cpp
sqstdmath.cpp
sqstdrex.cpp
sqstdstream.cpp
sqstdstream.h
sqstdstring.cpp
sqstdsystem.cpp
CMakeLists.txt
COPYRIGHT
README.md
sqapi.cpp
sqapiex.cpp
sqarray.h
sqbaselib.cpp
sqclass.cpp
sqclass.h
sqclosure.h
sqcompiler.cpp
sqcompiler.h
sqdebug.cpp
sqfuncproto.h
sqfuncstate.cpp
sqfuncstate.h
sqlexer.cpp
sqlexer.h
sqmem.cpp
sqobject.cpp
sqobject.h
sqopcodes.h
sqpcheader.h
sqstate.cpp
sqstate.h
sqstring.h
sqtable.cpp
sqtable.h
squserdata.h
squtils.h
sqvm.cpp
sqvm.h
TinyDir
UTF8
ZMQ
xxHash
CMakeLists.txt
.gitignore
.gitmodules
CMakeLists.txt
LICENSE
README.md
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
109 lines
2.9 KiB
C++
109 lines
2.9 KiB
C++
/* 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 _size == 0 || _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_
|