// fmt — minimal formatting writers. All output goes through os.write // to a file descriptor. No printf-family yet — we don't have varargs // in the language proper — so callers compose with strconv.i64tos / // strings.concat to build the message and then call print / println. // Hare's `fmt::println(42)` becomes `fmt.println(strconv.i64tos(42, // strconv.DEC))`. use os; export fn print(s: str) i64 = { return os.write(1, s.ptr, s.len: u64); }; export fn println(s: str) i64 = { let n: i64 = os.write(1, s.ptr, s.len: u64); if (n < 0) { return n; }; let m: i64 = os.write(1, "\n".ptr, 1u64); if (m < 0) { return m; }; return n + m; }; // errorln — write a message to stderr with a trailing newline. export fn errorln(s: str) i64 = { let n: i64 = os.write(2, s.ptr, s.len: u64); if (n < 0) { return n; }; let m: i64 = os.write(2, "\n".ptr, 1u64); if (m < 0) { return m; }; return n + m; }; // fprint / fprintln — same as print/println but on an arbitrary fd. // Used by the compiler to write to its -o output file. export fn fprint(fd: i32, s: str) i64 = { return os.write(fd, s.ptr, s.len: u64); }; export fn fprintln(fd: i32, s: str) i64 = { let n: i64 = os.write(fd, s.ptr, s.len: u64); if (n < 0) { return n; }; let m: i64 = os.write(fd, "\n".ptr, 1u64); if (m < 0) { return m; }; return n + m; };