summaryrefslogtreecommitdiff
path: root/std/io.zc
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 12:22:57 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 12:22:57 +0000
commitf73df8d5de30a7f3f320fccf5f57c13094940a6a (patch)
tree877fda85fa3c4a906d6943ac7b7836886bc4140a /std/io.zc
parent98623f2fdd63232edf0ebab1b9680cf4e33e6f10 (diff)
Variadic functions + more docs
Diffstat (limited to 'std/io.zc')
-rw-r--r--std/io.zc96
1 files changed, 50 insertions, 46 deletions
diff --git a/std/io.zc b/std/io.zc
index 10ac712..5cfec3e 100644
--- a/std/io.zc
+++ b/std/io.zc
@@ -3,62 +3,66 @@ import "./core.zc"
import "./string.zc"
raw {
- char* format(const char* fmt, ...) {
- static char buffer[1024];
- va_list args;
- va_start(args, fmt);
- vsnprintf(buffer, sizeof(buffer), fmt, args);
- va_end(args);
- return buffer;
+ int _z_vprintf(char* fmt, va_list ap) {
+ return vprintf((const char*)fmt, ap);
}
- char* format_new(const char* fmt, ...) {
- char* buffer = malloc(1024);
- va_list args;
- va_start(args, fmt);
- vsnprintf(buffer, 1024, fmt, args);
- va_end(args);
- return buffer;
+ int _z_vsnprintf(char* str, size_t size, char* fmt, va_list ap) {
+ return vsnprintf(str, size, (const char*)fmt, ap);
}
- void* _z_get_stdin()
- {
- return stdin;
- }
+ void* _z_get_stdin() { return stdin; }
+ int _z_get_eof() { return EOF; }
+ int _z_fgetc(void* stream) { return fgetc((FILE*)stream); }
+}
- int _z_get_eof()
- {
- return EOF;
- }
+extern fn _z_vprintf(fmt: char*, ap: va_list) -> int;
+extern fn _z_vsnprintf(str: char*, size: usize, fmt: char*, ap: va_list) -> int;
- int _z_fgetc(void* stream)
- {
- return fgetc((FILE*)stream);
- }
-
- char* _z_format_alloc(const char* fmt, va_list args) {
- int len = vsnprintf(NULL, 0, fmt, args);
- if (len < 0) return NULL;
- char* buffer = malloc(len + 1);
- if (!buffer) return NULL;
- vsnprintf(buffer, len + 1, fmt, args);
- return buffer;
- }
-
- char* format_s_raw(char* fmt, ...) {
- va_list args;
- va_start(args, fmt);
- char* ret = _z_format_alloc(fmt, args);
- va_end(args);
- return ret;
- }
+fn format(fmt: char*, ...) -> char* {
+ static var buffer: char[1024];
+ var ap: va_list;
+ va_start(ap, fmt);
+ _z_vsnprintf(buffer, 1024, fmt, ap);
+ va_end(ap);
+ return (char*)buffer;
}
-extern fn format_s_raw(fmt: char*, ...) -> char*;
+fn format_into(buffer: char*, size: usize, fmt: char*, ...) -> int {
+ var ap: va_list;
+ va_start(ap, fmt);
+ var ret = _z_vsnprintf(buffer, size, fmt, ap);
+ va_end(ap);
+ return ret;
+}
-// TODO: add format function. We will need to do a few updates...
-// like adding support for varargs in Zen C functions.
+fn format_new(fmt: char*, ...) -> char* {
+ var buffer: char* = malloc(1024);
+ if buffer == NULL return NULL;
+
+ var ap: va_list;
+ va_start(ap, fmt);
+ _z_vsnprintf(buffer, 1024, fmt, ap);
+ va_end(ap);
+ return buffer;
+}
+fn print(fmt: char*, ...) -> int {
+ var ap: va_list;
+ va_start(ap, fmt);
+ var ret = _z_vprintf(fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+fn println(fmt: char*, ...) -> int {
+ var ap: va_list;
+ va_start(ap, fmt);
+ var ret = _z_vprintf(fmt, ap);
+ va_end(ap);
+ puts("");
+ return ret + 1;
+}
fn readln() -> char* {
var cap: usize = 64;