From 023cc9ca541d7462a323147cbc056fe4303f299f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Apr 2023 00:24:00 +0100 Subject: [PATCH] Partially buffer `fmt.fprint*` related calls using a `bufio.Writer` --- core/bufio/writer.odin | 8 ++++++++ core/fmt/fmt_os.odin | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/core/bufio/writer.odin b/core/bufio/writer.odin index 9e38395ee..ed0d557c5 100644 --- a/core/bufio/writer.odin +++ b/core/bufio/writer.odin @@ -227,6 +227,14 @@ writer_to_stream :: proc(b: ^Writer) -> (s: io.Stream) { return } +// writer_to_stream converts a Writer into an io.Stream +writer_to_writer :: proc(b: ^Writer) -> (s: io.Writer) { + s.stream_data = b + s.stream_vtable = &_writer_vtable + return +} + + @(private) diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index 52280a3f7..861b0c3b9 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -4,29 +4,59 @@ package fmt import "core:runtime" import "core:os" import "core:io" +import "core:bufio" // fprint formats using the default print settings and writes to fd fprint :: proc(fd: os.Handle, args: ..any, sep := " ") -> int { - w := io.to_writer(os.stream_from_handle(fd)) + buf: [1024]byte + b: bufio.Writer + defer bufio.writer_flush(&b) + + bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:]) + w := bufio.writer_to_writer(&b) return wprint(w=w, args=args, sep=sep) } // fprintln formats using the default print settings and writes to fd fprintln :: proc(fd: os.Handle, args: ..any, sep := " ") -> int { - w := io.to_writer(os.stream_from_handle(fd)) + buf: [1024]byte + b: bufio.Writer + defer bufio.writer_flush(&b) + + bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:]) + + w := bufio.writer_to_writer(&b) return wprintln(w=w, args=args, sep=sep) } // fprintf formats according to the specified format string and writes to fd fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int { - w := io.to_writer(os.stream_from_handle(fd)) + buf: [1024]byte + b: bufio.Writer + defer bufio.writer_flush(&b) + + bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:]) + + w := bufio.writer_to_writer(&b) return wprintf(w, fmt, ..args) } fprint_type :: proc(fd: os.Handle, info: ^runtime.Type_Info) -> (n: int, err: io.Error) { - w := io.to_writer(os.stream_from_handle(fd)) + buf: [1024]byte + b: bufio.Writer + defer bufio.writer_flush(&b) + + bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:]) + + w := bufio.writer_to_writer(&b) return wprint_type(w, info) } fprint_typeid :: proc(fd: os.Handle, id: typeid) -> (n: int, err: io.Error) { - w := io.to_writer(os.stream_from_handle(fd)) + buf: [1024]byte + b: bufio.Writer + defer bufio.writer_flush(&b) + + bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:]) + + w := bufio.writer_to_writer(&b) return wprint_typeid(w, id) }