mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
140 lines
2 KiB
C++
140 lines
2 KiB
C++
#include "Core.h"
|
|
|
|
namespace Upp {
|
|
|
|
StringsStreamOut::StringsStreamOut(int part_size_)
|
|
{
|
|
part_size = part_size_;
|
|
ResetBuffer();
|
|
style = STRM_WRITE;
|
|
}
|
|
|
|
void StringsStreamOut::ResetBuffer()
|
|
{
|
|
wdata.SetCount(part_size);
|
|
buffer = (byte *)wdata.begin();
|
|
wrlim = (byte *)wdata.end();
|
|
ptr = buffer;
|
|
}
|
|
|
|
int64 StringsStreamOut::GetSize() const
|
|
{
|
|
return ptr - buffer + (int64)part.GetCount() * part_size;
|
|
}
|
|
|
|
bool StringsStreamOut::IsOpen() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void StringsStreamOut::_Put(int w)
|
|
{
|
|
byte h = w;
|
|
_Put(&h, 1);
|
|
}
|
|
|
|
void StringsStreamOut::_Put(const void *data, dword sz)
|
|
{
|
|
if(!sz)
|
|
return;
|
|
const char *p = (const char *)data;
|
|
for(;;) {
|
|
dword psz = min(dword(wrlim - ptr), sz);
|
|
if(psz) {
|
|
memcpy8(ptr, p, psz);
|
|
ptr += psz;
|
|
sz -= psz;
|
|
}
|
|
if(sz == 0)
|
|
break;
|
|
p += psz;
|
|
part.Add(wdata);
|
|
ResetBuffer();
|
|
}
|
|
}
|
|
|
|
Vector<String> StringsStreamOut::PickResult()
|
|
{
|
|
if(ptr != buffer) {
|
|
wdata.SetLength(int(ptr - buffer));
|
|
part.Add(wdata);
|
|
}
|
|
return pick(part);
|
|
}
|
|
|
|
StringsStreamIn::StringsStreamIn(const Vector<String>& part)
|
|
: part(part)
|
|
{
|
|
i = 0;
|
|
ResetBuffer();
|
|
size = 0;
|
|
for(const String& s : part)
|
|
size += s.GetCount();
|
|
style = STRM_READ;
|
|
}
|
|
|
|
void StringsStreamIn::ResetBuffer()
|
|
{
|
|
if(i < part.GetCount()) {
|
|
ptr = buffer = (byte *)part[i].begin();
|
|
rdlim = (byte *)part[i].end();
|
|
}
|
|
else {
|
|
static byte nothing;
|
|
ptr = buffer = rdlim = ¬hing;
|
|
}
|
|
}
|
|
|
|
int StringsStreamIn::_Term()
|
|
{
|
|
while(i < part.GetCount()) {
|
|
if(ptr < rdlim)
|
|
return *ptr;
|
|
i++;
|
|
ResetBuffer();
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int StringsStreamIn::_Get()
|
|
{
|
|
int c = _Term();
|
|
if(c >= 0)
|
|
ptr++;
|
|
return c;
|
|
}
|
|
|
|
dword StringsStreamIn::_Get(void *data, dword size)
|
|
{
|
|
dword sz = size;
|
|
char *p = (char *)data;
|
|
for(;;) {
|
|
dword psz = min(dword(rdlim - ptr), sz);
|
|
if(psz) {
|
|
memcpy8(p, ptr, psz);
|
|
ptr += psz;
|
|
sz -= psz;
|
|
}
|
|
if(sz == 0)
|
|
return size;
|
|
p += psz;
|
|
if(i < part.GetCount()) {
|
|
i++;
|
|
ResetBuffer();
|
|
}
|
|
else
|
|
return size - sz;
|
|
}
|
|
}
|
|
|
|
int64 StringsStreamIn::GetSize() const
|
|
{
|
|
return size;
|
|
}
|
|
|
|
bool StringsStreamIn::IsOpen() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
}
|