diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-14 12:48:37 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-14 12:49:16 +0000 |
| commit | 2ea86eaa3df4727d86306bbfb0f17ec6bd82fa90 (patch) | |
| tree | 8a0401a2b2a700194501b2f04f2de6c4b88525fd /std/io.zc | |
| parent | 55597a93028e9dbf2314171257f42e0104023896 (diff) | |
Changed (non-standard) to a more standard approach with .
Diffstat (limited to 'std/io.zc')
| -rw-r--r-- | std/io.zc | 62 |
1 files changed, 48 insertions, 14 deletions
@@ -19,25 +19,59 @@ raw { va_end(args); return buffer; } + + void* _z_get_stdin() + { + return stdin; + } + + int _z_get_eof() + { + return EOF; + } + + int _z_fgetc(void* stream) + { + return fgetc((FILE*)stream); + } } -raw { - char* readln() { - char* line = NULL; - size_t len = 0; - ssize_t read; - - read = getline(&line, &len, stdin); - - if (read != -1) { - // Remove newline if present - if (line[read - 1] == '\n') { - line[read - 1] = '\0'; + + +fn readln() -> char* { + var cap: usize = 64; + var len: usize = 0; + var line: char* = malloc(cap); + if (line == NULL) return NULL; + + var c: int; + var std_in = _z_get_stdin(); + var eof_val = _z_get_eof(); + + while (true) { + c = _z_fgetc(std_in); + if (c == eof_val) break; + if (c == 10) break; // '\n' + + if (len + 1 >= cap) { + cap = cap * 2; + var n = realloc(line, cap); + if (n == NULL) { + free(line); + return NULL; } - return line; + line = n; } - if (line) free(line); + line[len] = c; + len = len + 1; + } + + if (len == 0 && c == eof_val) { + free(line); return NULL; } + + line[len] = 0; + return line; } |
