//ww:run package main; import os; import fmt; import io; import memio; import temp; fn fresh() i32 = { let fd: i32 = -1; let path: str; match (temp.named(&fd, &path, "/tmp", temp.mode.RDWR, 0o600: i32)) { case void => void; case let e: os.oserror => return -1; }; if (os.remove(path) != 0) { os.close(fd); return -1; }; return fd; }; fn fileexpect(fd: i32, nw: size, want: str) bool = { if (os.lseek(fd, 0i64, os.whence.SET) != 0i64) { os.close(fd); return false; }; let buf: [16]u8; let n: i64 = os.read(fd, &buf[0], 16u64); let closed: i32 = os.close(fd); if (closed != 0 || n != want.len: i64 || nw != want.len: size) { return false; }; let i: i32 = 0; for (i < want.len) { if (buf[i] != want[i]) { return false; }; i += 1; }; return true; }; fn streq(a: str, b: str) bool = { if (a.len != b.len) { return false; }; let i: i32 = 0; for (i < a.len) { if (a[i] != b[i]) { return false; }; i += 1; }; return true; }; export fn main() i32 = { let fd: i32 = fresh(); if (fd < 0) { return 1; }; match (fmt.fprintln(fd: io.file, 1i64, "hi", true)) { case let n: size => { if (!fileexpect(fd, n, "1 hi true\n")) { return 2; }; }; case io.error => { os.close(fd); return 3; }; }; fd = fresh(); if (fd < 0) { return 4; }; match (fmt.fprintfln(fd: io.file, "x={}", 7i64)) { case let n: size => { if (!fileexpect(fd, n, "x=7\n")) { return 5; }; }; case io.error => { os.close(fd); return 6; }; }; let buf1: [16]u8; let st1: memio.stream = memio.fixed(buf1[0:16]); let s1: io.stream = &st1.vt; match (fmt.fprintln(s1, 1i64, "hi", true)) { case let n: size => { if (n != 10: size || !streq(memio.string(&st1), "1 hi true\n")) { return 7; }; }; case io.error => return 8; }; let buf2: [16]u8; let st2: memio.stream = memio.fixed(buf2[0:16]); let s2: io.stream = &st2.vt; match (fmt.fprintfln(s2, "x={}", 7i64)) { case let n: size => { if (n != 4: size || !streq(memio.string(&st2), "x=7\n")) { return 9; }; }; case io.error => return 10; }; let buf3: [16]u8; match (fmt.bsprintf(buf3[0:16], "v={}", 42i64)) { case let view: str => { if (!streq(view, "v=42") || buf3[0] != 118u8 || buf3[3] != 50u8) { return 11; }; }; case io.error => return 12; }; let view: str = fmt.asprintf("hello={}", 9i64); let asok: bool = streq(view, "hello=9"); os.free(view.ptr: *void, view.len: u64); if (!asok) { return 13; }; return 0; };