Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.
/cmd/read_file/main.ha (raw)
use aio;
use fmt;
use io;
use os;
let buf32: [32]u8 = [0...];
let buf: []u8 = buf32[..];
let ofs: size = 0;
export fn main() void = {
	let loop = aio::loop_new()!;
	let file = os::open("main.ha")!;
	aio::op_read(&loop, file, buf, ofs, &on_read, null, aio::submission_flags::NONE)!;
	aio::loop_submit(&loop)!;
	aio::loop_run(&loop);
	// loop_finish(&loop);
};
fn on_read(
	loop: *aio::loop,
	file: io::file,
	r: (size | io::EOF | io::error),
	flags: aio::completion_flags,
	user: nullable *opaque,
) void = {
	match (r) {
	case io::EOF => abort("EOF");
	case io::error => abort(io::strerror(r as io::error));
	case size => void;
	};
	io::write(os::stdout, buf[.. r as size])!;
	ofs += r as size;
	aio::op_read(loop, file, buf, ofs, &on_read, null, aio::submission_flags::NONE)!; // TODO: use multishot instead? or does that not work for files
	aio::loop_submit(loop)!;
};