Landin library reference discuss source

compiler/tests/fixtures/runtime/library-common-tasks/main.ldn

1--  Number the lines of the file named on the command line, as `cat -n`
2--  does, and say in words why when it cannot be read.
3import core/failure
4import core/io
5import core/text
6import hosted/system
7
8--- Write each line of the file at `path` to `out` after its number.
9numbered: (inout out: io.buffered_writer(system.host), host: system.host,
10           path: text.host_string) -> none ! ... =
11    file := try io.open_read(host, path)
12    defer io.close(host, file) else none
13    mut buffer: [4096]u8 = zeroed
14    mut lines := io.lines_over(host, file, buffer)
15    mut number: u64 = 0
16    loop do
17        item := try io.read_line(lines)
18        break when item.finished
19        inc number
20        try io.format(out, "{}: {}\n", [any(addr number), any(addr item.bytes)])
21    end loop
22end numbered
23
24public main: () -> (code: i32) =
25    host := system.new()
26    mut storage: [256]u8 = zeroed
27    mut out := io.buffered_over(host, io.out(host), storage)
28    defer io.flush(out) else none
29    code = 1
30    path := io.argument_at(host, 0) else (problem)
31        io.write(host, io.err(host), "usage: number FILE\n") else none
32        return
33    end
34    numbered(out, host, path) else (problem)
35        io.write(host, io.err(host), text.host_bytes(path)) else none
36        io.write(host, io.err(host), ": ") else none
37        io.write(host, io.err(host), failure.words(problem)) else none
38        io.write(host, io.err(host), "\n") else none
39        return
40    end
41    code = 0
42end main