diff --git a/Userland/Libraries/LibC/bits/stdio_file_implementation.h b/Userland/Libraries/LibC/bits/stdio_file_implementation.h index 173e88f44d..56b4fbc4f2 100644 --- a/Userland/Libraries/LibC/bits/stdio_file_implementation.h +++ b/Userland/Libraries/LibC/bits/stdio_file_implementation.h @@ -61,6 +61,8 @@ public: void reopen(int fd, int mode); + u8 const* readptr(size_t& available_size); + enum Flags : u8 { None = 0, LastRead = 1, diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp index ee23401c5c..ebbccb3ab5 100644 --- a/Userland/Libraries/LibC/stdio.cpp +++ b/Userland/Libraries/LibC/stdio.cpp @@ -369,6 +369,11 @@ void FILE::reopen(int fd, int mode) m_eof = false; } +u8 const* FILE::readptr(size_t& available_size) +{ + return m_buffer.begin_dequeue(available_size); +} + FILE::Buffer::~Buffer() { if (m_data_is_malloced) @@ -1322,6 +1327,23 @@ void __fpurge(FILE* stream) ScopedFileLock lock(stream); stream->purge(); } + +char const* __freadptr(FILE* stream, size_t* sizep) +{ + VERIFY(stream); + VERIFY(sizep); + + ScopedFileLock lock(stream); + + size_t available_size; + u8 const* ptr = stream->readptr(available_size); + + if (available_size == 0) + return nullptr; + + *sizep = available_size; + return reinterpret_cast(ptr); +} } template bool FILE::gets(u8*, size_t); diff --git a/Userland/Libraries/LibC/stdio_ext.h b/Userland/Libraries/LibC/stdio_ext.h index 4809204e8d..3dda605f6f 100644 --- a/Userland/Libraries/LibC/stdio_ext.h +++ b/Userland/Libraries/LibC/stdio_ext.h @@ -15,4 +15,6 @@ int __freading(FILE*); int __fwriting(FILE*); void __fpurge(FILE*); +char const* __freadptr(FILE*, size_t*); + __END_DECLS