CIODevice: Add some basic output facilities: write() and printf().

Being able to do file.printf() is extremely comfy, I have to say. :^)
This commit is contained in:
Andreas Kling 2019-05-08 04:38:41 +02:00
parent b719bf7fde
commit 7ce3b10568
Notes: sideshowbarker 2024-07-19 14:11:58 +09:00
2 changed files with 27 additions and 0 deletions

View file

@ -2,6 +2,7 @@
#include <unistd.h>
#include <sys/select.h>
#include <stdio.h>
#include <AK/printf.cpp>
CIODevice::CIODevice(CObject* parent)
: CObject(parent)
@ -185,3 +186,25 @@ bool CIODevice::seek(signed_qword offset)
m_eof = false;
return true;
}
bool CIODevice::write(const byte* data, int size)
{
int rc = ::write(m_fd, data, size);
if (rc < 0) {
perror("CIODevice::write: write");
return false;
}
return rc == size;
}
int CIODevice::printf(const char* format, ...)
{
va_list ap;
va_start(ap, format);
// FIXME: We're not propagating write() failures to client here!
int ret = printf_internal([this] (char*&, char ch) {
write((const byte*)&ch, 1);
}, nullptr, format, ap);
va_end(ap);
return ret;
}

View file

@ -30,6 +30,8 @@ public:
ByteBuffer read_line(int max_size);
ByteBuffer read_all();
bool write(const byte*, int size);
// FIXME: I would like this to be const but currently it needs to call populate_read_buffer().
bool can_read_line();
@ -40,6 +42,8 @@ public:
virtual bool open(CIODevice::OpenMode) = 0;
virtual bool close();
int printf(const char*, ...);
virtual const char* class_name() const override { return "CIODevice"; }
protected: