From 9b543ddb16a71287eb1fb51c24a13f46190b5433 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 7 Nov 2021 17:09:51 +0100 Subject: [PATCH] LibC: Implement __freadptr --- .../LibC/bits/stdio_file_implementation.h | 2 ++ Userland/Libraries/LibC/stdio.cpp | 22 +++++++++++++++++++ Userland/Libraries/LibC/stdio_ext.h | 2 ++ 3 files changed, 26 insertions(+) diff --git a/Userland/Libraries/LibC/bits/stdio_file_implementation.h b/Userland/Libraries/LibC/bits/stdio_file_implementation.h index 173e88f44d0..56b4fbc4f25 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 ee23401c5c5..ebbccb3ab5e 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 4809204e8d1..3dda605f6f9 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