diff options
-rw-r--r-- | Userland/Libraries/LibC/bits/stdio_file_implementation.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibC/stdio.cpp | 5 | ||||
-rw-r--r-- | Userland/Libraries/LibC/wchar.h | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibC/wstdio.cpp | 31 |
4 files changed, 40 insertions, 1 deletions
diff --git a/Userland/Libraries/LibC/bits/stdio_file_implementation.h b/Userland/Libraries/LibC/bits/stdio_file_implementation.h index 81a762b5c1..abd6eaf3a6 100644 --- a/Userland/Libraries/LibC/bits/stdio_file_implementation.h +++ b/Userland/Libraries/LibC/bits/stdio_file_implementation.h @@ -70,7 +70,7 @@ private: void realize(int fd); void drop(); - bool may_use() const { return m_ungotten || m_mode != _IONBF; } + bool may_use() const; bool is_not_empty() const { return m_ungotten || !m_empty; } size_t buffered_size() const; diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp index a800bd4ceb..92a3039d90 100644 --- a/Userland/Libraries/LibC/stdio.cpp +++ b/Userland/Libraries/LibC/stdio.cpp @@ -341,6 +341,11 @@ FILE::Buffer::~Buffer() free(m_data); } +bool FILE::Buffer::may_use() const +{ + return m_ungotten || m_mode != _IONBF; +} + void FILE::Buffer::realize(int fd) { if (m_mode == -1) diff --git a/Userland/Libraries/LibC/wchar.h b/Userland/Libraries/LibC/wchar.h index 64ff1183fe..5531380a29 100644 --- a/Userland/Libraries/LibC/wchar.h +++ b/Userland/Libraries/LibC/wchar.h @@ -74,5 +74,8 @@ size_t wcsspn(const wchar_t* wcs, const wchar_t* accept); wint_t fgetwc(FILE* stream); wint_t getwc(FILE* stream); wint_t getwchar(void); +wint_t fputwc(wchar_t wc, FILE* stream); +wint_t putwc(wchar_t wc, FILE* stream); +wint_t putwchar(wchar_t wc); __END_DECLS diff --git a/Userland/Libraries/LibC/wstdio.cpp b/Userland/Libraries/LibC/wstdio.cpp index f0c04f1c92..36e61f1a03 100644 --- a/Userland/Libraries/LibC/wstdio.cpp +++ b/Userland/Libraries/LibC/wstdio.cpp @@ -5,6 +5,7 @@ */ #include <AK/Assertions.h> +#include <AK/BitCast.h> #include <AK/StringBuilder.h> #include <AK/Types.h> #include <bits/stdio_file_implementation.h> @@ -61,4 +62,34 @@ wint_t getwchar() { return getwc(stdin); } + +wint_t fputwc(wchar_t wc, FILE* stream) +{ + VERIFY(stream); + // Negative wide chars are weird + if constexpr (IsSigned<wchar_t>) { + if (wc < 0) { + errno = EILSEQ; + return WEOF; + } + } + StringBuilder sb; + sb.append_code_point(static_cast<u32>(wc)); + auto bytes = sb.string_view().bytes(); + ScopedFileLock lock(stream); + size_t nwritten = stream->write(bytes.data(), bytes.size()); + if (nwritten < bytes.size()) + return WEOF; + return wc; +} + +wint_t putwc(wchar_t wc, FILE* stream) +{ + return fputwc(wc, stream); +} + +wint_t putwchar(wchar_t wc) +{ + return fputwc(wc, stdout); +} } |