return out;
}
+on_temp :: macro (v: $V) -> &V {
+ out := cast(&V) raw_alloc(context.temp_allocator, sizeof V);
+ core.memory.set(out, 0, sizeof V);
+ *out = v;
+ return out;
+}
+
TEMPORARY_ALLOCATOR_SIZE :: 1 << 16; // 16Kb
// The global heap allocator, set up upon program intialization.
return o1.value == o2.value;
}
-#operator ?? macro (opt: ?$T, catch: Code) -> T {
+#operator ?? macro (opt: ?$T, default: T) -> T {
value := opt;
if value do return value.value;
- #unquote catch;
+ return default;
}
-#operator ?? macro (opt: ?$T, default: T) -> T {
+#operator ?? macro (opt: ?$T, catch: Code) -> T {
value := opt;
if value do return value.value;
- return default;
+ #unquote catch;
}
#operator ? macro (opt: ?$T) -> T {
Writer :: struct {
stream : &Stream;
+ error : Error;
+
buffer: [] u8;
buffer_filled: u32;
}
writer_flush :: (w: &Writer) {
if w.buffer_filled == 0 do return;
- stream_write(w.stream, w.buffer[0 .. w.buffer_filled]);
+ err, bytes_wrote := stream_write(w.stream, w.buffer[0 .. w.buffer_filled]);
+ if err != .None {
+ w.error = err;
+ }
+
w.buffer_filled = 0;
}
+writer_consume_error :: (w: &Writer) -> Error {
+ defer w.error = .None;
+ return w.error;
+}
+
writer_remaining_capacity :: (w: &Writer) -> u32 {
return w.buffer.count - w.buffer_filled;
}
write_byte :: (use writer: &Writer, byte: u8) {
if buffer.count == 0 {
- stream_write_byte(stream, byte);
+ if err := stream_write_byte(stream, byte); err != .None {
+ writer.error = err;
+ }
+
} else {
if writer_remaining_capacity(writer) == 0 {
writer_flush(writer);
write_str :: (use writer: &Writer, s: str) {
if buffer.count == 0 {
- stream_write(stream, s);
+ if err := stream_write(stream, s); err != .None {
+ writer.error = err;
+ }
} elseif writer_remaining_capacity(writer) > s.count {
memory.copy(&buffer[buffer_filled], s.data, s.count);
} else {
writer_flush(writer);
- stream_write(stream, s);
+ if err := stream_write(stream, s); err != .None {
+ writer.error = err;
+ }
}
}