mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
Rename OUT_OF_DISK => OUT_OF_SPACE. Allow byte writer to take a buffer.
This commit is contained in:
@@ -26,7 +26,7 @@ fault IoError
|
||||
FILE_EOF,
|
||||
INCOMPLETE_WRITE,
|
||||
NO_PERMISSION,
|
||||
OUT_OF_DISK,
|
||||
OUT_OF_SPACE,
|
||||
INVALID_PUSHBACK,
|
||||
EOF,
|
||||
CANNOT_READ_DIR,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user