Bio

過去のしがらみからの解放でも書いたけど,Plan9ではstdioではなく,Bio (buffered io)を使う.Plan9にはtailはあってもheadがないので,headを書いてみよう.
bioを使うためには,bio.hをincludeする必要がある.関数名を見れば動作は予想できると思うが,ぱっと見てわかるstdioとの違いは,プログラマがバッファを確保する必要がない点だ.バッファはライブラリ内で必要に応じて用意される.もう一点,文字コードがASCIIではなくUnicodeである点が違う.Bioでは,文字をRuneと呼ばれる16ビット固定長のデータ型として扱う.一方,ファイル名やその内容はUTF-8で格納されるので,RuneUTF-8の変換関数も提供される(UTF-8とルーン文字).

#include <u.h>
#include <libc.h>
#include <bio.h>

void fatal(char *s);

void
main(int argc, char **argv)
{
	int fd;
	Biobuf bin, bout;
	char *p;
	int i, lines;

	lines = atoi(argv[1]);
	fd = open(argv[2], OREAD);
	if (fd == 0)
		fatal("argv[0]);
	Binit(&bin, fd, OREAD);
	Binit(&bout, 1, OWRITE);

	for (i = 0; i < lines; i++) {
		p = Brdline(&bin, '\n');
		if (p == nil)
			break;
		p[Blinelen(&bin)-1] = 0;
		Bprint(&bout, "%s\n", p);
	}

	exits(nil);
}

void
fatal(char *s)
{
	char buf[ERRMAX];

	errstr(buf, sizeof(buf));
	fprint(2, "%s: %s\n", s, buf);
	exits(s);
}