Rename OUT_OF_DISK => OUT_OF_SPACE. Allow byte writer to take a buffer.

This commit is contained in:
Christoffer Lerno
2023-03-22 11:52:45 +01:00
parent 172ae8a3a5
commit 9850adfa56
4 changed files with 24 additions and 6 deletions

View File

@@ -26,7 +26,7 @@ fault IoError
FILE_EOF,
INCOMPLETE_WRITE,
NO_PERMISSION,
OUT_OF_DISK,
OUT_OF_SPACE,
INVALID_PUSHBACK,
EOF,
CANNOT_READ_DIR,

View File

@@ -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;

View File

@@ -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)?;

View File

@@ -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"));
}