shithub: mc

Download patch

ref: 20bb032dc16ab0a0a20e9a5705738c797ac4b3da
parent: ac02d84497997778d2c9680f5c7fc26b9814f62c
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Apr 12 20:46:24 EDT 2015

Add code to subdir in preparation for merging with mc.

--- a/Makefile
+++ /dev/null
@@ -1,11 +1,0 @@
-MYRLIB=bio
-MYRSRC= \
-	bio.myr \
-	puti.myr \
-	geti.myr
-
-include config.mk
-include mk/myr.mk
-
-check: all
-	make -C test check
--- a/bio.myr
+++ /dev/null
@@ -1,500 +1,0 @@
-use std
-
-pkg bio =
-	type mode = int
-	const Rd	: mode = 1
-	const Wr	: mode = 2
-	const Rw	: mode = 1 | 2
-
-	type file = struct
-		/* backing fd */
-		fd	: std.fd
-		mode	: mode
-
-		/* read buffer */
-		rbuf	: byte[:]
-		rstart	: std.size
-		rend	: std.size
-
-		/* write buffer */
-		wbuf	: byte[:]
-		wend	: std.size
-	;;
-
-	/* creation */
-	const mkfile	: (fd : std.fd, mode : mode	-> file#)
-	const open	: (path : byte[:], mode : mode	-> std.option(file#))
-	const dial	: (srv	: byte[:], mode : mode	-> std.option(file#))
-	const create	: (path : byte[:], mode : mode, perm : int	-> std.option(file#))
-	const close	: (f : file# -> bool)
-	const free	: (f : file# -> void)
-
-	/* basic i/o. Returns sub-buffer when applicable. */
-	const write	: (f : file#, src : byte[:]	-> std.size)
-	const read	: (f : file#, dst : byte[:]	-> std.option(byte[:]))
-	const flush	: (f : file# -> bool)
-
-	/* seeking */
-
-	/* single unit operations */
-	const putb	: (f : file#, b : byte	-> std.size)
-	const putc	: (f : file#, c : char	-> std.size)
-	const getb	: (f : file# -> std.option(byte))
-	const getc	: (f : file# -> std.option(char))
-
-	/* peeking */
-	const peekb	: (f : file# -> std.option(byte))
-	const peekc	: (f : file# -> std.option(char))
-
-	/* delimited read; returns freshly allocated buffer. */
-	const readln	: (f : file#	-> std.option(byte[:]))
-	const readto	: (f : file#, delim : byte[:]	-> std.option(byte[:]))
-	const skipto	: (f : file#, delim : byte[:]	-> bool)
-
-	/* formatted i/o */
-	const put	: (f : file#, fmt : byte[:], args : ... -> std.size)
-
-	/* pkg funcs */
-	pkglocal const ensureread	: (f : file#, n : std.size -> bool)
-	pkglocal const ensurewrite	: (f : file#, n : std.size -> bool)
-;;
-
-const Bufsz = 16*std.KiB
-const Small = 512
-
-/* Creates a file from an fd, opened in the given mode. */
-const mkfile = {fd, mode
-	var f
-
-	f = std.alloc()
-
-	f.fd = fd
-	f.mode = mode
-	if mode & Rd != 0
-		f.rbuf = std.slalloc(Bufsz)
-		f.rstart = 0
-		f.rend = 0
-	;;
-	if mode & Wr != 0
-		f.wbuf = std.slalloc(Bufsz)
-		f.wend = 0
-	;;
-	-> f
-}
-
-/* Opens a file with mode provided. */
-const open = {path, mode 
-	-> sysopen(path, mode, sysmode(mode), 0o777)
-}
-
-/*
-   Creates a file for the provided path, with opened in
-   the requested mode, with the requested permissions
-*/
-const create = {path, mode, perm
-	-> sysopen(path, mode, sysmode(mode) | std.Ocreat, perm)
-}
-
-/* dial the server, and open a file using the returned fd */
-const dial = {srv, mode
-	match std.dial(srv)
-	| `std.Ok sock:	-> `std.Some mkfile(sock, mode)
-	| `std.Fail _:	-> `std.None
-	;;
-}
-
-/* map from the bio modes to the unix open modes */
-const sysmode = {mode
-	match mode
-	| Rd:	-> std.Ordonly
-	| Wr:	-> std.Owronly
-	| Rw:	-> std.Ordwr
-	| _:	std.fatal(1, "bio: bad file mode")
-	;;
-	-> 0
-}
-
-/* open the file, and return it */
-const sysopen = {path, mode, openmode, perm
-	var fd
-
-	fd = std.openmode(path, openmode, perm castto(int64))
-	if fd < 0
-		-> `std.None
-	else
-		-> `std.Some mkfile(fd, mode)
-	;;
-}
-
-/* closes a file, flushing it to the output fd */
-const close = {f
-	var fd
-
-	fd = f.fd
-	free(f)
-	-> std.close(fd) == 0
-}
-
-const free = {f
-	flush(f)
-	if f.mode & Rd != 0
-		std.slfree(f.rbuf)
-	;;
-
-	if f.mode & Wr != 0
-		std.slfree(f.wbuf)
-	;;
-	std.free(f)
-}
-
-/* 
-writes to as much from `src` as possible to a file,
-returning the number of bytes written.
-*/
-const write = {f, src
-	std.assert(f.mode & Wr != 0, "File is not in write mode")
-	/*
-	Tack small writes onto the buffer end. Big ones
-	flush the buffer and then go right to kernel.
-	*/
-	if src.len < (f.wbuf.len - f.wend)
-		std.slcp(f.wbuf[f.wend:f.wend+src.len], src)
-		f.wend += src.len
-		-> src.len
-	else
-		flush(f)
-		-> writebuf(f.fd, src)
-	;;
-}
-
-/*
-reads as much into 'dst' as possible, up to the size of 'dst',
-returning the number of bytes read.
-*/
-const read = {f, dst
-	var n
-	var d
-	var count
-
-	std.assert(f.mode & Rd != 0, "File is not in read mode")
-	/* 
-	 * small reads should try to fill, so we don't have to make a
-	 * syscall for every read
-	 */
-	if dst.len < Small
-		fill(f, f.rbuf.len - f.rend)
-	;;
-	/* Read as much as we can from the buffer */
-	count = std.min(dst.len, f.rend - f.rstart)
-	std.slcp(dst[:count], f.rbuf[f.rstart:f.rstart+count])
-	f.rstart += count
-
-	/* if we drained the buffer, reset it */
-	if f.rstart == f.rend
-		f.rstart = 0
-		f.rend = 0
-	;;
-
-	/* Read the rest directly from the fd */
-	d = dst[count:]
-	while dst.len > 0
-		n = std.read(f.fd, d)
-		if n <= 0
-			goto readdone
-		;;
-		count += n
-		d = d[n:]
-	;;
-:readdone
-	if count > 0
-		-> `std.Some dst[:count]
-	else
-		-> `std.None
-	;;
-}
-
-/* flushes f out to the backing fd */
-const flush = {f
-	var ret
-
-	ret = true
-	if f.mode & Wr != 0
-		ret = (writebuf(f.fd, f.wbuf[:f.wend]) == f.wend)
-		f.wend = 0
-	;;
-	-> ret
-}
-
-/* writes a single byte to the output stream */
-const putb = {f, b
-	ensurewrite(f, 1)
-	f.wbuf[f.wend++] = b
-	-> 1
-}
-
-/* writes a single character to the output stream, encoded in utf8 */
-const putc = {f, c
-	var sz
-	
-	sz = std.charlen(c)
-	ensurewrite(f, sz)
-	std.encode(f.wbuf[f.wend:], c)
-	f.wend += sz
-	-> sz
-}
-
-/* reads a single byte from the input stream */
-const getb = {f
-	if ensureread(f, 1)
-		-> `std.Some f.rbuf[f.rstart++]
-	;;
-	-> `std.None
-}
-
-/* reads a single character from the input stream, encoded in utf8 */
-const getc = {f
-	var c
-
-	if ensurecodepoint(f)
-		c = std.decode(f.rbuf[f.rstart:f.rend])
-		f.rstart += std.charlen(c)
-		-> `std.Some c
-	;;
-	-> `std.None
-}
-
-/* ensures we have enough to read a single codepoint in the buffer */
-const ensurecodepoint = {f
-	var b
-	var len
-
-	if !ensureread(f, 1)
-		-> false
-	;;
-	b = f.rbuf[f.rstart]
-	if b & 0x80 == 0	/* 0b0xxx_xxxx */
-		len = 1
-	elif b & 0xe0 == 0xc0	/* 0b110x_xxxx */
-		len = 2
-	elif b & 0xf0 == 0xe0 	/* 0b1110_xxxx */
-		len = 3
-	elif b & 0xf8 == 0xf0 	/* 0b1111_0xxx */
-		len = 4
-	else
-		len = 1		/* invalid unicode char */
-	;;
-	-> ensureread(f, len)
-}
-
-/*
-  writes a single integer-like value to the output stream, in
-  little endian format
-*/
-generic putle = {f, v : @a::(numeric,integral)
-	var i
-
-	for i = 0; i < sizeof(@a); i++
-		putb(f, (v & 0xff) castto(byte))
-		v >>= 8
-	;;
-	-> sizeof(@a)
-}
-
-/*
-  writes a single integer-like value to the output stream, in
-  big endian format
-*/
-generic putbe = {f, v : @a::(numeric,integral)
-	var i
-
-	for i = sizeof(@a); i != 0; i--
-		putb(f, ((v >> ((i-1)*8)) & 0xff) castto(byte))
-	;;
-	-> sizeof(@a)
-}
-
-
-/* peeks a single byte from an input stream */
-const peekb = {f
-	if !ensureread(f, 1)
-		-> `std.None
-	else
-		-> `std.Some f.rbuf[f.rstart]
-	;;
-}
-
-/* peeks a single character from a utf8 encoded input stream */
-const peekc = {f
-	if !ensurecodepoint(f)
-		-> `std.None
-	else
-		-> `std.Some std.decode(f.rbuf[f.rstart:f.rend])
-	;;
-}
-
-/*
-  reads up to a single character delimiter. drops the delimiter
-  from the input stream. EOF always counts as a delimiter.
-  
-  Eg, with the input "foo,bar\n"
-
-  	bio.readto(f, ',')	-> "foo"
-  	bio.readto(f, ',')	-> "bar\n"
-*/
-const readto = {f, delim
-	-> readdelim(f, delim, false)
-}
-
-/* same as readto, but drops the read data. */
-const skipto = {f, delim
-	match readdelim(f, delim, true)
-	| `std.Some ret:	-> true
-	| `std.None:	-> false
-	;;
-}
-
-/* Same as readto, but the delimiter is always a '\n' */
-const readln = {f
-	-> readto(f, "\n")
-}
-
-const readdelim = {f, delim, drop
-	var ret
-	var i, j
-
-	ret = [][:]
-	while true
-		if !ensureread(f, delim.len)
-			if !drop
-				ret = readinto(f, ret, f.rend - f.rstart)
-			;;
-			if ret.len > 0
-				-> `std.Some ret
-			else
-				-> `std.None
-			;;
-		;;
-		for i = f.rstart; i < f.rend; i++
-			if f.rbuf[i] == delim[0]
-				for j = 0; j < delim.len; j++
-					if f.rbuf[i + j] != delim[j]
-						goto nextiterread
-					;;
-				;;
-				if !drop
-					ret = readinto(f, ret, i - f.rstart)
-				;;
-				f.rstart += delim.len
-				-> `std.Some ret
-			;;
-:nextiterread
-		;;
-		if !drop
-			ret = readinto(f, ret, f.rend - f.rstart)
-		;;
-	;;
-	std.die("unreachable")
-}
-
-/*
-Same as std.put, but buffered. Returns the number of bytes written.
-
-FIXME: depends on std.fmt() having a flush buffer API. Until then,
-we're stuck with a small static buffer.
-*/
-const put = {f, fmt, args
-	var buf : byte[2048]
-	var sl
-
-	sl = std.bfmt(buf[:], fmt, std.vastart(&args))
-	-> write(f, sl)
-}
-
-/* 
-reads n bytes from the read buffer onto the heap-allocated slice
-provided.
-*/
-const readinto = {f, buf, n
-	var ret
-
-	std.assert(f.rstart + n <= f.rend, "Reading too much from buffer")
-	ret = std.sljoin(buf, f.rbuf[f.rstart:f.rstart + n])
-	f.rstart += n
-	-> ret
-}
-
-/* makes sure we can bufferedly write at least n bytes */
-const ensurewrite = {f, n
-	std.assert(n < f.wbuf.len, "ensured write capacity > buffer size")
-	if n > f.wbuf.len - f.wend
-		-> flush(f)
-	;;
-	-> true
-}
-
-/*
-makes sure we have at least n bytes buffered. returns true if we succeed
-in buffering n bytes, false if we fail.
-*/
-const ensureread = {f, n
-	var held
-	var cap
-
-	std.assert(n < f.rbuf.len, "ensured read capacity > buffer size")
-	held = f.rend - f.rstart
-	if n > held
-		/* if we need to shift the slice down to the start, do it */
-		cap = f.rend - f.rstart
-		if n > (cap + held)
-			std.slcp(f.rbuf[:cap], f.rbuf[f.rstart:f.rend])
-			f.rstart = 0
-			f.rend = cap
-		;;
-		-> fill(f, n) > n
-	else
-		-> true
-	;;
-}
-
-/* blats a buffer to an fd */
-const writebuf = {fd, src
-	var n
-	var count
-
-	count = 0
-	while src.len != 0
-		n = std.write(fd, src)
-		if n <= 0
-			goto writedone
-		;;
-		count += n
-		src = src[n:]
-	;;
-:writedone
-	-> count
-}
-
-
-
-/*
-Reads as many bytes as possible from the file into
-the read buffer.
-*/
-const fill = {f, min
-	var n
-	var count
-
-	count = 0
-	while count < min
-		n = std.read(f.fd, f.rbuf[f.rend:])
-		if n <= 0
-			goto filldone
-		;;
-		count += n
-		f.rend += n
-	;;
-:filldone
-	-> count
-}
-
-
--- a/bldfile
+++ /dev/null
@@ -1,5 +1,0 @@
-lib bio = 
-	bio.myr
-	geti.myr
-	puti.myr
-;;
--- a/configure
+++ /dev/null
@@ -1,52 +1,0 @@
-#!/bin/sh
-
-prefix="/usr/local"
-
-for i in `seq 300`; do
-    echo "Lots of output to emulate automake... ok"
-    echo "Testing for things you'll never use... fail"
-    echo "Satisfying the fortran77 lobby... ok"
-    echo "Burning CPU time checking for the bloody obvious... ok"
-done
-echo "Automake emulated successfully"
-
-INST_ROOT='/usr/local'
-
-for arg in $*; do
-    shift 1
-    case $arg in
-        "--prefix" | "-p")
-            prefix=shift $*
-            ;;
-        --prefix=*)
-            prefix=`echo $arg | sed 's/^--prefix=//g'`
-            ;;
-        "--help" | "-h")
-            echo "Usage:"
-            echo "      --prefix | -p: The prefix to install to"
-            break;
-            ;;
-        *) echo "Unrecognized argument $arg";;
-    esac
-done
-
-OS=`uname`
-
-echo export INST_ROOT=$prefix > config.mk
-case $OS in
-    *Linux*)
-        echo 'export SYS=linux' >> config.mk
-        ;;
-    *Darwin*)
-        echo 'export SYS=osx' >> config.mk
-        ;;
-    *)
-        echo 'Unknown architecture.'
-        ;;
-esac
-
-cat << EOF
-    Building with:
-        prefix=$prefix
-EOF
-
--- a/geti.myr
+++ /dev/null
@@ -1,63 +1,0 @@
-use std
-
-use "bio.use"
-
-pkg bio =
-	/* unsigned big endian */
-	generic getbe8	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getbe16	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getbe32	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getbe64	: (f : file# -> std.option(@a::(numeric,integral)))
-
-	/* signed big endian */
-	generic getle8	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getle16	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getle32	: (f : file# -> std.option(@a::(numeric,integral)))
-	generic getle64	: (f : file# -> std.option(@a::(numeric,integral)))
-;;
-
-/*
-  reads a single integer-like value to the output stream, in
-  little endian format
-*/
-generic getle = {f, n -> std.option(@a::(numeric,integral))
-	var v, i
-
-	v = 0
-	if !ensureread(f, n)
-		-> `std.None
-	;;
-	for i = 0; i < n; i++
-		v |= (f.rbuf[f.rstart++] castto(uint64)) << (8*(i castto(uint64)))
-	;;
-	-> `std.Some v castto(@a::(numeric,integral))
-}
-
-/*
-  reads a single integer-like value to the output stream, in
-  big endian format
-*/
-generic getbe = {f, n -> std.option(@a::(numeric,integral))
-	var v, i
-
-	v = 0
-	if !ensureread(f,n)
-		-> `std.None
-	;;
-	for i = 0; i < n; i++
-		v <<= 8
-		v |= (f.rbuf[f.rstart++] castto(uint64))
-	;;
-	-> `std.Some v castto(@a::(numeric,integral))
-}
-
-generic getbe8  = {f; -> getbe(f, 1)}
-generic getbe16 = {f; -> getbe(f, 2)}
-generic getbe32 = {f; -> getbe(f, 4)}
-generic getbe64 = {f; -> getbe(f, 8)}
-
-generic getle8  = {f; -> getle(f, 1)}
-generic getle16 = {f; -> getle(f, 2)}
-generic getle32 = {f; -> getle(f, 4)}
-generic getle64 = {f; -> getle(f, 8)}
-
--- /dev/null
+++ b/libbio/Makefile
@@ -1,0 +1,11 @@
+MYRLIB=bio
+MYRSRC= \
+	bio.myr \
+	puti.myr \
+	geti.myr
+
+include config.mk
+include mk/myr.mk
+
+check: all
+	make -C test check
--- /dev/null
+++ b/libbio/bio.myr
@@ -1,0 +1,500 @@
+use std
+
+pkg bio =
+	type mode = int
+	const Rd	: mode = 1
+	const Wr	: mode = 2
+	const Rw	: mode = 1 | 2
+
+	type file = struct
+		/* backing fd */
+		fd	: std.fd
+		mode	: mode
+
+		/* read buffer */
+		rbuf	: byte[:]
+		rstart	: std.size
+		rend	: std.size
+
+		/* write buffer */
+		wbuf	: byte[:]
+		wend	: std.size
+	;;
+
+	/* creation */
+	const mkfile	: (fd : std.fd, mode : mode	-> file#)
+	const open	: (path : byte[:], mode : mode	-> std.option(file#))
+	const dial	: (srv	: byte[:], mode : mode	-> std.option(file#))
+	const create	: (path : byte[:], mode : mode, perm : int	-> std.option(file#))
+	const close	: (f : file# -> bool)
+	const free	: (f : file# -> void)
+
+	/* basic i/o. Returns sub-buffer when applicable. */
+	const write	: (f : file#, src : byte[:]	-> std.size)
+	const read	: (f : file#, dst : byte[:]	-> std.option(byte[:]))
+	const flush	: (f : file# -> bool)
+
+	/* seeking */
+
+	/* single unit operations */
+	const putb	: (f : file#, b : byte	-> std.size)
+	const putc	: (f : file#, c : char	-> std.size)
+	const getb	: (f : file# -> std.option(byte))
+	const getc	: (f : file# -> std.option(char))
+
+	/* peeking */
+	const peekb	: (f : file# -> std.option(byte))
+	const peekc	: (f : file# -> std.option(char))
+
+	/* delimited read; returns freshly allocated buffer. */
+	const readln	: (f : file#	-> std.option(byte[:]))
+	const readto	: (f : file#, delim : byte[:]	-> std.option(byte[:]))
+	const skipto	: (f : file#, delim : byte[:]	-> bool)
+
+	/* formatted i/o */
+	const put	: (f : file#, fmt : byte[:], args : ... -> std.size)
+
+	/* pkg funcs */
+	pkglocal const ensureread	: (f : file#, n : std.size -> bool)
+	pkglocal const ensurewrite	: (f : file#, n : std.size -> bool)
+;;
+
+const Bufsz = 16*std.KiB
+const Small = 512
+
+/* Creates a file from an fd, opened in the given mode. */
+const mkfile = {fd, mode
+	var f
+
+	f = std.alloc()
+
+	f.fd = fd
+	f.mode = mode
+	if mode & Rd != 0
+		f.rbuf = std.slalloc(Bufsz)
+		f.rstart = 0
+		f.rend = 0
+	;;
+	if mode & Wr != 0
+		f.wbuf = std.slalloc(Bufsz)
+		f.wend = 0
+	;;
+	-> f
+}
+
+/* Opens a file with mode provided. */
+const open = {path, mode 
+	-> sysopen(path, mode, sysmode(mode), 0o777)
+}
+
+/*
+   Creates a file for the provided path, with opened in
+   the requested mode, with the requested permissions
+*/
+const create = {path, mode, perm
+	-> sysopen(path, mode, sysmode(mode) | std.Ocreat, perm)
+}
+
+/* dial the server, and open a file using the returned fd */
+const dial = {srv, mode
+	match std.dial(srv)
+	| `std.Ok sock:	-> `std.Some mkfile(sock, mode)
+	| `std.Fail _:	-> `std.None
+	;;
+}
+
+/* map from the bio modes to the unix open modes */
+const sysmode = {mode
+	match mode
+	| Rd:	-> std.Ordonly
+	| Wr:	-> std.Owronly
+	| Rw:	-> std.Ordwr
+	| _:	std.fatal(1, "bio: bad file mode")
+	;;
+	-> 0
+}
+
+/* open the file, and return it */
+const sysopen = {path, mode, openmode, perm
+	var fd
+
+	fd = std.openmode(path, openmode, perm castto(int64))
+	if fd < 0
+		-> `std.None
+	else
+		-> `std.Some mkfile(fd, mode)
+	;;
+}
+
+/* closes a file, flushing it to the output fd */
+const close = {f
+	var fd
+
+	fd = f.fd
+	free(f)
+	-> std.close(fd) == 0
+}
+
+const free = {f
+	flush(f)
+	if f.mode & Rd != 0
+		std.slfree(f.rbuf)
+	;;
+
+	if f.mode & Wr != 0
+		std.slfree(f.wbuf)
+	;;
+	std.free(f)
+}
+
+/* 
+writes to as much from `src` as possible to a file,
+returning the number of bytes written.
+*/
+const write = {f, src
+	std.assert(f.mode & Wr != 0, "File is not in write mode")
+	/*
+	Tack small writes onto the buffer end. Big ones
+	flush the buffer and then go right to kernel.
+	*/
+	if src.len < (f.wbuf.len - f.wend)
+		std.slcp(f.wbuf[f.wend:f.wend+src.len], src)
+		f.wend += src.len
+		-> src.len
+	else
+		flush(f)
+		-> writebuf(f.fd, src)
+	;;
+}
+
+/*
+reads as much into 'dst' as possible, up to the size of 'dst',
+returning the number of bytes read.
+*/
+const read = {f, dst
+	var n
+	var d
+	var count
+
+	std.assert(f.mode & Rd != 0, "File is not in read mode")
+	/* 
+	 * small reads should try to fill, so we don't have to make a
+	 * syscall for every read
+	 */
+	if dst.len < Small
+		fill(f, f.rbuf.len - f.rend)
+	;;
+	/* Read as much as we can from the buffer */
+	count = std.min(dst.len, f.rend - f.rstart)
+	std.slcp(dst[:count], f.rbuf[f.rstart:f.rstart+count])
+	f.rstart += count
+
+	/* if we drained the buffer, reset it */
+	if f.rstart == f.rend
+		f.rstart = 0
+		f.rend = 0
+	;;
+
+	/* Read the rest directly from the fd */
+	d = dst[count:]
+	while dst.len > 0
+		n = std.read(f.fd, d)
+		if n <= 0
+			goto readdone
+		;;
+		count += n
+		d = d[n:]
+	;;
+:readdone
+	if count > 0
+		-> `std.Some dst[:count]
+	else
+		-> `std.None
+	;;
+}
+
+/* flushes f out to the backing fd */
+const flush = {f
+	var ret
+
+	ret = true
+	if f.mode & Wr != 0
+		ret = (writebuf(f.fd, f.wbuf[:f.wend]) == f.wend)
+		f.wend = 0
+	;;
+	-> ret
+}
+
+/* writes a single byte to the output stream */
+const putb = {f, b
+	ensurewrite(f, 1)
+	f.wbuf[f.wend++] = b
+	-> 1
+}
+
+/* writes a single character to the output stream, encoded in utf8 */
+const putc = {f, c
+	var sz
+	
+	sz = std.charlen(c)
+	ensurewrite(f, sz)
+	std.encode(f.wbuf[f.wend:], c)
+	f.wend += sz
+	-> sz
+}
+
+/* reads a single byte from the input stream */
+const getb = {f
+	if ensureread(f, 1)
+		-> `std.Some f.rbuf[f.rstart++]
+	;;
+	-> `std.None
+}
+
+/* reads a single character from the input stream, encoded in utf8 */
+const getc = {f
+	var c
+
+	if ensurecodepoint(f)
+		c = std.decode(f.rbuf[f.rstart:f.rend])
+		f.rstart += std.charlen(c)
+		-> `std.Some c
+	;;
+	-> `std.None
+}
+
+/* ensures we have enough to read a single codepoint in the buffer */
+const ensurecodepoint = {f
+	var b
+	var len
+
+	if !ensureread(f, 1)
+		-> false
+	;;
+	b = f.rbuf[f.rstart]
+	if b & 0x80 == 0	/* 0b0xxx_xxxx */
+		len = 1
+	elif b & 0xe0 == 0xc0	/* 0b110x_xxxx */
+		len = 2
+	elif b & 0xf0 == 0xe0 	/* 0b1110_xxxx */
+		len = 3
+	elif b & 0xf8 == 0xf0 	/* 0b1111_0xxx */
+		len = 4
+	else
+		len = 1		/* invalid unicode char */
+	;;
+	-> ensureread(f, len)
+}
+
+/*
+  writes a single integer-like value to the output stream, in
+  little endian format
+*/
+generic putle = {f, v : @a::(numeric,integral)
+	var i
+
+	for i = 0; i < sizeof(@a); i++
+		putb(f, (v & 0xff) castto(byte))
+		v >>= 8
+	;;
+	-> sizeof(@a)
+}
+
+/*
+  writes a single integer-like value to the output stream, in
+  big endian format
+*/
+generic putbe = {f, v : @a::(numeric,integral)
+	var i
+
+	for i = sizeof(@a); i != 0; i--
+		putb(f, ((v >> ((i-1)*8)) & 0xff) castto(byte))
+	;;
+	-> sizeof(@a)
+}
+
+
+/* peeks a single byte from an input stream */
+const peekb = {f
+	if !ensureread(f, 1)
+		-> `std.None
+	else
+		-> `std.Some f.rbuf[f.rstart]
+	;;
+}
+
+/* peeks a single character from a utf8 encoded input stream */
+const peekc = {f
+	if !ensurecodepoint(f)
+		-> `std.None
+	else
+		-> `std.Some std.decode(f.rbuf[f.rstart:f.rend])
+	;;
+}
+
+/*
+  reads up to a single character delimiter. drops the delimiter
+  from the input stream. EOF always counts as a delimiter.
+  
+  Eg, with the input "foo,bar\n"
+
+  	bio.readto(f, ',')	-> "foo"
+  	bio.readto(f, ',')	-> "bar\n"
+*/
+const readto = {f, delim
+	-> readdelim(f, delim, false)
+}
+
+/* same as readto, but drops the read data. */
+const skipto = {f, delim
+	match readdelim(f, delim, true)
+	| `std.Some ret:	-> true
+	| `std.None:	-> false
+	;;
+}
+
+/* Same as readto, but the delimiter is always a '\n' */
+const readln = {f
+	-> readto(f, "\n")
+}
+
+const readdelim = {f, delim, drop
+	var ret
+	var i, j
+
+	ret = [][:]
+	while true
+		if !ensureread(f, delim.len)
+			if !drop
+				ret = readinto(f, ret, f.rend - f.rstart)
+			;;
+			if ret.len > 0
+				-> `std.Some ret
+			else
+				-> `std.None
+			;;
+		;;
+		for i = f.rstart; i < f.rend; i++
+			if f.rbuf[i] == delim[0]
+				for j = 0; j < delim.len; j++
+					if f.rbuf[i + j] != delim[j]
+						goto nextiterread
+					;;
+				;;
+				if !drop
+					ret = readinto(f, ret, i - f.rstart)
+				;;
+				f.rstart += delim.len
+				-> `std.Some ret
+			;;
+:nextiterread
+		;;
+		if !drop
+			ret = readinto(f, ret, f.rend - f.rstart)
+		;;
+	;;
+	std.die("unreachable")
+}
+
+/*
+Same as std.put, but buffered. Returns the number of bytes written.
+
+FIXME: depends on std.fmt() having a flush buffer API. Until then,
+we're stuck with a small static buffer.
+*/
+const put = {f, fmt, args
+	var buf : byte[2048]
+	var sl
+
+	sl = std.bfmt(buf[:], fmt, std.vastart(&args))
+	-> write(f, sl)
+}
+
+/* 
+reads n bytes from the read buffer onto the heap-allocated slice
+provided.
+*/
+const readinto = {f, buf, n
+	var ret
+
+	std.assert(f.rstart + n <= f.rend, "Reading too much from buffer")
+	ret = std.sljoin(buf, f.rbuf[f.rstart:f.rstart + n])
+	f.rstart += n
+	-> ret
+}
+
+/* makes sure we can bufferedly write at least n bytes */
+const ensurewrite = {f, n
+	std.assert(n < f.wbuf.len, "ensured write capacity > buffer size")
+	if n > f.wbuf.len - f.wend
+		-> flush(f)
+	;;
+	-> true
+}
+
+/*
+makes sure we have at least n bytes buffered. returns true if we succeed
+in buffering n bytes, false if we fail.
+*/
+const ensureread = {f, n
+	var held
+	var cap
+
+	std.assert(n < f.rbuf.len, "ensured read capacity > buffer size")
+	held = f.rend - f.rstart
+	if n > held
+		/* if we need to shift the slice down to the start, do it */
+		cap = f.rend - f.rstart
+		if n > (cap + held)
+			std.slcp(f.rbuf[:cap], f.rbuf[f.rstart:f.rend])
+			f.rstart = 0
+			f.rend = cap
+		;;
+		-> fill(f, n) > n
+	else
+		-> true
+	;;
+}
+
+/* blats a buffer to an fd */
+const writebuf = {fd, src
+	var n
+	var count
+
+	count = 0
+	while src.len != 0
+		n = std.write(fd, src)
+		if n <= 0
+			goto writedone
+		;;
+		count += n
+		src = src[n:]
+	;;
+:writedone
+	-> count
+}
+
+
+
+/*
+Reads as many bytes as possible from the file into
+the read buffer.
+*/
+const fill = {f, min
+	var n
+	var count
+
+	count = 0
+	while count < min
+		n = std.read(f.fd, f.rbuf[f.rend:])
+		if n <= 0
+			goto filldone
+		;;
+		count += n
+		f.rend += n
+	;;
+:filldone
+	-> count
+}
+
+
--- /dev/null
+++ b/libbio/bldfile
@@ -1,0 +1,5 @@
+lib bio = 
+	bio.myr
+	geti.myr
+	puti.myr
+;;
--- /dev/null
+++ b/libbio/configure
@@ -1,0 +1,52 @@
+#!/bin/sh
+
+prefix="/usr/local"
+
+for i in `seq 300`; do
+    echo "Lots of output to emulate automake... ok"
+    echo "Testing for things you'll never use... fail"
+    echo "Satisfying the fortran77 lobby... ok"
+    echo "Burning CPU time checking for the bloody obvious... ok"
+done
+echo "Automake emulated successfully"
+
+INST_ROOT='/usr/local'
+
+for arg in $*; do
+    shift 1
+    case $arg in
+        "--prefix" | "-p")
+            prefix=shift $*
+            ;;
+        --prefix=*)
+            prefix=`echo $arg | sed 's/^--prefix=//g'`
+            ;;
+        "--help" | "-h")
+            echo "Usage:"
+            echo "      --prefix | -p: The prefix to install to"
+            break;
+            ;;
+        *) echo "Unrecognized argument $arg";;
+    esac
+done
+
+OS=`uname`
+
+echo export INST_ROOT=$prefix > config.mk
+case $OS in
+    *Linux*)
+        echo 'export SYS=linux' >> config.mk
+        ;;
+    *Darwin*)
+        echo 'export SYS=osx' >> config.mk
+        ;;
+    *)
+        echo 'Unknown architecture.'
+        ;;
+esac
+
+cat << EOF
+    Building with:
+        prefix=$prefix
+EOF
+
--- /dev/null
+++ b/libbio/geti.myr
@@ -1,0 +1,63 @@
+use std
+
+use "bio.use"
+
+pkg bio =
+	/* unsigned big endian */
+	generic getbe8	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getbe16	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getbe32	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getbe64	: (f : file# -> std.option(@a::(numeric,integral)))
+
+	/* signed big endian */
+	generic getle8	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getle16	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getle32	: (f : file# -> std.option(@a::(numeric,integral)))
+	generic getle64	: (f : file# -> std.option(@a::(numeric,integral)))
+;;
+
+/*
+  reads a single integer-like value to the output stream, in
+  little endian format
+*/
+generic getle = {f, n -> std.option(@a::(numeric,integral))
+	var v, i
+
+	v = 0
+	if !ensureread(f, n)
+		-> `std.None
+	;;
+	for i = 0; i < n; i++
+		v |= (f.rbuf[f.rstart++] castto(uint64)) << (8*(i castto(uint64)))
+	;;
+	-> `std.Some v castto(@a::(numeric,integral))
+}
+
+/*
+  reads a single integer-like value to the output stream, in
+  big endian format
+*/
+generic getbe = {f, n -> std.option(@a::(numeric,integral))
+	var v, i
+
+	v = 0
+	if !ensureread(f,n)
+		-> `std.None
+	;;
+	for i = 0; i < n; i++
+		v <<= 8
+		v |= (f.rbuf[f.rstart++] castto(uint64))
+	;;
+	-> `std.Some v castto(@a::(numeric,integral))
+}
+
+generic getbe8  = {f; -> getbe(f, 1)}
+generic getbe16 = {f; -> getbe(f, 2)}
+generic getbe32 = {f; -> getbe(f, 4)}
+generic getbe64 = {f; -> getbe(f, 8)}
+
+generic getle8  = {f; -> getle(f, 1)}
+generic getle16 = {f; -> getle(f, 2)}
+generic getle32 = {f; -> getle(f, 4)}
+generic getle64 = {f; -> getle(f, 8)}
+
--- /dev/null
+++ b/libbio/mk/myr.mk
@@ -1,0 +1,97 @@
+ifneq ($(MYRLIB),)
+    _LIBNAME=lib$(MYRLIB).a
+endif
+
+all: subdirs $(_LIBNAME) $(MYRBIN) 
+
+subdirs:
+	@for i in $(SUB); do (\
+	    cd $$i && \
+	    $(MAKE) || \
+	    exit 1 \
+	) || exit 1; done
+
+subdirs-clean:
+	@for i in $(SUB); do (\
+	    cd $$i && \
+	    $(MAKE) clean|| \
+	    exit 1 \
+	); done
+
+subdirs-install:
+	@for i in $(SUB); do (\
+	    cd $$i && \
+	    $(MAKE) install|| \
+	    exit 1 \
+	); done
+
+subdirs-uninstall:
+	@for i in $(SUB); do (\
+	    cd $$i && \
+	    $(MAKE) uninstall|| \
+	    exit 1 \
+	); done
+
+$(_LIBNAME): $(MYRSRC) $(ASMSRC)
+	myrbuild -l $(MYRLIB) $^
+
+$(MYRBIN): $(MYRSRC) $(ASMSRC)
+	myrbuild -b $(MYRBIN) $^
+
+OBJ=$(MYRSRC:.myr=.o) $(ASMSRC:.s=.o)
+USE=$(MYRSRC:.myr=.use) $(MYRLIB)
+.PHONY: clean
+clean: subdirs-clean
+	rm -f $(OBJ)
+	rm -f $(USE)
+	@if [ ! -z "$(MYRLIB)" ]; then \
+	    echo rm -f $(MYRLIB); \
+	    rm -f $(MYRLIB); \
+	    echo rm -f lib$(MYRLIB).a; \
+	    rm -f lib$(MYRLIB).a; \
+	fi
+	@if [ ! -z "$(MYRBIN)" ]; then \
+	    echo rm -f $(MYRBIN); \
+	    rm -f $(MYRBIN); \
+	    echo rm -f lib$(MYRBIN).a; \
+	    rm -f lib$(MYRBIN).a; \
+	fi
+
+install: subdirs-install $(MYRBIN) $(_LIBNAME) $(MAN)
+	@if [ ! -z "$(MYRBIN)" ]; then \
+	    echo install $(MYRBIN) $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
+	    mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
+	    install $(MYRBIN) $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
+	fi
+	@if [ ! -z "$(_LIBNAME)" ]; then \
+		echo install -m 644 $(_LIBNAME) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
+		echo install -m 644 $(MYRLIB) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
+		mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
+		install -m 644 $(_LIBNAME) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
+		install -m 644 $(MYRLIB) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
+	fi
+	@for i in $(MAN); do \
+	    MANSECT=$$(echo $$i | awk -F. '{print $$NF}'); \
+	    echo mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$$MANSECT); \
+	    echo install -m 644 $(MAN) $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}); \
+	    mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$$MANSECT); \
+	    install -m 644 $(MAN) $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}); \
+	done \
+
+uninstall: subdirs-uninstall
+	@for i in $(MYRBIN); do \
+	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/bin/$$i); \
+	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/bin/$$i); \
+	done
+	@for i in $(_LIBNAME) $(MYRLIB); do \
+	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr/$$i); \
+	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr/$$i); \
+	done
+	@for i in $(MAN); do \
+	    MANSECT=$$(echo $$i | awk -F. '{print $$NF}'); \
+	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}/$$i); \
+	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}/$$i); \
+	done
+
+config.mk:
+	./configure
--- /dev/null
+++ b/libbio/puti.myr
@@ -1,0 +1,62 @@
+use std
+
+use "bio.use"
+
+pkg bio =
+	/* unsigned big endian */
+	generic putbe8	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putbe16	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putbe32	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putbe64	: (f : file#, v : @a::(numeric,integral) -> std.size)
+
+	/* unsigned little endian */
+	generic putle8	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putle16	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putle32	: (f : file#, v : @a::(numeric,integral) -> std.size)
+	generic putle64	: (f : file#, v : @a::(numeric,integral) -> std.size)
+;;
+
+generic putbe8  = {f, v; -> putbe(f, v castto(uint64), 1)}
+generic putbe16 = {f, v; -> putbe(f, v castto(uint64), 2)}
+generic putbe32 = {f, v; -> putbe(f, v castto(uint64), 4)}
+generic putbe64 = {f, v; -> putbe(f, v castto(uint64), 8)}
+
+generic putle8  = {f, v; -> putle(f, v castto(uint64), 1)}
+generic putle16 = {f, v; -> putle(f, v castto(uint64), 2)}
+generic putle32 = {f, v; -> putle(f, v castto(uint64), 4)}
+generic putle64 = {f, v; -> putle(f, v castto(uint64), 8)}
+
+const putle = {f, v, n
+	var buf : byte[8]
+
+	if !ensurewrite(f, n)
+		-> 0
+	;;
+	buf[0] = (v >> 0) & 0xff castto(byte)
+	buf[1] = (v >> 8) & 0xff castto(byte)
+	buf[2] = (v >> 16) & 0xff castto(byte)
+	buf[3] = (v >> 24) & 0xff castto(byte)
+	buf[4] = (v >> 32) & 0xff castto(byte)
+	buf[5] = (v >> 40) & 0xff castto(byte)
+	buf[6] = (v >> 48) & 0xff castto(byte)
+	buf[7] = (v >> 56) & 0xff castto(byte)
+	write(f, buf[:n])
+}
+
+const putbe = {f, v, n
+	var buf : byte[8]
+
+	if !ensurewrite(f, n)
+		-> 0
+	;;
+	buf[0] = (v >> 56) & 0xff castto(byte)
+	buf[1] = (v >> 48) & 0xff castto(byte)
+	buf[2] = (v >> 40) & 0xff castto(byte)
+	buf[3] = (v >> 32) & 0xff castto(byte)
+	buf[4] = (v >> 24) & 0xff castto(byte)
+	buf[5] = (v >> 16) & 0xff castto(byte)
+	buf[6] = (v >> 8) & 0xff castto(byte)
+	buf[7] = (v >> 0) & 0xff castto(byte)
+	write(f, buf[8-n:])
+}
+
--- /dev/null
+++ b/libbio/test/Makefile
@@ -1,0 +1,20 @@
+# don't build anything for 'all'
+all: 
+	$(MAKE) -C ..
+
+check:
+	./runtest.sh
+
+.PHONY: %
+%:
+	./runtest.sh $@
+
+.PHONY: clean
+clean:
+	rm -f testmatch.use testmatch.o
+	@for i in `awk '/^[A-Z]/{print $$2}' tests`; do \
+	    echo rm -f $$i; \
+	    rm -f $$i; \
+	done
+
+install:
--- /dev/null
+++ b/libbio/test/bio-create.myr
@@ -1,0 +1,13 @@
+use std
+use bio
+
+const main = {
+	var f
+
+	std.mkdir("tmpout", 0o755);
+	match bio.create("tmpout/test-create", bio.Wr, 0o644)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Failed to open file\n")
+	;;
+	bio.close(f)
+}
--- /dev/null
+++ b/libbio/test/bio-delim.myr
@@ -1,0 +1,70 @@
+use std
+use bio
+
+const main = {
+	var f
+	var d
+
+	match bio.open("data/lines", bio.Rd)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file\n")
+	;;
+
+	/* read first line */
+	d = readln(f)
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* read second line, should not include \n */
+	d = readln(f)
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* read to ';' */
+	d = readto(f, ";")
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* read to ';'  again */
+	d = readto(f, ";")
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* '--'  this time */
+	d = readto(f, "--")
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* and without the terminator, we should get the remaining text */
+	d = readto(f, "not-there")
+	std.write(1, d)
+	std.write(1, "\n")
+	std.slfree(d)
+
+	/* and now, eof */
+	d = readln(f)
+	d = readto(f, "actually, eof")
+	
+	bio.close(f)
+}
+
+const readln = {f
+	match bio.readln(f)
+	| `std.Some d:	-> d
+	| `std.None:	std.put("eof\n")
+			-> [][:]
+	;;
+}
+
+const readto = {f, delim
+	match bio.readto(f, delim)
+	| `std.Some d:	-> d
+	| `std.None:	std.put("eof\n")
+			-> [][:]
+	;;
+}
--- /dev/null
+++ b/libbio/test/bio-endianrd.myr
@@ -1,0 +1,57 @@
+use std
+use bio
+
+generic try = {opt : std.option(@a::(integral,numeric))-> @a::(integral,numeric)
+	match opt
+	| `std.Some val:	-> val
+	| `std.None:	std.fatal(1, "read failed")
+	;;
+}
+const main = {
+	var b : byte
+	var w : uint16
+	var l : uint32
+	var q : uint64
+	var f
+
+	/* use the expected write data as read data */
+	match bio.open("data/bio-endianwr-expected", bio.Rd)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+	
+	/* byte */
+	/*
+	/* FIXME: compiler bug. multiplication on byte
+	   values is currently broken. */
+	b = 0xaa
+	std.assert(try(bio.getle8(f)) == b, "le byte broken\n")
+	std.assert(try(bio.getbe8(f)) == b, "be byte broken\n")
+	*/
+
+	/* word */
+	w = 0xaabb
+	std.assert(try(bio.getle16(f)) == w, "le word broken\n")
+	std.assert(try(bio.getbe16(f)) == w, "be word broken\n")
+
+	/* long */
+	l = 0xaabbccdd
+	std.assert(try(bio.getle32(f)) == l, "le long broken\n")
+	std.assert(try(bio.getbe32(f)) == l, "be long broken\n")
+
+	/* quad */
+	q = 0x11223344aabbccdd castto(uint64)
+	std.assert(try(bio.getle64(f)) == q, "le quad broken\n")
+	std.assert(try(bio.getbe64(f)) == q, "be quad broken\n")
+
+	/* end of file */
+	match bio.getle64(f)
+	| `std.None:
+	| `std.Some v:	std.die("read past end of file\n")
+	;;
+
+	bio.close(f);
+
+	std.put("success: all reads matched\n")
+}
+
--- /dev/null
+++ b/libbio/test/bio-endianwr.myr
@@ -1,0 +1,42 @@
+use std
+use bio
+
+const main = {
+	var b : byte
+	var w : uint16
+	var l : uint32
+	var q : uint64
+	var f
+
+	match bio.create("tmpout/test-endianwr", bio.Wr, 0o644)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+	
+	/* byte */
+	/*
+	/* FIXME: compiler bug. multiplication on byte
+	   values is currently broken. */
+	b = 0xaa
+	bio.putle(f, b)
+	bio.putbe(f, b)
+	*/
+
+	/* word */
+	w = 0xaabb
+	bio.putle16(f, w)
+	bio.putbe16(f, w)
+
+	/* long */
+	l = 0xaabbccdd
+	bio.putle32(f, l)
+	bio.putbe32(f, l)
+
+	/* quad */
+	q = 0x11223344aabbccdd castto(uint64)
+	bio.putle64(f, q)
+	bio.putbe64(f, q)
+
+	/* and test for flush on close */
+	bio.close(f);
+}
--- /dev/null
+++ b/libbio/test/bio-peek.myr
@@ -1,0 +1,45 @@
+use std
+use bio
+
+const main = {
+	var f
+	/* Must be bigger than a bio buffer (ie, > 64k) */
+	var buf : byte[64*1024]
+
+	match bio.open("data/datafile", bio.Rd)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+	
+	std.assert(peekb(f) == 0x30, "wrong byte value read from datafile")
+	std.assert(peekc(f) == '0', "wrong char value read from datafile")
+
+	bio.read(f, buf[:4])	/* skip ahead 4 bytes */
+	std.assert(peekb(f) == 0x34, "wrong byte value read from datafile")
+	std.assert(peekc(f) == '4', "wrong char value read from datafile")
+
+	bio.read(f, buf[:])	/* skip ahead 64k */
+	std.assert(peekb(f) == 0x30, "wrong byte value read from datafile")
+	std.assert(peekc(f) == '0', "wrong char value read from datafile")
+
+	bio.close(f);
+	std.put("Succeded peeeking values\n")
+}
+
+const peekc = {f
+	match bio.peekc(f)
+	| `std.Some c:	-> c
+	| `std.None:
+		std.put("eof")
+		-> -1
+	;;
+}
+
+const peekb = {f
+	match bio.peekb(f)
+	| `std.Some b:	-> b
+	| `std.None:
+		std.put("eof")
+		-> -1
+	;;
+}
--- /dev/null
+++ b/libbio/test/bio-read.myr
@@ -1,0 +1,46 @@
+use std
+use bio
+
+const main = {
+	var f
+	/* Must be bigger than a bio buffer (ie, > 64k) */
+	var buf : byte[64*1024]
+	var b
+
+	match bio.open("data/datafile", bio.Rd)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+	
+	/* read a 4 byte chunk j*/
+	b = r(f, buf[:4])
+	std.write(1, b)
+	std.write(1, "\n")
+
+	/* read the next 32 bytes */
+	b = r(f, buf[:32])
+	std.write(1, b)
+	std.write(1, "\n")
+
+	/* read a 64k chunk */
+	b = r(f, buf[:])
+	std.write(1, b)
+	std.write(1, "\n")
+
+	/* read to EOF */
+	b = r(f, buf[:])
+	std.write(1, b)
+	std.write(1, "\n")
+
+	/* and fail */
+	b = r(f, buf[:])
+
+	bio.close(f)
+}
+
+const r = {f, buf
+	match bio.read(f, buf)
+	| `std.Some b:	-> b
+	| `std.None:	std.put("eof\n")
+	;;
+}
--- /dev/null
+++ b/libbio/test/bio-unitwr.myr
@@ -1,0 +1,14 @@
+use std
+use bio
+
+const main = {
+	var f
+	match bio.create("tmpout/test-unitwr", bio.Wr, 0o644)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+	bio.putb(f, 42)
+	bio.putc(f, 'ה')
+	bio.putb(f, 0xa)
+	bio.close(f);
+}
--- /dev/null
+++ b/libbio/test/bio-write.myr
@@ -1,0 +1,33 @@
+use std
+use bio
+
+const main = {
+	var i
+	var f
+	/* Must be bigger than a bio buffer (ie, > 64k) */
+	var buf : byte[64*1024]
+
+	match bio.create("tmpout/test-write", bio.Wr, 0o644)
+	| `std.Some bio:	f = bio
+	| `std.None:	std.fatal(1, "Unable to open data file")
+	;;
+
+	/* write a 5 byte chunk */
+	bio.write(f, "test\n")
+
+	/* again */
+	bio.write(f, "test\n")
+
+	/* write a 64k chunk */
+	for i = 0; i < 64*1024; i++
+		buf[i] = 0x31
+	;;
+	bio.write(f, buf[:])
+
+	/* final message after a big burst */
+	bio.write(f, "goodbye\n")
+	bio.flush(f)
+
+	/* and test for flush on close */
+	bio.close(f);
+}
--- /dev/null
+++ b/libbio/test/data/bio-delim-expected
@@ -1,0 +1,10 @@
+first line
+second line
+data with
+semicolons
+
+and
+no-terminator
+
+eof
+eof
--- /dev/null
+++ b/libbio/test/data/bio-endianrd-expected
@@ -1,0 +1,1 @@
+success: all reads matched
--- /dev/null
+++ b/libbio/test/data/bio-endianwr-expected
@@ -1,0 +1,1 @@
+�����̻������̻�D3""3D���
\ No newline at end of file
--- /dev/null
+++ b/libbio/test/data/bio-peek-expected
@@ -1,0 +1,1 @@
+Succeded peeeking values
--- /dev/null
+++ b/libbio/test/data/bio-read-expected
@@ -1,0 +1,6 @@
+0123
+45678901234567890123456789012345
+678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
\ No newline at end of file
+234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
\ No newline at end of file
+
+eof
--- /dev/null
+++ b/libbio/test/data/bio-unitwr-expected
@@ -1,0 +1,1 @@
+*ה
--- /dev/null
+++ b/libbio/test/data/bio-write-expected
@@ -1,0 +1,3 @@
+test
+test
+111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
\ No newline at end of file
--- /dev/null
+++ b/libbio/test/data/datafile
@@ -1,0 +1,1 @@
+012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
\ No newline at end of file
--- /dev/null
+++ b/libbio/test/data/lines
@@ -1,0 +1,4 @@
+first line
+second line
+data with;semicolons;
+and--no-terminator
--- /dev/null
+++ b/libbio/test/runtest.sh
@@ -1,0 +1,124 @@
+#!/bin/bash
+NFAILURES=0
+NPASSES=0
+
+function build {
+    rm -f $1 $1.o $1.s $1.use
+    myrbuild $FLAGS -b $1 $1.myr $EXTRA_SRC
+}
+
+function pass {
+    PASSED="$PASSED $1"
+    NPASSED=$[$NPASSED + 1]
+}
+
+function fail {
+    echo "FAIL: $1"
+    FAILED="$FAILED $1"
+    NFAILED=$[$NFAILED + 1]
+}
+
+function expectstatus {
+    ./$1 $3
+    if [ $? -eq $2 ]; then
+        pass $1
+        return
+    else
+        fail $1
+    fi
+}
+
+function expectprint {
+    if [ "`./$1 $3`" != "$2" ]; then
+        fail $1
+    else
+        pass $1
+    fi
+}
+
+
+function expectcompare {
+    if [ x"" !=  x"$TMPDIR" ]; then 
+        t=$TMPDIR/myrtest-$1-$RANDOM
+    else
+        t=/tmp/myrtest-$1-$RANDOM
+    fi
+    ./$1 $3 > $t
+    if cmp $t data/$1-expected; then
+        pass $1
+    else
+        fail $1
+    fi
+    rm -f $t
+}
+
+function expectfcompare {
+    ./$1 $3
+    if cmp data/$1-expected $2; then
+        pass $1
+    else
+        fail $1
+    fi
+}
+
+function shouldskip {
+  if [ -z $ARGS ]; then
+      return 1
+  fi
+
+  for i in $ARGS; do
+      if [ $i = $1 ]; then
+          return 1
+      fi
+  done
+  return 0
+}
+
+
+# Should build and run
+function B {
+    if shouldskip $1; then
+        return
+    fi
+
+    test="$1"; shift
+    type="$1"; shift
+    res="$1"; shift
+    if [ $# > 0 ]; then
+        args="$1"; shift
+    fi
+    build $test
+    case $type in
+    "E")  expectstatus "$test" "$res" "$input";;
+    "P")  expectprint "$test" "$res" "$input";;
+    "C")  expectcompare "$test" "$res" "$input";;
+    "F")  expectfcompare "$test" "$res" "$args";;
+    esac
+}
+
+# Should fail
+function F {
+    if shouldskip $1; then
+        return
+    fi
+    (build $1) > /dev/null
+    if [ $? -eq '1' ]; then
+        pass $1
+    else
+        fail $1
+    fi
+}
+
+# Should generate a usefile
+function U {
+    return
+}
+
+source tests
+
+echo "PASSED ($NPASSED): $PASSED"
+if [ -z "$NFAILED" ]; then
+    echo "SUCCESS"
+else
+    echo "FAILURES ($NFAILED): $FAILED"
+fi
--- /dev/null
+++ b/libbio/test/tests
@@ -1,0 +1,31 @@
+FLAGS=-I../
+mkdir -p tmpout
+# Format:
+# [B|F] testname [E|P] result
+#    [B|F]: Compiler outcome.
+#	B: Expect that this test will build.
+#	F: Expect that this test will not build.
+#    testname: Test case
+#	The test that will run. We will try to
+#	compile 'testname.myr' to 'testname',
+#	and then execute it, verifying the result
+#    [E|P|C]: Result type
+#	E tells us that the result is an exit status
+#	P tells us that the result is on stdout,
+#         and should be compared to the value on the
+#         line
+#	C tells us that the result is on stdout,
+#         and should be compared to the contents of
+#         the file passed on the line.
+#    result: Result value
+#	What we compare with. This should be self-
+#	evident.
+B bio-create    F	tmpout/test-create
+B bio-read	C
+B bio-write	F	tmpout/test-write
+B bio-delim	C
+B bio-endianwr	F	tmpout/test-endianwr
+B bio-endianrd	C
+B bio-unitwr	F	tmpout/test-unitwr
+B bio-peek	C
+#B bio-fmt	C
--- a/mk/myr.mk
+++ /dev/null
@@ -1,97 +1,0 @@
-ifneq ($(MYRLIB),)
-    _LIBNAME=lib$(MYRLIB).a
-endif
-
-all: subdirs $(_LIBNAME) $(MYRBIN) 
-
-subdirs:
-	@for i in $(SUB); do (\
-	    cd $$i && \
-	    $(MAKE) || \
-	    exit 1 \
-	) || exit 1; done
-
-subdirs-clean:
-	@for i in $(SUB); do (\
-	    cd $$i && \
-	    $(MAKE) clean|| \
-	    exit 1 \
-	); done
-
-subdirs-install:
-	@for i in $(SUB); do (\
-	    cd $$i && \
-	    $(MAKE) install|| \
-	    exit 1 \
-	); done
-
-subdirs-uninstall:
-	@for i in $(SUB); do (\
-	    cd $$i && \
-	    $(MAKE) uninstall|| \
-	    exit 1 \
-	); done
-
-$(_LIBNAME): $(MYRSRC) $(ASMSRC)
-	myrbuild -l $(MYRLIB) $^
-
-$(MYRBIN): $(MYRSRC) $(ASMSRC)
-	myrbuild -b $(MYRBIN) $^
-
-OBJ=$(MYRSRC:.myr=.o) $(ASMSRC:.s=.o)
-USE=$(MYRSRC:.myr=.use) $(MYRLIB)
-.PHONY: clean
-clean: subdirs-clean
-	rm -f $(OBJ)
-	rm -f $(USE)
-	@if [ ! -z "$(MYRLIB)" ]; then \
-	    echo rm -f $(MYRLIB); \
-	    rm -f $(MYRLIB); \
-	    echo rm -f lib$(MYRLIB).a; \
-	    rm -f lib$(MYRLIB).a; \
-	fi
-	@if [ ! -z "$(MYRBIN)" ]; then \
-	    echo rm -f $(MYRBIN); \
-	    rm -f $(MYRBIN); \
-	    echo rm -f lib$(MYRBIN).a; \
-	    rm -f lib$(MYRBIN).a; \
-	fi
-
-install: subdirs-install $(MYRBIN) $(_LIBNAME) $(MAN)
-	@if [ ! -z "$(MYRBIN)" ]; then \
-	    echo install $(MYRBIN) $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
-	    mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
-	    install $(MYRBIN) $(abspath $(DESTDIR)/$(INST_ROOT)/bin); \
-	fi
-	@if [ ! -z "$(_LIBNAME)" ]; then \
-		echo install -m 644 $(_LIBNAME) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
-		echo install -m 644 $(MYRLIB) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
-		mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
-		install -m 644 $(_LIBNAME) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
-		install -m 644 $(MYRLIB) $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr); \
-	fi
-	@for i in $(MAN); do \
-	    MANSECT=$$(echo $$i | awk -F. '{print $$NF}'); \
-	    echo mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$$MANSECT); \
-	    echo install -m 644 $(MAN) $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}); \
-	    mkdir -p $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$$MANSECT); \
-	    install -m 644 $(MAN) $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}); \
-	done \
-
-uninstall: subdirs-uninstall
-	@for i in $(MYRBIN); do \
-	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/bin/$$i); \
-	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/bin/$$i); \
-	done
-	@for i in $(_LIBNAME) $(MYRLIB); do \
-	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr/$$i); \
-	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/lib/myr/$$i); \
-	done
-	@for i in $(MAN); do \
-	    MANSECT=$$(echo $$i | awk -F. '{print $$NF}'); \
-	    echo rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}/$$i); \
-	    rm -f $(abspath $(DESTDIR)/$(INST_ROOT)/share/man/man$${MANSECT}/$$i); \
-	done
-
-config.mk:
-	./configure
--- a/puti.myr
+++ /dev/null
@@ -1,62 +1,0 @@
-use std
-
-use "bio.use"
-
-pkg bio =
-	/* unsigned big endian */
-	generic putbe8	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putbe16	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putbe32	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putbe64	: (f : file#, v : @a::(numeric,integral) -> std.size)
-
-	/* unsigned little endian */
-	generic putle8	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putle16	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putle32	: (f : file#, v : @a::(numeric,integral) -> std.size)
-	generic putle64	: (f : file#, v : @a::(numeric,integral) -> std.size)
-;;
-
-generic putbe8  = {f, v; -> putbe(f, v castto(uint64), 1)}
-generic putbe16 = {f, v; -> putbe(f, v castto(uint64), 2)}
-generic putbe32 = {f, v; -> putbe(f, v castto(uint64), 4)}
-generic putbe64 = {f, v; -> putbe(f, v castto(uint64), 8)}
-
-generic putle8  = {f, v; -> putle(f, v castto(uint64), 1)}
-generic putle16 = {f, v; -> putle(f, v castto(uint64), 2)}
-generic putle32 = {f, v; -> putle(f, v castto(uint64), 4)}
-generic putle64 = {f, v; -> putle(f, v castto(uint64), 8)}
-
-const putle = {f, v, n
-	var buf : byte[8]
-
-	if !ensurewrite(f, n)
-		-> 0
-	;;
-	buf[0] = (v >> 0) & 0xff castto(byte)
-	buf[1] = (v >> 8) & 0xff castto(byte)
-	buf[2] = (v >> 16) & 0xff castto(byte)
-	buf[3] = (v >> 24) & 0xff castto(byte)
-	buf[4] = (v >> 32) & 0xff castto(byte)
-	buf[5] = (v >> 40) & 0xff castto(byte)
-	buf[6] = (v >> 48) & 0xff castto(byte)
-	buf[7] = (v >> 56) & 0xff castto(byte)
-	write(f, buf[:n])
-}
-
-const putbe = {f, v, n
-	var buf : byte[8]
-
-	if !ensurewrite(f, n)
-		-> 0
-	;;
-	buf[0] = (v >> 56) & 0xff castto(byte)
-	buf[1] = (v >> 48) & 0xff castto(byte)
-	buf[2] = (v >> 40) & 0xff castto(byte)
-	buf[3] = (v >> 32) & 0xff castto(byte)
-	buf[4] = (v >> 24) & 0xff castto(byte)
-	buf[5] = (v >> 16) & 0xff castto(byte)
-	buf[6] = (v >> 8) & 0xff castto(byte)
-	buf[7] = (v >> 0) & 0xff castto(byte)
-	write(f, buf[8-n:])
-}
-
--- a/test/Makefile
+++ /dev/null
@@ -1,20 +1,0 @@
-# don't build anything for 'all'
-all: 
-	$(MAKE) -C ..
-
-check:
-	./runtest.sh
-
-.PHONY: %
-%:
-	./runtest.sh $@
-
-.PHONY: clean
-clean:
-	rm -f testmatch.use testmatch.o
-	@for i in `awk '/^[A-Z]/{print $$2}' tests`; do \
-	    echo rm -f $$i; \
-	    rm -f $$i; \
-	done
-
-install:
--- a/test/bio-create.myr
+++ /dev/null
@@ -1,13 +1,0 @@
-use std
-use bio
-
-const main = {
-	var f
-
-	std.mkdir("tmpout", 0o755);
-	match bio.create("tmpout/test-create", bio.Wr, 0o644)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Failed to open file\n")
-	;;
-	bio.close(f)
-}
--- a/test/bio-delim.myr
+++ /dev/null
@@ -1,70 +1,0 @@
-use std
-use bio
-
-const main = {
-	var f
-	var d
-
-	match bio.open("data/lines", bio.Rd)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file\n")
-	;;
-
-	/* read first line */
-	d = readln(f)
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* read second line, should not include \n */
-	d = readln(f)
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* read to ';' */
-	d = readto(f, ";")
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* read to ';'  again */
-	d = readto(f, ";")
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* '--'  this time */
-	d = readto(f, "--")
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* and without the terminator, we should get the remaining text */
-	d = readto(f, "not-there")
-	std.write(1, d)
-	std.write(1, "\n")
-	std.slfree(d)
-
-	/* and now, eof */
-	d = readln(f)
-	d = readto(f, "actually, eof")
-	
-	bio.close(f)
-}
-
-const readln = {f
-	match bio.readln(f)
-	| `std.Some d:	-> d
-	| `std.None:	std.put("eof\n")
-			-> [][:]
-	;;
-}
-
-const readto = {f, delim
-	match bio.readto(f, delim)
-	| `std.Some d:	-> d
-	| `std.None:	std.put("eof\n")
-			-> [][:]
-	;;
-}
--- a/test/bio-endianrd.myr
+++ /dev/null
@@ -1,57 +1,0 @@
-use std
-use bio
-
-generic try = {opt : std.option(@a::(integral,numeric))-> @a::(integral,numeric)
-	match opt
-	| `std.Some val:	-> val
-	| `std.None:	std.fatal(1, "read failed")
-	;;
-}
-const main = {
-	var b : byte
-	var w : uint16
-	var l : uint32
-	var q : uint64
-	var f
-
-	/* use the expected write data as read data */
-	match bio.open("data/bio-endianwr-expected", bio.Rd)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-	
-	/* byte */
-	/*
-	/* FIXME: compiler bug. multiplication on byte
-	   values is currently broken. */
-	b = 0xaa
-	std.assert(try(bio.getle8(f)) == b, "le byte broken\n")
-	std.assert(try(bio.getbe8(f)) == b, "be byte broken\n")
-	*/
-
-	/* word */
-	w = 0xaabb
-	std.assert(try(bio.getle16(f)) == w, "le word broken\n")
-	std.assert(try(bio.getbe16(f)) == w, "be word broken\n")
-
-	/* long */
-	l = 0xaabbccdd
-	std.assert(try(bio.getle32(f)) == l, "le long broken\n")
-	std.assert(try(bio.getbe32(f)) == l, "be long broken\n")
-
-	/* quad */
-	q = 0x11223344aabbccdd castto(uint64)
-	std.assert(try(bio.getle64(f)) == q, "le quad broken\n")
-	std.assert(try(bio.getbe64(f)) == q, "be quad broken\n")
-
-	/* end of file */
-	match bio.getle64(f)
-	| `std.None:
-	| `std.Some v:	std.die("read past end of file\n")
-	;;
-
-	bio.close(f);
-
-	std.put("success: all reads matched\n")
-}
-
--- a/test/bio-endianwr.myr
+++ /dev/null
@@ -1,42 +1,0 @@
-use std
-use bio
-
-const main = {
-	var b : byte
-	var w : uint16
-	var l : uint32
-	var q : uint64
-	var f
-
-	match bio.create("tmpout/test-endianwr", bio.Wr, 0o644)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-	
-	/* byte */
-	/*
-	/* FIXME: compiler bug. multiplication on byte
-	   values is currently broken. */
-	b = 0xaa
-	bio.putle(f, b)
-	bio.putbe(f, b)
-	*/
-
-	/* word */
-	w = 0xaabb
-	bio.putle16(f, w)
-	bio.putbe16(f, w)
-
-	/* long */
-	l = 0xaabbccdd
-	bio.putle32(f, l)
-	bio.putbe32(f, l)
-
-	/* quad */
-	q = 0x11223344aabbccdd castto(uint64)
-	bio.putle64(f, q)
-	bio.putbe64(f, q)
-
-	/* and test for flush on close */
-	bio.close(f);
-}
--- a/test/bio-peek.myr
+++ /dev/null
@@ -1,45 +1,0 @@
-use std
-use bio
-
-const main = {
-	var f
-	/* Must be bigger than a bio buffer (ie, > 64k) */
-	var buf : byte[64*1024]
-
-	match bio.open("data/datafile", bio.Rd)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-	
-	std.assert(peekb(f) == 0x30, "wrong byte value read from datafile")
-	std.assert(peekc(f) == '0', "wrong char value read from datafile")
-
-	bio.read(f, buf[:4])	/* skip ahead 4 bytes */
-	std.assert(peekb(f) == 0x34, "wrong byte value read from datafile")
-	std.assert(peekc(f) == '4', "wrong char value read from datafile")
-
-	bio.read(f, buf[:])	/* skip ahead 64k */
-	std.assert(peekb(f) == 0x30, "wrong byte value read from datafile")
-	std.assert(peekc(f) == '0', "wrong char value read from datafile")
-
-	bio.close(f);
-	std.put("Succeded peeeking values\n")
-}
-
-const peekc = {f
-	match bio.peekc(f)
-	| `std.Some c:	-> c
-	| `std.None:
-		std.put("eof")
-		-> -1
-	;;
-}
-
-const peekb = {f
-	match bio.peekb(f)
-	| `std.Some b:	-> b
-	| `std.None:
-		std.put("eof")
-		-> -1
-	;;
-}
--- a/test/bio-read.myr
+++ /dev/null
@@ -1,46 +1,0 @@
-use std
-use bio
-
-const main = {
-	var f
-	/* Must be bigger than a bio buffer (ie, > 64k) */
-	var buf : byte[64*1024]
-	var b
-
-	match bio.open("data/datafile", bio.Rd)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-	
-	/* read a 4 byte chunk j*/
-	b = r(f, buf[:4])
-	std.write(1, b)
-	std.write(1, "\n")
-
-	/* read the next 32 bytes */
-	b = r(f, buf[:32])
-	std.write(1, b)
-	std.write(1, "\n")
-
-	/* read a 64k chunk */
-	b = r(f, buf[:])
-	std.write(1, b)
-	std.write(1, "\n")
-
-	/* read to EOF */
-	b = r(f, buf[:])
-	std.write(1, b)
-	std.write(1, "\n")
-
-	/* and fail */
-	b = r(f, buf[:])
-
-	bio.close(f)
-}
-
-const r = {f, buf
-	match bio.read(f, buf)
-	| `std.Some b:	-> b
-	| `std.None:	std.put("eof\n")
-	;;
-}
--- a/test/bio-unitwr.myr
+++ /dev/null
@@ -1,14 +1,0 @@
-use std
-use bio
-
-const main = {
-	var f
-	match bio.create("tmpout/test-unitwr", bio.Wr, 0o644)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-	bio.putb(f, 42)
-	bio.putc(f, 'ה')
-	bio.putb(f, 0xa)
-	bio.close(f);
-}
--- a/test/bio-write.myr
+++ /dev/null
@@ -1,33 +1,0 @@
-use std
-use bio
-
-const main = {
-	var i
-	var f
-	/* Must be bigger than a bio buffer (ie, > 64k) */
-	var buf : byte[64*1024]
-
-	match bio.create("tmpout/test-write", bio.Wr, 0o644)
-	| `std.Some bio:	f = bio
-	| `std.None:	std.fatal(1, "Unable to open data file")
-	;;
-
-	/* write a 5 byte chunk */
-	bio.write(f, "test\n")
-
-	/* again */
-	bio.write(f, "test\n")
-
-	/* write a 64k chunk */
-	for i = 0; i < 64*1024; i++
-		buf[i] = 0x31
-	;;
-	bio.write(f, buf[:])
-
-	/* final message after a big burst */
-	bio.write(f, "goodbye\n")
-	bio.flush(f)
-
-	/* and test for flush on close */
-	bio.close(f);
-}
--- a/test/data/bio-delim-expected
+++ /dev/null
@@ -1,10 +1,0 @@
-first line
-second line
-data with
-semicolons
-
-and
-no-terminator
-
-eof
-eof
--- a/test/data/bio-endianrd-expected
+++ /dev/null
@@ -1,1 +1,0 @@
-success: all reads matched
--- a/test/data/bio-endianwr-expected
+++ /dev/null
@@ -1,1 +1,0 @@
-�����̻������̻�D3""3D���
\ No newline at end of file
--- a/test/data/bio-peek-expected
+++ /dev/null
@@ -1,1 +1,0 @@
-Succeded peeeking values
--- a/test/data/bio-read-expected
+++ /dev/null
@@ -1,6 +1,0 @@
-0123
-45678901234567890123456789012345
-678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
\ No newline at end of file
-234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
\ No newline at end of file
-
-eof
--- a/test/data/bio-unitwr-expected
+++ /dev/null
@@ -1,1 +1,0 @@
-*ה
--- a/test/data/bio-write-expected
+++ /dev/null
@@ -1,3 +1,0 @@
-test
-test
-111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
\ No newline at end of file
--- a/test/data/datafile
+++ /dev/null
@@ -1,1 +1,0 @@
-012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
\ No newline at end of file
--- a/test/data/lines
+++ /dev/null
@@ -1,4 +1,0 @@
-first line
-second line
-data with;semicolons;
-and--no-terminator
--- a/test/runtest.sh
+++ /dev/null
@@ -1,124 +1,0 @@
-#!/bin/bash
-NFAILURES=0
-NPASSES=0
-
-function build {
-    rm -f $1 $1.o $1.s $1.use
-    myrbuild $FLAGS -b $1 $1.myr $EXTRA_SRC
-}
-
-function pass {
-    PASSED="$PASSED $1"
-    NPASSED=$[$NPASSED + 1]
-}
-
-function fail {
-    echo "FAIL: $1"
-    FAILED="$FAILED $1"
-    NFAILED=$[$NFAILED + 1]
-}
-
-function expectstatus {
-    ./$1 $3
-    if [ $? -eq $2 ]; then
-        pass $1
-        return
-    else
-        fail $1
-    fi
-}
-
-function expectprint {
-    if [ "`./$1 $3`" != "$2" ]; then
-        fail $1
-    else
-        pass $1
-    fi
-}
-
-
-function expectcompare {
-    if [ x"" !=  x"$TMPDIR" ]; then 
-        t=$TMPDIR/myrtest-$1-$RANDOM
-    else
-        t=/tmp/myrtest-$1-$RANDOM
-    fi
-    ./$1 $3 > $t
-    if cmp $t data/$1-expected; then
-        pass $1
-    else
-        fail $1
-    fi
-    rm -f $t
-}
-
-function expectfcompare {
-    ./$1 $3
-    if cmp data/$1-expected $2; then
-        pass $1
-    else
-        fail $1
-    fi
-}
-
-function shouldskip {
-  if [ -z $ARGS ]; then
-      return 1
-  fi
-
-  for i in $ARGS; do
-      if [ $i = $1 ]; then
-          return 1
-      fi
-  done
-  return 0
-}
-
-
-# Should build and run
-function B {
-    if shouldskip $1; then
-        return
-    fi
-
-    test="$1"; shift
-    type="$1"; shift
-    res="$1"; shift
-    if [ $# > 0 ]; then
-        args="$1"; shift
-    fi
-    build $test
-    case $type in
-    "E")  expectstatus "$test" "$res" "$input";;
-    "P")  expectprint "$test" "$res" "$input";;
-    "C")  expectcompare "$test" "$res" "$input";;
-    "F")  expectfcompare "$test" "$res" "$args";;
-    esac
-}
-
-# Should fail
-function F {
-    if shouldskip $1; then
-        return
-    fi
-    (build $1) > /dev/null
-    if [ $? -eq '1' ]; then
-        pass $1
-    else
-        fail $1
-    fi
-}
-
-# Should generate a usefile
-function U {
-    return
-}
-
-source tests
-
-echo "PASSED ($NPASSED): $PASSED"
-if [ -z "$NFAILED" ]; then
-    echo "SUCCESS"
-else
-    echo "FAILURES ($NFAILED): $FAILED"
-fi
--- a/test/tests
+++ /dev/null
@@ -1,31 +1,0 @@
-FLAGS=-I../
-mkdir -p tmpout
-# Format:
-# [B|F] testname [E|P] result
-#    [B|F]: Compiler outcome.
-#	B: Expect that this test will build.
-#	F: Expect that this test will not build.
-#    testname: Test case
-#	The test that will run. We will try to
-#	compile 'testname.myr' to 'testname',
-#	and then execute it, verifying the result
-#    [E|P|C]: Result type
-#	E tells us that the result is an exit status
-#	P tells us that the result is on stdout,
-#         and should be compared to the value on the
-#         line
-#	C tells us that the result is on stdout,
-#         and should be compared to the contents of
-#         the file passed on the line.
-#    result: Result value
-#	What we compare with. This should be self-
-#	evident.
-B bio-create    F	tmpout/test-create
-B bio-read	C
-B bio-write	F	tmpout/test-write
-B bio-delim	C
-B bio-endianwr	F	tmpout/test-endianwr
-B bio-endianrd	C
-B bio-unitwr	F	tmpout/test-unitwr
-B bio-peek	C
-#B bio-fmt	C