stdin is read once, whole, and read_file serves a copy of it wherever the program opens <path> -
the entry, an import through a barrel, a component's .xml / .lss, an .lres. Paths match after
normalising both ('/' separators, relative under $PWD, . / .. / // folded, case on Windows);
diagnostics keep the file's usual name, with the buffer's lines and columns. A <path> nothing
opens is one warning. On ludic build it implies --check. Reseeded; bootstrap-cfree fixpoint holds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
24 lines
712 B
Text
24 lines
712 B
Text
# io.ludic — reading the input file and writing the output, plus tiny stdio.
|
|
# The compiler reads one .ludic file whole and emits LLVM IR text to stdout.
|
|
|
|
function read_file(path: pointer) -> pointer {
|
|
let unsaved = stdin_file_serve(path) # --stdin-file: the buffer stands for its file (stdin_file.ludic)
|
|
if unsaved != null { return unsaved }
|
|
let f = file_open(path, "rb")
|
|
if (f == null) { return null }
|
|
file_seek(f, 0, 2)
|
|
let n = file_tell(f)
|
|
file_seek(f, 0, 0)
|
|
let buf = bytes(n + 1)
|
|
file_read(f, buf, n)
|
|
buf[n] = 0
|
|
file_close(f)
|
|
return buf
|
|
}
|
|
|
|
# length of a NUL-terminated buffer
|
|
function cstr_len(s: pointer) -> int {
|
|
var n = 0
|
|
while s[n] != 0 { n += 1 }
|
|
return n
|
|
}
|