diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 12:22:57 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 12:22:57 +0000 |
| commit | f73df8d5de30a7f3f320fccf5f57c13094940a6a (patch) | |
| tree | 877fda85fa3c4a906d6943ac7b7836886bc4140a /std | |
| parent | 98623f2fdd63232edf0ebab1b9680cf4e33e6f10 (diff) | |
Variadic functions + more docs
Diffstat (limited to 'std')
| -rw-r--r-- | std/io.zc | 96 |
1 files changed, 50 insertions, 46 deletions
@@ -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; |
