version 3.17.0

finally properly works PIIOString inside PIIOStream
This commit is contained in:
2024-04-05 15:34:38 +03:00
parent 8d585439bb
commit 9283c88b4e
6 changed files with 155 additions and 47 deletions

View File

@@ -41,7 +41,18 @@ PIIOString::PIIOString(const PIString & string) {
}
void PIIOString::clear() {
if (str) str->clear();
pos = 0;
}
bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode) {
if (mode == PIIODevice::ReadWrite) {
piCoutObj << "Error: ReadWrite mode not supported, use WriteOnly or ReadOnly";
str = nullptr;
return false;
}
str = string;
return PIIODevice::open(mode);
}
@@ -53,26 +64,57 @@ bool PIIOString::open(const PIString & string) {
}
bool PIIOString::isEnd() const {
if (!str) return true;
if (mode_ == PIIODevice::WriteOnly)
return pos >= str->size_s();
else {
str->dataUTF8();
return pos >= static_cast<ssize_t>(str->lastDataSize());
}
}
void PIIOString::seekToBegin() {
if (!str) return;
pos = 0;
}
void PIIOString::seekToEnd() {
if (!str) return;
if (mode_ == PIIODevice::WriteOnly)
pos = str->size_s();
else {
str->dataUTF8();
pos = str->lastDataSize();
}
}
PIString PIIOString::readLine() {
if (!canRead() || !str) return PIString();
int np = pos;
while (++np < str->size_s()) {
if ((*str)[np] == '\n') break;
auto utf8_data = str->dataUTF8();
ssize_t utf8_size = str->lastDataSize();
int pp = pos;
while (++pp < utf8_size) {
if (utf8_data[pp] == '\n') break;
}
PIString ret = str->mid(pos, np - pos);
pos = piMini(np + 1, str->size_s());
PIString ret = PIString::fromUTF8(&(utf8_data[pos]), pp - pos);
pos = piMini(pp + 1, utf8_size);
return ret;
}
ssize_t PIIOString::readDevice(void * read_to, ssize_t max_size) {
if (!canRead() || !str || max_size <= 0) return -1;
PIString rs = str->mid(pos, max_size);
pos += max_size;
if (pos > str->size_s()) pos = str->size_s();
const char * cc = rs.data();
int ret = strlen(cc);
memcpy(read_to, cc, ret);
auto utf8_data = str->dataUTF8();
ssize_t utf8_size = str->lastDataSize();
if (pos >= utf8_size) return 0;
int ret = piMini(max_size, utf8_size - pos);
if (ret <= 0) return 0;
memcpy(read_to, &(utf8_data[pos]), ret);
pos += ret;
return ret;
}
@@ -98,6 +140,12 @@ int PIIOString::writeString(const PIString & string) {
}
ssize_t PIIOString::bytesAvailable() const {
if (!str) return 0;
return str->size() - pos;
}
bool PIIOString::openDevice() {
pos = 0;
return (str != 0);