From 9850adfa5620395c89dbc8d75c5d1f8b6b34b69d Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Wed, 22 Mar 2023 11:52:45 +0100 Subject: [PATCH] Rename OUT_OF_DISK => OUT_OF_SPACE. Allow byte writer to take a buffer. --- lib/std/io/io.c3 | 2 +- lib/std/io/os/file.c3 | 10 +++++----- lib/std/io/stream/bytewriter.c3 | 6 ++++++ test/unit/stdlib/io/bytestream.c3 | 12 ++++++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/std/io/io.c3 b/lib/std/io/io.c3 index 970fff60e..242718472 100644 --- a/lib/std/io/io.c3 +++ b/lib/std/io/io.c3 @@ -26,7 +26,7 @@ fault IoError FILE_EOF, INCOMPLETE_WRITE, NO_PERMISSION, - OUT_OF_DISK, + OUT_OF_SPACE, INVALID_PUSHBACK, EOF, CANNOT_READ_DIR, diff --git a/lib/std/io/os/file.c3 b/lib/std/io/os/file.c3 index 726b2ac57..8703bb879 100644 --- a/lib/std/io/os/file.c3 +++ b/lib/std/io/os/file.c3 @@ -132,7 +132,7 @@ macro anyerr file_open_errno() @local switch (libc::errno()) { case errno::EACCES: return IoError.NO_PERMISSION; - case errno::EDQUOT: return IoError.OUT_OF_DISK; + case errno::EDQUOT: return IoError.OUT_OF_SPACE; case errno::EBADF: return IoError.FILE_NOT_VALID; case errno::EEXIST: return IoError.ALREADY_EXISTS; case errno::EINTR: return IoError.INTERRUPTED; @@ -141,10 +141,10 @@ macro anyerr file_open_errno() @local case errno::ELOOP: return IoError.SYMLINK_FAILED; case errno::EMFILE: return IoError.TOO_MANY_DESCRIPTORS; case errno::ENAMETOOLONG: return IoError.NAME_TOO_LONG; - case errno::ENFILE: return IoError.OUT_OF_DISK; + case errno::ENFILE: return IoError.OUT_OF_SPACE; case errno::ENOTDIR: return IoError.FILE_NOT_DIR; case errno::ENOENT: return IoError.FILE_NOT_FOUND; - case errno::ENOSPC: return IoError.OUT_OF_DISK; + case errno::ENOSPC: return IoError.OUT_OF_SPACE; case errno::ENXIO: return IoError.FILE_NOT_FOUND; case errno::EOVERFLOW: return IoError.OVERFLOW; case errno::EROFS: return IoError.READ_ONLY; @@ -163,11 +163,11 @@ macro anyerr file_seek_errno() @local case errno::EPIPE: return IoError.FILE_IS_PIPE; case errno::EOVERFLOW: return IoError.OVERFLOW; case errno::ENXIO: return IoError.FILE_NOT_FOUND; - case errno::ENOSPC: return IoError.OUT_OF_DISK; + case errno::ENOSPC: return IoError.OUT_OF_SPACE; case errno::EIO: return IoError.INCOMPLETE_WRITE; case errno::EINVAL: return IoError.INVALID_POSITION; case errno::EINTR: return IoError.INTERRUPTED; - case errno::EFBIG: return IoError.OUT_OF_DISK; + case errno::EFBIG: return IoError.OUT_OF_SPACE; case errno::EBADF: return IoError.FILE_NOT_VALID; case errno::EAGAIN: return IoError.WOULD_BLOCK; default: return IoError.UNKNOWN_ERROR; diff --git a/lib/std/io/stream/bytewriter.c3 b/lib/std/io/stream/bytewriter.c3 index 9273385a7..644957b15 100644 --- a/lib/std/io/stream/bytewriter.c3 +++ b/lib/std/io/stream/bytewriter.c3 @@ -18,6 +18,11 @@ fn void ByteWriter.init(ByteWriter* writer, Allocator* using = mem::heap()) *writer = { .bytes = {}, .allocator = using }; } +fn void ByteWriter.init_buffer(ByteWriter* writer, char[] data) +{ + *writer = { .bytes = data, .allocator = null }; +} + /** * @param [&inout] writer * @require writer.bytes.len == 0 "Init may not run on on already initialized data" @@ -47,6 +52,7 @@ fn String ByteWriter.as_str(ByteWriter* writer) fn void! ByteWriter.ensure_capacity(ByteWriter* writer, usz len) @inline { if (writer.bytes.len > len) return; + if (!writer.allocator) return IoError.OUT_OF_SPACE!; if (len < 16) len = 16; usz new_capacity = math::next_power_of_2(len); char* new_ptr = realloc_checked(writer.bytes.ptr, new_capacity, .using = writer.allocator)?; diff --git a/test/unit/stdlib/io/bytestream.c3 b/test/unit/stdlib/io/bytestream.c3 index f62302681..4f6c13440 100644 --- a/test/unit/stdlib/io/bytestream.c3 +++ b/test/unit/stdlib/io/bytestream.c3 @@ -23,3 +23,15 @@ fn void! bytestream() assert(w.as_str() == "helloworldabcbc"); } +fn void! bytewriter_buffer() +{ + ByteWriter writer; + char[8] z; + writer.init_buffer(&z); + Stream s = writer.as_stream(); + s.write("hello")!!; + s.write_byte(0)!!; + String o = ((ZString)&z).as_str(); + assert(o == "hello"); + assert(catch? s.write("xxxx")); +}