瀏覽代碼

LibC: Implement __freadptr

Tim Schumacher 3 年之前
父節點
當前提交
9b543ddb16

+ 2 - 0
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,

+ 22 - 0
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<char const*>(ptr);
+}
 }
 
 template bool FILE::gets<u8>(u8*, size_t);

+ 2 - 0
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