Merge pull request #853 from Onran0/io-streams-enhance

I/O Stream's enhance
This commit is contained in:
MihailRis 2026-07-23 23:16:34 +03:00 • committed by GitHub
commit b66b3881f9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 492 additions and 169 deletions

View file

@ -66,6 +66,33 @@ void io_descriptors::flush(int id) {
}
}
int io_descriptors::available(int id) {
if (!is_readable(id))
return 0;
auto* stream = descriptors[id]->in.get();
auto current_pos = stream->tellg();
if (current_pos == -1) {
return 0;
}
stream->seekg(0, std::ios::end);
auto end_pos = stream->tellg();
stream->seekg(current_pos, std::ios::beg);
auto remaining = end_pos - current_pos;
if (remaining > std::numeric_limits<int>::max()) {
return std::numeric_limits<int>::max();
}
return static_cast<int>(remaining);
}
bool io_descriptors::has_descriptor(int id) {
return id >= 0 && id < static_cast<int>(::descriptors.size()) &&
::descriptors[id].has_value();

View file

@ -13,6 +13,7 @@ namespace scripting::io_descriptors {
std::ostream& require_output(int id);
void flush(int id);
int available(int id);
bool has_descriptor(int id);

View file

@ -400,6 +400,20 @@ static int l_flush_descriptor(lua::State* L) {
return 0;
}
static int l_available_descriptor(lua::State* L) {
int descriptor = lua::tointeger(L, 1);
if (!io_descriptors::has_descriptor(descriptor)) {
throw std::runtime_error("unknown descriptor");
}
if (!io_descriptors::is_readable(descriptor)) {
throw std::runtime_error("descriptor is not readable");
}
return lua::pushinteger(L, io_descriptors::available(descriptor));
}
static int l_close_descriptor(lua::State* L) {
int descriptor = lua::tointeger(L, 1);
@ -447,6 +461,7 @@ const luaL_Reg filelib[] = {
{"__seek_descriptor", lua::wrap<l_seek_descriptor>},
{"__tell_descriptor", lua::wrap<l_tell_descriptor>},
{"__flush_descriptor", lua::wrap<l_flush_descriptor>},
{"__available_descriptor", lua::wrap<l_available_descriptor>},
{"__close_descriptor", lua::wrap<l_close_descriptor>},
{"__close_all_descriptors", lua::wrap<l_close_all_descriptors>},
{nullptr, nullptr}