added low-level ioLib.available for io_stream's

This commit is contained in:
Onran 2026-06-21 20:19:24 +09:00
parent fdec2d722d
commit bf98091a9c
9 changed files with 97 additions and 12 deletions

View file

@ -28,6 +28,33 @@ namespace scripting {
}
}
int descriptors_manager::available(int descriptor) {
if (!is_readable(descriptor))
return 0;
auto* stream = descriptors[descriptor]->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 descriptors_manager::has_descriptor(int descriptor) {
return is_readable(descriptor) || is_writeable(descriptor);
}

View file

@ -26,6 +26,8 @@ namespace scripting {
static void flush(int descriptor);
static int available(int descriptor);
static bool has_descriptor(int descriptor);
static bool is_readable(int descriptor);

View file

@ -397,6 +397,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 (!scripting::descriptors_manager::has_descriptor(descriptor)) {
throw std::runtime_error("unknown descriptor");
}
if (!scripting::descriptors_manager::is_readable(descriptor)) {
throw std::runtime_error("descriptor is not readable");
}
return lua::pushinteger(L, scripting::descriptors_manager::available(descriptor));
}
static int l_close_descriptor(lua::State* L) {
int descriptor = lua::tointeger(L, 1);
@ -443,6 +457,7 @@ const luaL_Reg filelib[] = {
{"__write_descriptor", lua::wrap<l_write_descriptor>},
{"__seek_descriptor", lua::wrap<l_seek_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}