mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 22:02:49 -06:00
124 lines
2.1 KiB
C++
124 lines
2.1 KiB
C++
#include "sstrm.h"
|
|
|
|
void StringStream::Reads()
|
|
{
|
|
wdata.Clear();
|
|
buffer = (byte *) ~data;
|
|
pos = 0;
|
|
ptr = wrlim = buffer;
|
|
rdlim = buffer + data.GetCount();
|
|
writes = false;
|
|
}
|
|
|
|
void StringStream::Bufr()
|
|
{
|
|
buffer = (byte *)wdata.Begin();
|
|
rdlim = wrlim = (byte *)wdata.End();
|
|
}
|
|
|
|
void StringStream::Writes()
|
|
{
|
|
if(writes) return;
|
|
dword p = ptr - buffer;
|
|
wdata = data;
|
|
Bufr();
|
|
ptr = buffer + p;
|
|
writes = true;
|
|
size = rdlim - buffer;
|
|
}
|
|
|
|
void StringStream::Open(const String& adata)
|
|
{
|
|
data = adata;
|
|
style = STRM_READ|STRM_WRITE|STRM_SEEK|STRM_LOADING;
|
|
Reads();
|
|
ClearError();
|
|
}
|
|
|
|
void StringStream::Create()
|
|
{
|
|
Open(String());
|
|
SetStoring();
|
|
Writes();
|
|
ClearError();
|
|
}
|
|
|
|
dword StringStream::GetSize() const
|
|
{
|
|
return writes ? max((dword)(ptr - buffer), size) : data.GetLength();
|
|
}
|
|
|
|
String StringStream::GetResult()
|
|
{
|
|
if(writes) {
|
|
wdata.SetLength(GetSize());
|
|
dword p = ptr - buffer;
|
|
data = wdata;
|
|
Reads();
|
|
ptr = buffer + p;
|
|
}
|
|
return data;
|
|
}
|
|
|
|
void StringStream::_Put(const void *d, dword sz)
|
|
{
|
|
Writes();
|
|
if(ptr + sz >= wrlim) {
|
|
dword p = ptr - buffer;
|
|
#ifdef _DEBUG
|
|
wdata.SetLength(max((dword)1, max(2 * GetSize(), GetSize() + sz)));
|
|
#else
|
|
wdata.SetLength(max((dword)128, max(2 * GetSize(), GetSize() + sz)));
|
|
#endif
|
|
Bufr();
|
|
ptr = buffer + p;
|
|
}
|
|
memcpy(ptr, d, sz);
|
|
ptr += sz;
|
|
}
|
|
|
|
void StringStream::_Put(int w)
|
|
{
|
|
byte h = w;
|
|
_Put(&h, 1);
|
|
}
|
|
|
|
dword StringStream::_Get(void *data, dword sz)
|
|
{
|
|
dword read = min(dword(rdlim - ptr), sz);
|
|
memcpy(data, ptr, read);
|
|
ptr += read;
|
|
return read;
|
|
}
|
|
|
|
int StringStream::_Get()
|
|
{
|
|
return ptr < rdlim ? *ptr++ : -1;
|
|
}
|
|
|
|
int StringStream::_Term() {
|
|
return ptr < rdlim ? *ptr : -1;
|
|
}
|
|
|
|
void StringStream::Seek(dword pos) {
|
|
size = max(size, (dword)(ptr - buffer));
|
|
if(pos + buffer > rdlim) {
|
|
Writes();
|
|
wdata.SetLength(pos + 100);
|
|
Bufr();
|
|
}
|
|
ptr = buffer + min(GetSize(), pos);
|
|
}
|
|
|
|
void StringStream::SetSize(dword asize) {
|
|
Writes();
|
|
dword p = ptr - buffer;
|
|
Seek(asize);
|
|
Bufr();
|
|
size = asize;
|
|
ptr = min(buffer + p, buffer + size);
|
|
}
|
|
|
|
bool StringStream::IsOpen() const {
|
|
return true;
|
|
}
|