shithub: mc

Download patch

ref: c333a410cae728c14092819fbad5bdffb7530e6c
parent: 8210cec37c96007fb8ac64f7829bd78a1009f7d5
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Nov 1 07:06:30 EDT 2016

Accidentally had added the API docs.

	They should be added eventually, but not yet.

diff: cannot open a/doc/api/libbio//null: file does not exist: 'a/doc/api/libbio//null' diff: cannot open a/doc/api/libdate//null: file does not exist: 'a/doc/api/libdate//null' diff: cannot open a/doc/api/libinifile//null: file does not exist: 'a/doc/api/libinifile//null' diff: cannot open a/doc/api/libregex//null: file does not exist: 'a/doc/api/libregex//null' diff: cannot open a/doc/api/libstd//null: file does not exist: 'a/doc/api/libstd//null' diff: cannot open a/doc/api/libtestr//null: file does not exist: 'a/doc/api/libtestr//null' diff: cannot open a/doc/api/libthread//null: file does not exist: 'a/doc/api/libthread//null' diff: cannot open a/doc/api//null: file does not exist: 'a/doc/api//null'
--- a/doc/api/index.txt
+++ /dev/null
@@ -1,91 +1,0 @@
-{
-        title:  API Reference
-        description:    Myrddin API Reference
-}
-
-This is the page where the Myrddin language is documented. You want to know
-all the boring, dull details? Well, they're here.
-
-APIs
-----
-
-### [Libstd](libstd)
-
-The standard library. You'll probably be using it in all your code, because
-it's the standard. It's intended to cover a good portion of the functionality
-that you'll need for any program. It's a bit of a grab bag, but can be roughly
-categorized into the following subsections:
-
-- [Memory Allocation](libstd/alloc): All of your memory allocation needs.
-- [Error Handling](libstd/err): Convenient utilities for aborting your program.
-- [OS Interfaces](libstd/os): Ask not what you can do for your OS, ask what
-  your OS can do for you.
-- [File Handling](libstd/files): Sometimes data just wants to persist.
-- [Networking](libstd/networking): Communicating with other sytems isn't just
-  a fad.
-- [Command Line Parsing](libstd/cli): Makes it easy to parse options from the
-  commad line.
-- [Formatted Output](libstd/fmt): I/O. Without monads.
-- [Variadic Arguments](libstd/varargs): If you want ugly APIs, we've got you
-  covered.
-- [Slice manipulation](libstd/slices): Some generic functions. Easy to write
-  yourself, but a bit tedious.
-- [String Manipulation](libstd/strings): Some unicode aware string poking.
-- [Unicode](libstd/unicode): Wait a second, all languages aren't english?
-- [Pervasive Data Structures](libstd/datastruct): At least, I use them a lot.
-  If you use them too, we've got you covered.
-- [Misc](libstd/misc): Random crap that doesn't really fit into a category.
-
-### [Libsys](libsys)
-
-Libsys is a direct interface to system calls provided by the platform. It is 
-
-- [Linux Syscalls](libsys/linux)
-- [OSX Syscalls](libsys/osx)
-- [FreeBSD Syscalls](libsys/freebsd)
-- [Plan 9 Syscalls](libsys/plan9)
-
-### [Libbio](/myrddin/doc/libbio)
-
-This is a buffered IO library. It allows for many small reads and writes to be
-done with better performance than writing a system call for each one. On top
-of that, it allows for more convenient interfaces to handle linewise or
-delimited input, where peeking at the input stream may be necessary.
-
-### [Libregex](/myrddin/doc/libregex)
-
-This is a regex library, as implied by the name. It implements a simple but
-powerful regex syntax, with full unicode support. It also exposes the regex
-syntax tree if needed, which is useful for code that wants custom regex
-handling, but wants to remain consistent with the regexes in hairless.
-
-### [Libcryptohash](/myrddin/doc/libcryptohash)
-
-This is a library that handles cryptographic hashes. It implements many of the
-most common cryptographic hashes, and provides a fairly consistent interface
-to it.
-
-### [Libdate](/myrddin/doc/libdate)
-
-Libdate provides a fairly complete interface for manipulating dates, times,
-and timezones. It handles adding durations and periods to dates, formatting
-and parsing dates.
-
-### [Libthread](/myrddin/doc/libthread)
-
-Libthread is currently half assed and broken, and it doesn't work very well
-with libstd, which is not yet thread aware. This needs work.
-
-Utilities
----------
-
-### [Mbld](/myrddin/doc/mbld)
-
-Mbld is the Myrddin build tool. It knows how to handle source and library
-dependencies, as well as build generated sources.
-
-### [Hairless](/myrddin/doc/mbld)
-
-Hairless is the Myrddin parser generator. It's currently in a half-finished
-state, but is quit
-
--- a/doc/api/libbio/index.txt
+++ /dev/null
@@ -1,416 +1,0 @@
-{
-        title:  libbio
-        description:    BIO library description
-}
-
-Myrddin's BIO library is used for buffered input and output. It is a fairly
-simple library that handles reading and writing from file descriptors.
-
-The concepts in libbio should be familiar to anyone that has used a buffered
-IO library in most languages. The usual concepts are supported: Files,
-formatted output, binary and ascii reads, and so on. There are also some
-utility functions to deal with reading integers in a known endianness.
-
-One thing to keep in mind with libbio that it does not attempt to flush
-buffers on program exit, which means that any unwritten, unflushed data
-will be lost. Closing the bio files will prevent this issue.
-
-Summary
--------
-
-    pkg bio =
-            type mode
-            const Rd	: mode
-            const Wr	: mode
-            const Rw	: mode
-
-            type file = struct
-            ;;
-
-	    type lineiter
-
-            type status(@a) = union
-                    `Eof
-                    `Ok @a
-                    `Err ioerr
-            ;;
-
-            type ioerr = union
-                    `Ebadfile
-                    `Ebadbuf
-                    `Ebadfd
-                    `Eioerr
-            ;;
-
-	    impl iterable lineiter
-
-            /* creation */
-            const mkfile	: (fd : std.fd, mode : mode	-> file#)
-            const open	: (path : byte[:], mode : mode	-> std.result(file#, byte[:]))
-            const dial	: (srv	: byte[:], mode : mode	-> std.result(file#, byte[:]))
-            const create	: (path : byte[:], mode : mode, perm : int	-> std.result(file#, byte[:]))
-            const close	: (f : file# -> bool)
-            const free	: (f : file# -> void)
-
-            /* basic i/o. Returns sub-buffer when applicable. */
-            const write	: (f : file#, src : byte[:]	-> status(std.size))
-            const read	: (f : file#, dst : byte[:]	-> status(byte[:]))
-            const flush	: (f : file# -> bool)
-
-            /* seeking */
-            const seek	: (f : file#, std.off -> std.result(std.off, ioerr))
-
-            /* single unit operations */
-            const putb	: (f : file#, b : byte	-> status(std.size))
-            const putc	: (f : file#, c : char	-> status(std.size))
-            const getb	: (f : file# -> status(byte))
-            const getc	: (f : file# -> status(char))
-
-            /* peeking */
-            const peekb	: (f : file# -> status(byte))
-            const peekc	: (f : file# -> status(char))
-
-            /* delimited read; returns freshly allocated buffer. */
-            const readln	: (f : file#	-> status(byte[:]))
-            const readto	: (f : file#, delim : byte[:]	-> status(byte[:]))
-            const skipto	: (f : file#, delim : byte[:]	-> bool)
-            const skipspace	: (f : file# -> bool)
-
-            /* iterators */
-            const lineiter	: (f : file# -> lineiter)
-
-            /* formatted i/o */
-            const put	: (f : file#, fmt : byte[:], args : ... -> status(std.size))
-
-            /* unsigned big endian reads */
-            generic getbe8	: (f : file# -> status(@a::(numeric,integral)))
-            generic getbe16	: (f : file# -> status(@a::(numeric,integral)))
-            generic getbe32	: (f : file# -> status(@a::(numeric,integral)))
-            generic getbe64	: (f : file# -> status(@a::(numeric,integral)))
-
-            /* signed big endian reads */
-            generic getle8	: (f : file# -> status(@a::(numeric,integral)))
-            generic getle16	: (f : file# -> status(@a::(numeric,integral)))
-            generic getle32	: (f : file# -> status(@a::(numeric,integral)))
-            generic getle64	: (f : file# -> status(@a::(numeric,integral)))
-
-            /* unsigned big endian */
-            generic putbe8	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putbe16	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putbe32	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putbe64	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-
-            /* unsigned little endian */
-            generic putle8	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putle16	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putle32	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-            generic putle64	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    ;;
-
-The Data Structures
--------------------
-
-    type file = struct
-            fd  : std.fd
-    ;;
-
-The `bio.file` type contains the state required to implement buffered files.
-All of the state is internal, except for the file descriptor, which is exposed
-for the purposes of poll() and friends. Reading from it directly may lead to
-inconsistent buffer state, and is strongly not recommended.
-
-    type ioerr = union
-            `Ebadfile
-            `Ebadbuf
-            `Ebadfd
-            `Eioerr
-    ;;
-
-    type status(@a) = union
-            `Eof
-            `Ok @a
-            `Err ioerr
-    ;;
-
-The `bio.status(@a)` union returns the result of the read operation, which
-is going to either be a result of type '@a', an error-free end of file, or
-an error of type `ioerr`. All of these conditions are transient, and are
-retried on subsequent calls to the IO operations. For example, if reading
-a file returns `Eof, but data is appended to a file, then a subsequent read
-will return data again.
-
-In general, errors will be queued up, so if there is a buffered read or
-write that partly succeeds but is interrupted halfway, the error will be
-reported on the next operation. This way, partial operations are not lost.
-
-File Creation and Opening
--------------------------
-
-    const Rd	: mode
-    const Wr	: mode
-    const Rw	: mode
-
-When opening a file, one of the above flags must be passed to set the mode
-of the file. `Rd` indicates that the bio file should be read only, `Wr`
-indicates that it should be write only, and `Rw` indicates that it should be
-both readable and writable.
-
-Bio file creation
--------------
-
-    const mkfile	: (fd : std.fd, mode : mode	-> file#)
-
-This function creates a bio file from a file descriptor and mode, returning a
-`bio.file#` which will buffer reads and/or writes from the fd. This function
-assumes that you are passing it a correctly initialized fd, and will always
-succeed. If the FD is incorrectly configured, uses of it will error out.
-
-Returns: A buffered file wrapping the file descriptor `fd`
-
-    const open	: (path : byte[:], mode : mode	-> std.result(file#, byte[:]))
-
-This function attempts to open the path passed in with the mode, returning
-a result which is either a file, or a string representing the error that
-prevented the file from being opened.
-
-Returns: A buffered file representing `path` opened with the requested
-permissions.
-
-    const dial	: (srv	: byte[:], mode : mode	-> std.result(file#, byte[:]))
-
-This function is similar to open, however, this function will open a
-connection via a dialstring (as in `std.dial`), and buffer the fd returned
-from that.
-
-Returns: A buffered file representing `dialstr` opened with the requested
-permissions.
-
-    const create	: (path : byte[:], mode : mode, perm : int	-> std.result(file#, byte[:]))
-
-This function is similar to open, however, this function will attempt to
-atomically create and open the file descriptor.
-
-Returns: A buffered file representing `path` opened with the requested
-permissions.
-
-    const close	: (f : file# -> bool)
-
-Closes the file descriptor that the bio file is wrapping, and frees any
-resources used for buffering it. Any data that has not yet been written is
-flushed.
-
-Returns: `true` if flushing the file succeeded, `false` if it failed.
-
-    const free	: (f : file# -> void)
-
-Frees any resources used for the file descriptor, but leaves it open. This is
-useful if the file descriptor has been 'stolen' using bio.mkfile, and is not
-owned by the bio file.
-
-    const flush	: (f : file# -> bool)
-
-Clears any data that has not been sent to the backing file descriptor.
-
-Returns: `true` if flushing the file succeeded, `false` if it failed.
-
-Binary I/O
------------
-
-    const write	: (f : file#, src : byte[:]	-> result(std.size, byte[:]))
-
-Writes bytes from the buffer `src` to a bio file, returning the number of
-bytes written in the case of success. This number may be smaller than the size
-of the buffer, but will never be larger.
-
-    const read	: (f : file#, dst : byte[:]	-> result(byte[:]))
-
-Reads from a bio file, into the buffer 'dst', returning the section of the
-buffer that was read in the result.
-
-	const seek	: (f : file#, std.off -> std.result(std.off, ioerr))
-
-Seeks the bio file to the given absolute offset.
-
-    const flush	: (f : file# -> bool)
-
-Flush attempts to clear the buffers within `f`, writing everything within
-the buffers and discarding them. If writing fails, `false` is returned.
-
-
-Single Unit Operations
-----------------------
-
-        /* single unit operations */
-    const putb	: (f : file#, b : byte	-> status(std.size))
-
-Writes a single byte out to the file 'f', returning a status. If
-it is successful, the return value represents the number of bytes written.
-For single byte writes, this value is unsurprisingly always 1.
-
-    const putc	: (f : file#, c : char	-> status(std.size))
-
-Writes a single unicode character out to the file 'f', returning a status.
-This character is encoded in utf-8. If it is successful, the return value
-represents the number of bytes written, varying between 1 and 4.
-
-    const getb	: (f : file# -> status(byte))
-
-Reads a single byte from the file `f`, returning a status. If this read
-succeeds, the next byte in the file is returned.
-
-    const getc	: (f : file# -> status(char))
-
-Reads a unicode character from the file `f`, returning a status. If this read
-was successful, the next character is returned from the file. The file is
-assumed to be encoded in utf-8.
-
-    /* peeking */
-    const peekb	: (f : file# -> status(byte))
-    const peekc	: (f : file# -> status(char))
-
-Both peekb and peekc are similar to getb and getc respectively, although
-they return the value without advancing the position within the buffer.
-
-
-Delimited Operations
---------------------
-
-    /* delimited read; returns freshly allocated buffer. */
-    const readln	: (f : file#	-> status(byte[:]))
-
-Readln reads a single line of input from the file 'f', returning the line
-with the line ending characters removed. '\n', '\r', and '\r\n' are all
-accepted as valid line endings, and are treated interchangably when reading.
-
-The buffer is heap allocated, and must be freed with std.slfree
-
-    const readto	: (f : file#, delim : byte[:]	-> status(byte[:]))
-
-Readto is similar to readln, but instead of reading to a line ending, it will
-read up to the point where it finds the requested delimiter. The delimiter is
-an arbitrary sequence of bytes. If an end of file is reached, then the buffer
-up to the Eof is returned.
-
-The buffer is heap allocated, and must be freed with std.slfree
-
-    const skipto	: (f : file#, delim : byte[:]	-> bool)
-
-Skipto is identical to readto, but instead of allocating a buffer and reading
-into it, skipto will ignore the values and drop them. It returns true for
-any successful reads, and false if an error was encountered.
-
-    const skipspace	: (f : file# -> bool)
-
-Skipspace will consume any space tokens from the start of the input stream, It
-returns true for any successful reads, and false if an error was encountered.
-
-Iteration
----------
-
-    const lineiter	: (f : file# -> lineiter)
-
-Lineiter will return an interable type that will iterate through each line
-in a file. These lines are allocated on the heap, and are automatically freed
-at the end of the iteration.
-
-The returned iterator object is a value type, and does not need to be freed.
-
-Formatted IO
--------------
-
-    const put	: (f : file#, fmt : byte[:], args : ... -> status(std.size))
-
-This formats the output using the std.fmt api, and writes it to the file `f`.
-All custom formatters installed for `std.fmt` are used for this formatting.
-This call returns the number of bytes written on success.
-
-Endian Aware Reads
-------------------
-
-    generic getbe8	: (f : file# -> status(@a::(numeric,integral)))
-    generic getbe16	: (f : file# -> status(@a::(numeric,integral)))
-    generic getbe32	: (f : file# -> status(@a::(numeric,integral)))
-    generic getbe64	: (f : file# -> status(@a::(numeric,integral)))
-
-    generic getle8	: (f : file# -> status(@a::(numeric,integral)))
-    generic getle16	: (f : file# -> status(@a::(numeric,integral)))
-    generic getle32	: (f : file# -> status(@a::(numeric,integral)))
-    generic getle64	: (f : file# -> status(@a::(numeric,integral)))
-
-The functions above all read from a bio file, and return the value read on
-success. The 'be' variants read big endian values, and the `le' variants
-read little endian values. They final result is converted to whatever
-numeric, integral type is desired. If the value does not fit within the bounds
-of the type, it is truncated.
-
-The number of bytes read is determined by the number at the end of the
-function call. For eample, `getbe8()` will read 8 bits, or one byte from the
-stream. `getle64` will get a 64 bit, or 8 byte, value. The number of bytes
-consumed is independent of the size of the type being assigned to.
-
-    generic putbe8	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putbe16	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putbe32	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putbe64	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-
-    generic putle8	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putle16	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putle32	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-    generic putle64	: (f : file#, v : @a::(numeric,integral) -> status(std.size))
-
-The functions above all write to a bio file, and return the number of bytes
-written on success. The number of bytes written will always be the size of the
-type. The 'be' variants write the value in a big endian representation, and
-the 'le' variants write it in a little endian representation.
-
-The number of bytes written is determined by the number at the end of the
-function call. For eample, `putbe8()` will write 8 bits, or one byte.
-`putbe64` will write 64 bits, or 8 bytes. The number of
-bytes consumed is independent of the size of the type being assigned to.
-
-Examples
----------
-
-The example below is the simplest program that creates and opens a file, and
-writes to it. It creates it with 0o644 permissions (ie, rw-r--r--), and then
-immediately closes it. The result of this program should be a file called
-`create-example` containing the words.
-
-    use std
-    use bio
-
-    const main = {
-            var f
-
-            match bio.create("create-example", bio.Wr, 0o644)
-            | `std.Some bio:    f = bio
-            | `std.None:        std.fatal(1, "Failed to open file\n")
-            ;;
-            bio.write(f, "Hello user\n")
-            bio.close(f)
-    }
-
-The next example shows reading from a file called "lines", line by line. It
-should echo the lines, numbering them as it prints them:
-
-    use std
-    use bio
-
-    const main = {
-            var f
-            var i
-
-            match bio.open("lines", bio.Rd)
-            | `std.Some bio:        f = bio
-            | `std.None:    std.fatal(1, "Unable to open data file\n")
-            ;;
-
-            while true
-                    match bio.readlin(f)
-                    | `std.Some ln:
-                            std.put("line %i: %s\n", i, ln)
-                    | `std.None:
-                            break;
-                    ;;
-            ;;
-    }
--- a/doc/api/libdate/formatting.txt
+++ /dev/null
@@ -1,99 +1,0 @@
-{
-	title: Formatting
-	description: Libdate API documentation.
-}
-
-Date and Time Formatting
----------------------
-
-Formatting in libdate is done through the standard formatting
-functionality, and there are actually no functions exposed by libdate.
-Instead, you would write something like:
-
-```{runmyr stdfmt1}
-use date
-
-const main = {
-	std.put("{}\n", date.now())
-}
-```
-
-Custom formatting is done with a format option passed to std.format that
-looks like `f=dateformat`. The format strings used resemble the strings
-provided in strptime. Any characters preceded with a '%' are format
-characters, otherwise they are copied to the output stream directly.
-
-The format strings used to control formatting are also used to control parsing.
-
-An example would look like:
-
-```{runmyr stdfmt1}
-use date
-
-const main = {
-	std.put("{f=year is %Y, the day is %d}\n", date.now())
-}
-
-
-There are a number of short format options installed, specifically, `d`,
-`D`, and `t`, which respectively map to the default date format, the
-default date and time format, and the default time only format.
-
-```{runmyr stdfmt1}
-use date
-
-const main = {
-	std.put("{d}\n", date.now())
-	std.put("{D}\n", date.now())
-	std.put("{T}\n", date.now())
-}
-```
-
-Date and Time Formatting
----------------------
-
-Both parsing and formatting use the same format strings. The
-modifiers that are supported by libdate are listed below.
-
-When possible, the default format verbs `D`, `d`, or `t`
-should be used for formatting, and the default constants
-`Datefmt`, `Datetimefmt`, or `Timefmt` should be used for
-parsing.
-
-
-Char  | Meaning
-------|----------------------------------------------
-_%a_  | Abbreviated day of week: Mon, Tues, etc
-_%A_  | Full day of week: Monday, Tuesday, Wednesday, etc
-_%b_  | Abbreviated month of year: Jan, Feb, Mar, etc.
-_%B_  | Full month of year: January, February, etc
-_%c_  | Short for %Y-%m-%d %H:%M:%S %z (ISO 8601)
-_%C_  | Century number of year, as two digit integer.
-_%d_  | Day of month as a decimal number, 00 to 31.
-_%D_  | Short for "%m/%d/%y (wtf america)"
-_%e_  | Same as d, but space padded instead of zero padded.
-_%F_  | Short for ISO 8601 date format %Y-%m-%d
-_%h_  | Same as '%b'.
-_%H_  | Hour number using the 24 hour clock, zero padded.
-_%I_  | Hour number using the 12 hour clock, zero padded.
-_%j_  | Day of year as a decimal number, 001 to 366.
-_%k_  | Hour number using the 24 hour clock, space padded.
-_%l_  | Hour number using the 12 hour clock, space padded.
-_%m_  | The month number, zero padded.
-_%M_  | The minute number, zero padded.
-_%p_  | AM or PM, according to the time provided.
-_%P_  | am or pm, according to the time provided.
-_%r_  | 12 hour time: %I:%M %p
-_%R_  | 24 hour time: %H:%M
-_%s_  | The number of seconds since the Epoch
-_%S_  | The second number, zero padded. 0 to 60.
-_%T_  | The time including seconds in 24 hour format.
-_%u_  | The day of the week in decimal, 0 to 7.
-_%x_  | The date without the time. Same as %F
-_%X_  | The date with the time. Same as %c
-_%y_  | The final two digits of year.
-_%Y_  | The full year, including century. BC dates are negative.
-_%z_  | Timezone offset.
-_%Z_  | Timezone name or abbreviation. Offset if this is not available.
-_%%_  | A literal '%'
-
--- a/doc/api/libdate/index.txt
+++ /dev/null
@@ -1,95 +1,0 @@
-{
-	title: libdate
-	description: Libdate API documentation.
-}
-
-Summary
--------
-
-Libdate is a date API designed to cover most date related functinality in a
-sane, easy to use way. It will format, parse, and do basic manipulations on
-dates.  All operations are done on the proleptic Gregorian calendar, and the
-Julian to transition is not handled.
-
-Core Concepts
--------------
-
-### Instants
-
-An instant is a point in time. Immovable, unchanging for eternity, it is
-anchored in one spot through the microseconds of unix time in the UTC time
-zone. It is broken up into a local representation, consisting of years,
-months, days, weekdays, hours, minutes, seconds, and microseconds, with a
-timezone attached.
-
-### Durations
-
-A duration is a difference between two instants. It has a fixed magnitude, and
-is independent of timezones and the oddities of human calendars. It may be
-added or subtracted from instants of other durations. Durations have a
-resolution of microseconds. It is signed, and negative durations move instants
-backwards in time.
-
-### Periods
-
-A period is another form of differece between two instants. However, a period
-is a flighty creature, which does not anchor itself to the world of men in any
-strong way. A year may be 365 or 366 days, according to the whims and vagaries
-of the local calendar. An hour added to a time may jump ahead by two hours, if
-it so desires to follow the savings of daylight. These creatures attempt to
-mold themselves to the irrationalities of man's mind, and eschew the divine
-ordering of absolute time handed down by the prophets.
-
-### Timezones
-
-A timezone is a named zone, as decreed by the mighty IANA timezone database.
-It may take the form of a location such as "America/New_York", a well-known
-abbreviation like "EST", or a special value such as "local" or "", which mean,
-respectively, the current zone or UTC.
-
-Conventions
------------
-
-Timezones are pervasive, and no time is manipulated in this API without
-the awareness of the timezone. As a result, it is useful to know that dates
-are represeted using IANA zoneinfo database names. These are documented
-fully here: http://www.iana.org/time-zones
-
-There are two extensions that libdate supports: The empty string represents
-the UTC timezone, and "local" represents the time zone of the system that
-the system libdate is running on has been configured to.
-
-In the case of ambiguous timezones -- for example, parsing a date with no
-time attached, while using API call that does not specify the timezone,
-libdate will assume UTC dates.
-
-Functionality
--------------
-
-The functionality in libdate can be grouped into three main sections: Parsing,
-Manipulation, and Formatting.
-
-### [Types](types)
-
-This covers the set of all types provided by, and used throughout, the API
-of libdate, including all public fields and types.
-
-### [Parsing](parsing)
-
-This covers parse formatted dates in a manner similar to strptime. There are
-currently plans for an flexible parse() function, but this has not yet been
-implemented.
-
-### [Creation and Manipulation](manipulation)
-
-Manipulation covers date and time creation, and transition aware APIs that
-will work for timezone crossings, daylight savings time, and so on.
-
-#### Formatting
-
-This covers date formatting, which is done through strftime-like format
-strings. There are actually no functions exposed for formatting, as this is
-done through custom formatters for libstd, however, the format strings used
-to customize the date output are described here.
-
-
--- a/doc/api/libdate/manipulation.txt
+++ /dev/null
@@ -1,130 +1,0 @@
-
-{
-	title: Creation and Manipulation
-	description: Libdate API documentation.
-}
-
-Creation and Manipulation
--------------------------
-    pkg date =
-            /* useful constructors */
-            const utcnow	: (-> instant)
-            const now	: (tz : byte[:] -> instant)
-            const tozone	: (d : instant, zone : byte[:]	-> instant)
-            const mkdate	: (y : int, m : int, day : int, zone : byte[:]	-> instant)
-            const mkdatetime	: (year : int, mon : int, day : int, \
-                    h : int, m : int, s : int, zone : byte[:]	-> instant)
-            const mkinstant	: (tm : std.time, zone : byte[:]	-> instant)
-
-            const localoff	: (tm : std.time -> duration)
-            const tzoff	: (tzname : byte[:], tm : std.time	-> duration)
-            const tzname	: (tzoff : int -> byte[:])
-            const isleap	: (d : instant	-> bool)
-
-            /* date differences */
-            const add	: (d : instant, dt : duration	-> instant)
-            const sub	: (d : instant, dt : duration	-> instant)
-            const addperiod	: (d : instant, dt : period	-> instant)
-            const subperiod	: (d : instant, dt : period	-> instant)
-
-            const duration	: (a : instant, b : instant	-> duration)
-
-            pkglocal const recalc	: (inst : instant# -> std.time)
-    ;;
-
-Creation
------------
-
-    const utcnow	: (-> instant)
-
-Creates an instant representing the current time. The timezone is UTC. As a
-general philosophical point, dates written out persisetntly should generally
-be in UTC, so this function should generally be used to get dates.
-
-Returns: An instant representing the current time in the UTC timezone.
-
-    const now	: (tz : byte[:] -> instant)
-
-Creates an instant representing the current time. The timezone is the local
-time. This is useful for displaying dates and times to the user.
-
-Returns: An instant representing the current time in the local timezone.
-
-    const tozone	: (d : instant, zone : byte[:]	-> instant)
-
-Takes an instant and converts it to a new timezone. This takes the instants by
-value, and therefore, does not mutate any of its arguments.
-
-Returns: An instant representing provided time in the requested timezone.
-
-    const mkdate	: (y : int, m : int, day : int, zone : byte[:]	-> instant)
-
-Creates a date with the given year, month, and day in the given timezone. The
-time is set to 0:00:00
-
-Returns: A date representing the given ymd
-
-    const mkdatetime	: (year : int, mon : int, day : int, \
-            h : int, m : int, s : int, zone : byte[:]	-> instant)
-
-Creates a date and time pair with the given year, month, day, at the time
-h, m, s, in the provided timezone. The microseconds are zeroed.
-
-Returns: A date representing the given ymd:hms
-
-    const mkinstant	: (tm : std.time, zone : byte[:]	-> instant)
-
-Creates an instant from a time type. This time can be derived from the
-standard library, or computed from any other source. The time is in
-microseconds since the Unix epoch (Jan 1 1970, 0:00, UTC).
-
-Returns: An instant representing a std.time in the requested timezone
-
-Timezones
----------
-
-    const localoff	: (tm : std.time -> duration)
-
-Gets the local timezone offset for a time. Note that timezones can change due
-daylight savings, politics, and other similar factors, so a timezone offset
-needs to be associated with a specific instant.
-
-Returns: a duration representing the local timezone offset.
-
-    const tzoff	: (tzname : byte[:], tm : std.time	-> duration)
-
-Gets the timezone offset for a time and timezone pair. Note that timezones can
-change due daylight savings, politics, and other similar factors, so a
-timezone offset needs to be associated with a specific instant.
-
-Returns: a duration representing the requested timezone offset.
-
-    const isleap	: (d : instant	-> bool)
-
-Returns: whether a specific instant is within a leap year or not.
-
-Manipulation
-------------
-    
-    const add	: (d : instant, dt : duration	-> instant)
-    const sub	: (d : instant, dt : duration	-> instant)
-
-Adds or subtracts a duration from a date. A duration is an absolute length of
-time, and is not adjusted for calendar shifts around DST and similar events.
-
-Returns: an instant representing the adjusted time.
-
-    const addperiod	: (d : instant, dt : period	-> instant)
-    const subperiod	: (d : instant, dt : period	-> instant)
-
-Adds or subtracts a period from a date. A period is a humanized length of
-time, and is adjusted for calendar shifts around DST and similar events.
-
-Returns: an instant representing the adjusted time.
-
-    const duration	: (a : instant, b : instant	-> duration)
-
-Returns: the duration representing the difference between the two provided
-instants.
-
-
--- a/doc/api/libdate/parsing.txt
+++ /dev/null
@@ -1,74 +1,0 @@
-{
-	title: Date Parsing
-	description: Libdate API documentation.
-}
-
-Date and time parsing
----------------------
-
-    type parsefail = union
-            `Doublefmt char
-            `Badsep (char, char)
-            `Badfmt char
-            `Badzone byte[:]
-            `Badname byte[:]
-            `Badchar
-            `Badampm
-            `Shortint
-            `Badint
-    ;;
-
-    const Datetimefmt
-    const Datefmt
-    const Timefmt
-
-    /* date i/o */
-    const parsefmt	: (fmt : byte[:], s: byte[:]	-> std.result(instant, parsefail))
-    const parsefmtl	: (fmt : byte[:], s: byte[:]	-> std.result(instant, parsefail))
-    const parsefmtz	: (fmt : byte[:], s: byte[:], tz : byte[:]	-> std.result(instant, parsefail))
-
-Descriptions
-------------
-
-    const Datetimefmt   = "%Y-%m-%d %H:%M:%S %z"
-    const Datefmt       = "%H:%M:%S %z"
-    const Timefmt       = "%Y-%m-%d %z"
-
-These are "sane defaults" for date and time formats, and can be passed in
-where a format is required.
-
-    type parsefail
-
-Parsefail is an error type, returning descriptions of the error that the
-parsing code saw. Strings returned within the error point into the format
-string, and will be invalid when the format string is freed.
-
-    const parsefmt	: (fmt : byte[:], s: byte[:]	-> std.result(instant, parsefail))
-
-Parses a format string with a format. If there is a timezone specified in the
-format string, that format string will be used. If there is no format, the
-timezone will be assumed to be UTC.
-
-The format string used is similar to strptime, and is documented fully in
-the [description of formatting](/libdate/formatting)
-
-Returns: Either an instant representing the time parsed, or an error
-describing the failure.
-
-    const parsefmtl	: (fmt : byte[:], s: byte[:]	-> std.result(instant, parsefail))
-
-Parses a format into the local time. If a timezone is specified, the
-conversion will be done from the instant of the timezone to the local time.
-The format strings are the same as 'parsefmt'.
-
-Returns: Either an instant representing the time parsed, or an error
-describing the failure.
-
-    const parsefmtz	: (fmt : byte[:], s: byte[:], tz : byte[:]	-> std.result(instant, parsefail))
-
-Parses a format into the specified timezone. If a timezone is specified in the
-parsed date, the conversion will be done from the timezone to the provided
-timezone. The format strings are the same as 'parsefmt'.
-
-Returns: Either an instant representing the time parsed, or an error
-describing the failure.
--- a/doc/api/libdate/types.txt
+++ /dev/null
@@ -1,71 +1,0 @@
-{
-	title: Types
-	description: Libdate API documentation.
-}
-
-Contents
---------
-
-    pkg date = 
-            type instant = struct
-                    actual	: std.time	/* epoch time in microseconds */
-                    tzoff	: duration	/* timezone offset in microseconds */
-                    year	: int	/* year, != 0 */
-                    mon	: int	/* month, [1..12] */
-                    day	: int	/* day, [1..31] */
-                    wday	: int	/* weekday, [0..6] */
-                    h	: int	/* hour: [0..23] */
-                    m	: int	/* minute: [0..59] */
-                    s	: int	/* second: [0..59] */
-                    us	: int	/* microsecond: [0..999,999] */
-                    tzname	: byte[:]	/* current time zone name */
-            ;;
-
-            type duration = std.time
-
-            type period = union
-		`Year	int
-		`Month	int
-		`Day	int
-		`Hour	int
-		`Minute	int
-		`Second	int
-	;;
-    ;;
-
-Descriptions
-------------
-
-    type instant
-
-Instant represents a single instant of time, with a resolution
-of microseconds. It contains the actual instant in the member
-`actual`, which is a timestamp in microseconds since Jan 1, 1970
-at 00:00 in UTC, and breaks out the "humanized" time out into the
-various members that are exposed.
-
-The instant type always has a timezone attached, and the humanized
-time components are always in that timezone.
-
-    type duration
-
-A duration is an absolute number of microseconds that can be added
-or subtracted from an instant. This is not timezone adjusted.
-
-    type period
-
-A period is a time delta that is adjusted for crossing timezones,
-daylight savings, and other similar events. If you add a day to
-an instant, you would get the same wallclock time the next day,
-should that wallclock time exist.
-
-For example, if I were to add `\`Day 2` to the instant 
-`Oct 31 2015 3:00`, then the result would be the date
-`Nov 2 2015 3:00`, regardless of the daylight savings time adjustment.
-However, adding `\`Hour 48` would not have that effect.
-
-In cases where the adjustment does not exist -- for example, leap years,
-then the time will "wrap around" to the next available day. For example,
-Feb 29th on a leap year will become Mar 1st.
-
-
--- a/doc/api/libinifile/index.txt
+++ /dev/null
@@ -1,135 +1,0 @@
-{
-	title: libinifile
-	description: Libinifile API documentation.
-}
-
-Summary
--------
-
-	pkg inifile =
-		type error = union
-			`Fileerr
-			`Parseerr int
-			`Dupkey int
-		;;
-
-		type inifile =
-		;;
-		
-		/* reading */
-		const load	: (path : byte[:]	-> std.result(inifile#, error))
-		const loadf	: (file : std.fd	-> std.result(inifile#, error))
-		const free	: (ini : inifile#	-> void)
-
-		/* writing */
-		const write	: (ini : inifile#, path : byte[:]	-> bool)
-
-		/* key getting/setting */
-		const get	: (ini : inifile#, sect : byte[:], key : byte[:]	-> std.option(byte[:]))
-		const getv	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> byte[:])
-		const has	: (ini : inifile#, sect : byte[:], key : byte[:] -> bool)
-		const put	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> void)
-	;;
-
-
-Overview
---------
-
-Libinifile is a simple ini file parser. It does little interpretation of the
-data, and provides little in the way of convenience features. Loading will
-read the file into memory, and will not reflect changes of the on-disk data.
-
-Functions
----------
-
-	const load	: (path : byte[:]	-> std.result(inifile#, error))
-
-Load will read a file from disk, parsing it, and returning either a pointer to
-an `inifile` data structure, or an error reporting the problem parsing it, and
-if applicable, the line that the error occurred on.
-
-This data structure must be freed with `inifile.free()`.
-
-	const loadf	: (file : std.fd	-> std.result(inifile#, error))
-
-This is identical to `inifile.load`, only it reads from a `std.fd` that has
-already been opened in read mode, instead of a path.
-
-	const free	: (ini : inifile#	-> void)
-
-Releases all storage associated with an inifile data structure.
-
-	const write	: (ini : inifile#, path : byte[:]	-> bool)
-
-Write will take the content of an infile, and serialize it to disk. Comments
-from the original ini file are not currently preserved.
-
-	const get	: (ini : inifile#, sect : byte[:], key : byte[:]	-> std.option(byte[:]))
-	const getv	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> byte[:])
-
-Get and getv act like `std.hget` and `std.htgetv`. They will retrieve an entry
-from the ini file.
-
-Htget will return `\`std.Some val` if the key is present in the given section,
-or `\`std.None` if there is no value present in the ini file. Htgetv will
-return the default value `val` passed to it if the key is not found.
-
-For a key that is outside of a section, the empty string (`""`) should be
-passed for the section name.
-
-	const has	: (ini : inifile#, sect : byte[:], key : byte[:] -> bool)
-
-Queries whether a key is present in the ini file. Returns true if the key is
-present, or false if it is not.
-
-	const put	: (ini : inifile#, sect : byte[:], key : byte[:], val : byte[:]	-> void)
-
-Places a key value pair into the in-memory representation of the .ini file.
-This key value pair added if it is not present, and replaced if it is. The key
-and value are both copied, and ownership is not taken. The responsibility for
-freeing the previous value lies with the ini file implementation.
-
-Supported Syntax
---------------
-
-The dialect that it supports allows for a list of zero or more key-value pairs
-before any sections are declared, followed by a list of sections containing
-more key value pairs.
-
-Keys are any sequence of characters, excluding an '=' sign. Values are any
-sequence of characters. For both of these, both leading and trailing white
-space is ignored.
-
-Sections are lists of characters started by `[` and end by `]`. The only
-character disallowed within a section name is `]`. Leading and trailing
-whitespace is stripped from a section.
-
-Keys within a file must be unique, otherwise this is an error.
-
-Section declarations may repeat throughout the file, but this will merely
-switch back into the old section.
-
-Example
-------
-
-Assuming that an file named `demo.ini` exists, and contains the following
-text:
-
-	toplev = hey, there's a value!
-	[section]
-		key = wait, there's another
-
-Then the following program will read it and show the values of the keys:
-
-	use std
-	use inifile
-
-	const main = {
-		var ini
-
-		ini = std.try(inifile.load("demo.ini"))
-		std.put("{}\n", inifile.getv(ini, "", "toplev", "not present")
-		std.put("{}\n", inifile.getv(ini, "section", "key", "not present")
-		inifile.free(ini)
-	}
-
--- a/doc/api/libregex/index.txt
+++ /dev/null
@@ -1,279 +1,0 @@
-{
-	title: libregex
-	description: Libregex API documentation.
-}
-
-Summary
--------
-
-	pkg regex =
-                type ast = union
-                        /* basic string building */
-                        `Alt	(ast#, ast#)
-                        `Cat	(ast#, ast#)
-
-                        /* repetition */
-                        `Star	ast#
-                        `Rstar  ast#
-                        `Plus	ast#
-                        `Rplus	ast#
-                        `Quest	ast#	
-
-                        /* end matches */
-                        `Chr	char
-                        `Ranges	char[2][:]
-
-                        /* meta */
-                        `Cap	(std.size, ast#) /* id, ast */
-                        `Bol	/* beginning of line */
-                        `Eol	/* end of line */
-                        `Bow	/* beginning of word */
-                        `Eow	/* end of word */
-                ;;
-
-                type status = union
-                        `Noimpl
-                        `Incomplete
-                        `Unbalanced char
-                        `Emptyparen
-                        `Badrep char
-                        `Badrange byte[:]
-                        `Badescape char
-                ;;
-
-	/* regex compilation */
-        const parse	: (re : byte[:]	-> std.result(ast#, status))
-        const compile	: (re : byte[:] -> std.result(regex#, status))
-        const dbgcompile	: (re : byte[:] -> std.result(regex#, status))
-        const free	: (re : regex# -> void)
-
-        /* regex execution */
-        const exec	: (re : regex#, str : byte[:] -> std.option(byte[:][:]))
-        const search	: (re : regex#, str : byte[:] -> std.option(byte[:][:]))
-
-        const sub	: (re : regex#, str : byte[:], subst : byte[:][:] -> std.option(byte[:]))
-        const sbsub	: (sb : std.strbuf#, re : regex#, str : byte[:], subst : byte[:][:] -> bool)
-        const suball	: (re : regex#, str : byte[:], subst : byte[:][:] -> byte[:])
-        const sbsuball	: (sb : std.strbuf#, re : regex#, str : byte[:], subst : byte[:][:] -> void)
-
-        const matchfree	: (pat : byte[:][:] -> void)
-    ;;
-
-
-Overview
---------
-
-Libregex is a simple regex API that uses a parallel NFA implementation. This
-means that while it is not blazingly fast, it does not exhibit pathological
-behavior on regexes like `(aa|aab?)\*` that many common regex APIs will see.
-
-Regex Syntax
--------------
-
-The grammar for regexes that are accepted is sketched out below.
-
-           regex       : altexpr
-           altexpr     : catexpr ('|' altexpr)+
-           catexpr     : repexpr (catexpr)+
-           repexpr     : baseexpr[*+?][?]
-           baseexpr    : literal
-                       | charclass
-                       | charrange
-                       | '.'
-                       | '^'
-                       | '$'
-                       | '(' regex ')'
-           charclass   : see below
-           charrange   : '[' (literal('-' literal)?)+']'
-
-The following metacharacters have the meanings listed below:
-
-Matches a single unicode character
-
-<table>
-	<tr><tr><th>Metachar</th>        <th>Description</th></tr>
-	<tr><td><code>^</td></code>      <td>Matches the beginning of a line. Does not consume any characters.</td></tr>
-	<tr><td><code>$</td></code>      <td>Matches the end of a line. Does not consume any characters.</td></tr>
-	<tr><td><code>*</td></code>      <td>Matches any number of repetitions of the preceding regex fragment.</td></tr>
-	<tr><td><code>+</td></code>      <td>Matches one or more repetitions of the preceding regex fragment.</td></tr>
-	<tr><td><code>?</td></code>      <td>Matches zero or one of the preceding regex fragment.</td></tr>
-</table>
-
-In order to match a literal metacharacter, it needs to be preceded by a '\' character.
-
-The following character classes are supported:
-
-<table>
-	<tr><tr><th>Charclass</th>       <th>Description</th></tr>
-	<tr><td><code>\d </code></td>    <td>ASCII digits</td></tr>
-	<tr><td><code>\D </code></td>    <td>Negation of ASCII digits</td></tr>
-	<tr><td><code>\x </code></td>    <td>ASCII Hex digits</td></tr>
-	<tr><td><code>\X </code></td>    <td>Negation of ASCII Hex digits</td></tr>
-	<tr><td><code>\s </code></td>    <td>ASCII spaces</td></tr>
-	<tr><td><code>\S </code></td>    <td>Negation of ASCII spaces</td></tr>
-	<tr><td><code>\w </code></td>    <td>ASCII word characters</td></tr>
-	<tr><td><code>\W </code></td>    <td>Negation of ASCII word characters</td></tr>
-	<tr><td><code>\h </code></td>    <td>ASCII whitespace characters</td></tr>
-	<tr><td><code>\H </code></td>    <td>Negation of ASCII whitespace characters</td></tr>
-	<tr><td><code>\pX</code></td>    <td>Characters with unicode property 'X'</td></tr>
-	<tr><td><code>\PX</code></td>    <td>Negation of characters with property 'X'</td></tr>
-</table>
-
-The current list of supported Unicode character classes `X` are
-
-<table>
-	<tr><th>Abbrev</th> <th>Full name</th>      <th>Description</th></tr>
-	<tr>
-		<td><code>L</code></td>  <td><code>Letter</code></td>
-		<td>All letters, including lowercase, uppercase, titlecase,
-		and uncased.</td>
-	</tr>
-	<tr>
-		<td><code>Lu</code></td> <td><code>Uppercase_Letter</code></td>
-		<td>All uppercase letters.</td>
-	</tr>
-	<tr>
-		<td><code>Ll</code></td> <td><code>Lowercase_Letter</code></td>
-		<td>All lowercase letters.</td>
-	</tr>
-	<tr>
-		<td><code>Lt</code></td> <td><code>Titlecase_Letter</code></td>
-		<td>All titlecase letters.</td>
-	</tr>
-	<tr>
-		<td><code>N</code></td>  <td><code>Number</code></td>
-		<td>All numbers.</td>
-	</tr>
-	<tr>
-		<td><code>Z</code></td>  <td><code>Separator</code></td>
-		<td>All separators, including spaces and control characers.</td>
-	</tr>
-	<tr>
-		<td><code>Zs</code></td> <td><code>Space_Separator</code></td>
-		<td>All space separators, including tabs and ASCII spaces.</td>
-        </tr>
-</table>
-
-Functions
----------
-
-    const parse	: (re : byte[:]	-> std.result(ast#, status))
-
-Parse takes a regex string, and converts it to a regex syntax tree, returning
-`\`std.Success ast#` if the regex was valid, or a `\`std.Failure r` if the
-regex could not be parsed. This AST can be used to further process the regex,
-possibly turning it into a multiregex as in Hairless, or using it for NFA and
-DFA tricks.
-
-    const compile	: (re : byte[:] -> std.result(regex#, status))
-    const dbgcompile	: (re : byte[:] -> std.result(regex#, status))
-
-`compile` takes a regex string, and converts it to a compiled regex, returning
-`\`std.Success regex` if the regex was valid, or a `\`std.Failure r` with the
-reason that the compilation failed. `dbgcompile` is similar, however, the
-regex is compiled so it will spit out a good deal of debugging output. Unless
-you are intent on debugging the internals of the regex engine, this is likely
-only of academic interest.
-
-    const free	: (re : regex# -> void)
-
-`free` must be called on a compiled regex to release it's resources after you
-are finished using it.
-
-    const exec	: (re : regex#, str : byte[:] -> std.option(byte[:][:])
-
-`exec` runs the regex over the specified text, returning an `\`std.Some matches`
-if the text matched, or `std.None` if the text did not match. matches[0] is
-always the full text that was matched, and will always be returned regardless
-of whether capture groups are specified.
-
-    const search	: (re : regex#, str : byte[:] -> std.option(byte[:][:]))
-
-`search` searches for a matching sub-segment of the regex over the specified
-text, returning an `\`std.Some matches` if the text matched, or `std.None` if
-the text did not match.  matches[0] is always the full text that was matched,
-and will always be returned regardless of whether capture groups are
-specified. `search` returns the the earliest match in the string provided.
-
-
-    const sub	: (re : regex#, str : byte[:], subst : byte[:][:] -> std.option(byte[:]))
-    const sbsub	: (sb : std.strbuf#, re : regex#, str : byte[:], subst : byte[:][:] -> bool)
-
-`sub` will take a pattern, an input string, and a set of substitutions, and
-attempt to match. If the match is successful, it will replace each group
-within `str` with `subst`, returning a freshly allocated string.  `sbsub`
-behaves identically, however it inserts the new string into the string
-buffer provided, instead of allocating a new string.
-
-If there is no match, then `\`std.None` will be returned.
-
-    const suball	: (re : regex#, str : byte[:], subst : byte[:][:] -> byte[:])
-    const sbsuball	: (sb : std.strbuf#, re : regex#, str : byte[:], subst : byte[:][:] -> void)
-
-`suball` replaces every match within the string using the given substitutions.
-Only captured groups will be substituted. The remaining text will be left in
-place.
-
-Example
-------
-
-#### Pattern matching
-
-```{runmyr regex}
-use std
-use regex
-
-const main = {
-	match regex.compile("ab(c+)")
-	| `std.Ok re:	runwith(re, "abccc")
-	| `std.Fail m:	std.fatal("Failed to compile regex\n")
-	;;
-}
-
-const runwith = {re, txt
-	match regex.exec(re, txt)
-	| `std.Some matches:
-		std.put("matched {}, got {} matches\n", txt, matches.len)
-		for m in matches
-			std.put("Match: {}\n", m)
-		;;
-		regex.matchfree(matches)
-	| `std.None:
-		std.put("%s did not match\n")
-	;;
-}
-```
-
-#### Substitution
-
-```{runmyr regex}
-use std
-use regex
-
-const main = {
-	var re
-
-	re = std.try(regex.compile("(a*)bc(d)e"))
-	match regex.sub(re, "aaabcdef", ["HEY", "X"][:])
-	| `std.Some sub:
-		std.put("{}\n", sub[0])
-		regex.matchfree(matches)
-	| `std.None:
-		std.fatal("should have matched")
-	;;
-}
-```
-
-```{runmyr regex}
-use std
-use regex
-
-const main = {
-	var re, sub
-
-	re = std.try(regex.compile("(b|e)"))
-        sub = regex.suball(re, "aaabbbcdef", ["SUB"][:])
-	std.put("subst: {}\n", sub)
-	std.slfree(sub)
-}
-```
--- a/doc/api/libstd/algorithms.txt
+++ /dev/null
@@ -1,129 +1,0 @@
-{
-        title:  Algorithms
-        description:    libstd: Algorithms
-}
-
-Algorithms
-----------
-
-    pkg std =
-            /* the result of a comparison */
-            type order = union
-                    `Before
-                    `Equal
-                    `After
-            ;;
-
-            /* sorting and searching */
-            generic sort	: (sl:@a[:], cmp:(a:@a, b:@a -> order) -> @a[:])
-            generic lsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-            generic bsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-            generic swap	: (a : @a#, b : @a# -> void)
-
-            /* prepackaged comparisons */
-            generic numcmp	: (a : @a, b : @a -> order)
-            const strcmp	: (a : byte[:], b : byte[:] -> order)
-            const strncmp	: (a : byte[:], b : byte[:], n : size -> order)
-
-            /* extrema and absolute values */
-            generic min	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-            generic max	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-            generic clamp	: (a : @a::numeric, min : @a::numeric, max : @a::numeric -> @a::numeric)
-            generic abs	: (a : @a::numeric -> @a::numeric)
-    ;;
-
-Overview
---------
-
-There are a number of algorithms that are pervasive through many programs.
-These include sorting, searching, and similar
-
-We only cover sorting and searching here, although more would be a good
-addition. Maybe in a separate library.
-
-Types
------
-
-    type order = union
-            `Before
-            `Equal
-            `After
-    ;;
-
-When comparing, it's useful to have an ordering between values. The order type
-is the result of a comparison, `a CMP b` describing whether the first value
-`a` comes before, after, or is equivalent to `b`.
-
-Functions: Sorting and Searching
---------------------------------
-
-    generic sort	: (sl:@a[:], cmp:(a:@a, b:@a -> order) -> @a[:])
-
-This function will sort a slice, modifying it in place. The comparison
-function `cmp` is used to decide how to order the slice. This comparison
-function must be transitive -- in otherwords, if A comes before B, and B comes
-before C, then A must come before C. This is true of most comparisons, but
-some care should be taken when attempting to provide "humanized" sorting.
-
-Returns: the same slice it was pased. The slice will not be reallocated or
-moved.
-
-    generic lsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-
-Performs a linear search for a value using the comparison predicate `cmp`. The
-slice is walked in order until the first value where `cmp` returns `\`Equal`.
-
-Returns: `\`Some idx`, or `\`None` if the value is not present.
-
-    generic bsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-
-Performs a binary search for a value using the comparison predicate `cmp`. The
-input slice `sl` must be sorted according to the comparsion function `cmp`
-such that for a value at index `idx`, the comparison `cmp(sl[idx - 1],
-sl[idx])` must return either `\`Before` or `\`Equal`.
-
-If there are multiple equal copies value within a list, the index retuned is
-not defined.
-
-Returns: `\`Some idx`, or `\`None` if the value is not present.
-
-    generic swap	: (a : @a#, b : @a# -> void)
-
-Takes two pointers to two values, and switches them. If the pointers are
-equal, this is a no-op.
-
-    generic numcmp	: (a : @a::numeric, b : @a::numeric -> order)
-    const strcmp	: (a : byte[:], b : byte[:] -> order)
-    const strncmp	: (a : byte[:], b : byte[:], n : size -> order)
-
-These functions are helpers for comparing values. They will compare any two
-numeric values, and will return the ordering between the two.
-
-Numcmp simply returns the result comparing whether `a` is less than `b`,
-relying on the behavior of the built in operators.
-
-Strcmp and strncmp will do a lexicographical comparison, comparing strings
-byte by byte. This is a useful and correct behavior for both strings of
-arbitrary data, and utf8 encoded strings, where it is equivalent to doing
-a comparison by codepoint.
-
-Functions: Extrema and Clamping
--------------------------------
-
-    generic min	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-    generic max	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-
-Min and max return the larger or smaller of the two numeric values passed to
-them, respectively. They rely on the built in comparison functions.
-
-    generic clamp	: (a : @a::numeric, min : @a::numeric, max : @a::numeric -> @a::numeric)
-
-Clamp clamps the value `a` to the range [min, max], and returns it. This means
-that if `a` is lower than `min`, or greater than `max`, it is adjusted to
-those bounds and returned.
-
-    generic abs	: (a : @a::numeric -> @a::numeric)
-
-Abs returns the absolute value of a number. This means that if the number is
-less than 0, it is retuned with the sign inverted. If the type `@a` is
-unsigned, then this function is a no-op.
--- a/doc/api/libstd/alloc.txt
+++ /dev/null
@@ -1,160 +1,0 @@
-{
-        title:  Allocation
-        description:  libstd: Allocation
-}
-
-Memory Allocation
------------------
-
-    pkg std =
-            generic mk	: (val : @a -> @a#)
-            generic alloc	: (		-> @a#)
-            generic zalloc	: (		-> @a#)
-            generic free	: (v:@a#	-> void)
-            generic slalloc	: (len : size	-> @a[:])
-            generic slzalloc	: (len : size	-> @a[:])
-            generic slgrow	: (sl : @a[:]#, len : size	-> @a[:])
-            generic slzgrow	: (sl : @a[:]#, len : size	-> @a[:])
-            generic slfree	: (sl : @a[:]	-> void)
-            const bytealloc	: (sz:size	-> byte#)
-            const zbytealloc	: (sz:size	-> byte#)
-            const bytefree	: (m:byte#, sz:size	-> void)
-    ;;
-
-    generic mk	: (val : @a -> @a#)
-
-`mk` creates a shallow copy of variable passed to it on the heap, returning a
-pointer to the value that it allocated. It is conventionally used for creating
-new copies of larger complex data structures, although it can be used to
-heapify any value.
-
-Returns: Pointer to fully initialized value of type '@a', based on the value
-passed in.
-
-    generic alloc	: (		-> @a#)
-    generic zalloc	: (		-> @a#)
-
-`alloc` allocates or free a single element of type @a, respectively. `zalloc`
-does the same, but zeros the memory allocated before returning it. `free` is
-used to return the memory allocated by these functions to the system. In
-general, `mk` is preferred over these functions, as it does not leave any
-values uninitialized.,
-
-    generic slalloc	: (len : size	-> @a[:])
-    generic slzalloc	: (len : size	-> @a[:])
-
-`slalloc` allocates or frees a slice of `len` items of type @a. `slzalloc`
-does the same, but zeros the memory allocated before returning it. `slfree`
-is used to return the memory to the system.
-
-    generic slgrow	: (sl : @a[:]#, len : size	-> @a[:])
-    generic slzgrow	: (sl : @a[:]#, len : size	-> @a[:])
-
-`slgrow` resizes the slize `sl` to length `len`, allocating the appropriate
-amount of memory. `slzgrow` does the same, but any elements between the old
-and new length are zeroed, as in slzalloc.
-
-    generic free	: (v:@a#	-> void)
-    generic slfree	: (sl : @a[:]	-> void)
-
-`free` and `slfree` free the storage allocated allocated for the value or
-slice passed to them , allowing it to be reused again later in the program.
-This memory may be unmapped and returned to the operating system, or it may be
-cached within the program.
-
-Any uses of memory after a `free` call is invalid.
-
-    const bytealloc	: (sz:size	-> byte#)
-    const zbytealloc	: (sz:size	-> byte#)
-    const bytefree	: (m:byte#, sz:size	-> void)
-
-`bytealloc` `bytezalloc`, and `bytefree` are the low level raw-byte allocation
-interface, returning blobs of bytes. Since the only way to use more than one
-of these bytes is to cast to a different type, the generic versions are
-generally a better choice.
-
-Examples
----------
-
-Overall, the examples here should not be unfamiliar to anyone who has used
-either C or C++.
-
-### Mk
-
-`std.mk` should be used to create new, fully constructed values wherever
-possible. The code for this looks like:
-
-```{runmyr mk-example}
-use std
-
-type mytype =
-	a : int
-	b : char
-	c : byte[:[
-;;
-
-const main = {
-        var v
-
-        v = std.mk([
-            .a = 123
-            .b = 'x'
-            .c = "my string" /* this isn't heapified */
-        ])
-
-        std.free(v)
-}
-```
-
-### Alloc and Zalloc
-
-`alloc` and `zalloc` know the type that they're being assigned to, and use
-this to calulate the size to allocate:
-
-
-```{runmyr mk-example}
-use std
-
-const main = {
-        var x : int#
-        var y : int#
-
-        x = std.alloc()
-        y = std.zalloc()
-        std.free(x)
-        std.free(y)
-}
-```
-
-### Slalloc and Slzalloc
-
-`slalloc` and `slzalloc` take a size to allocate, but infer the type similar
-to `alloc` and `zalloc`. They're freed with std.slfree() and slzfree().
-Thankfully, unlike C++ delete and delete[], it's impossible to pass a slice
-to the wrong free function.
-
-
-```{runmyr mk-example}
-use std
-
-const main = {
-        var x : int[:]
-
-        x = std.slalloc(10)     /* slice of 10 ints */
-        std.slfree(x)
-}
-```
-
-Growing slices can be done using slgrow() and slzgrow():
-
-```{runmyr mk-example}
-use std
-
-const main = {
-        var x : int[:]
-
-        x = std.slalloc(10)     /* slice of 10 ints */
-        x = std.slzgrow(x, 20)     /* x[10:20] are guaranteed to be zeroed.*/
-        std.slfree(x)
-}
-```
--- a/doc/api/libstd/bigint.txt
+++ /dev/null
@@ -1,208 +1,0 @@
-{
-        title:  Bigints
-        description:  libstd: Bigints
-}
-
-Bigints
--------
-
-  pkg std =
-            type bigint = struct
-            ;;
-
-            generic mkbigint	: (v : @a::(numeric,integral) -> bigint#)
-            const bigfree	: (a : bigint# -> void)
-            const bigdup	: (a : bigint# -> bigint#)
-            const bigassign	: (d : bigint#, s : bigint# -> bigint#)
-            const bigmove	: (d : bigint#, s : bigint# -> bigint#)
-            const bigparse	: (s : byte[:] -> option(bigint#))
-            const bigclear	: (a : bigint# -> bigint#)
-            const bigbfmt	: (b : byte[:], a : bigint#, base : int -> size)
-            const bigtoint	: (a : bigint#	-> @a::(numeric,integral))
-            const bigiszero	: (a : bigint# -> bool)
-            const bigeq	: (a : bigint#, b : bigint# -> bool)
-            const bigcmp	: (a : bigint#, b : bigint# -> order)
-            const bigadd	: (a : bigint#, b : bigint# -> bigint#)
-            const bigsub	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmul	: (a : bigint#, b : bigint# -> bigint#)
-            const bigdiv	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmod	: (a : bigint#, b : bigint# -> bigint#)
-            const bigdivmod	: (a : bigint#, b : bigint# -> (bigint#, bigint#))
-            const bigshl	: (a : bigint#, b : bigint# -> bigint#)
-            const bigshr	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmodpow	: (b : bigint#, e : bigint#, m : bigint# -> bigint#)
-            const bigpow	: (a : bigint#, b : bigint# -> bigint#)
-            generic bigeqi	: (a : bigint#, b : @a::(numeric,integral) -> bool)
-            generic bigaddi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigsubi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigmuli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigdivi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigshli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigshri	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            const bigpowi	: (a : bigint#, b : uint64 -> bigint#)
-    ;;
-
-
-Overview
---------
-
-While bigint usage in most programs is relatively rare, libstd needs them
-internally for handling floats, and several other widely used pieces of
-functionality also need them.
-
-This set of code covers the bulk of common big integer operations: Creation,
-input, output, and various arithmetic operations
-
-By convention, with a few exceptions, all operations on bigintegers will
-modify the bigint in place, and return a pointer to the first argument
-of the function. This allows for easy chaining of operations.
-
-A formatter for bigintegers is installed by default, so `std.put("{}\n",
-mybig)` will show  a reasonably formatted big integer. The standard `x`
-modifier is recognized to print the value in hex.
-
-Types
------
-
-    type bigint = struct
-    ;;
-
-This is a big integer. It stores big integers. Like it was an integer. But
-bigger.
-
-
-
-Functions: Bookkeeping and IO
------------------------
-
-    generic mkbigint	: (v : @a::(numeric,integral) -> bigint#)
-
-Mkbigint takes a regular small int, and creates a biginteger from that
-value. It allocates the value on the heap, returning a pointer to the bigint
-instance. This instance must be freed with `bigfree`.
-
-    const bigfree	: (a : bigint# -> void)
-
-Cleans up the storage associated with the bigint `a`.
-
-    const bigdup	: (a : bigint# -> bigint#)
-
-Bigdup creates a new biginteger, and copies the value from the original
-biginteger `a` into it. It returns a new biginteger.
-
-    const bigassign	: (d : bigint#, s : bigint# -> bigint#)
-
-Bigassign copies the value of the bigint `s` to `d`, and returns
-a pointer to `d`. No allocations or new values are created.
-
-    const bigmove	: (d : bigint#, s : bigint# -> bigint#)
-
-Bigmove clears the value of `d`, and moves the value from `s` into
-it efficiently, tearing down the value of `s` in the process. It
-returns a pointer to `d`.
-
-For example, if you had the `a=123` and `b=246`, then moving `a <= b`,
-the final values would be `a = 246` and `b = 0`.
-
-No new values are allocated.
-
-    const bigparse	: (s : byte[:] -> option(bigint#))
-
-Bigparse converts a string representation of an integer into a bigint,
-returning `\`Some val` if the string is a valid bigint, or `\`None` otherwise.
-
-Decimal, hex, octal, and binary biginteger strings are recognized. Decimal
-is the default, and is recognized unprefixed. Hex must be prefixed with `0x`,
-octal must be prefixed with `0o`, and binary must be prefixed with `0b`. As
-with all Myrddin integers, '_' is accepted and ignored within numerical
-constants.
-
-    const bigclear	: (a : bigint# -> bigint#)
-
-Bigclear zeroes out a biginteger, returning it.
-
-    const bigtoint	: (a : bigint#	-> @a::(numeric,integral))
-
-
-Bigtoint returns the low order digits of a bigint as an integer value. Care
-must be taken when using this function to ensure that values are not
-undesirably truncated.
-
-Functions: Arithmetic
----------------------
-
-    const bigiszero	: (a : bigint# -> bool)
-
-Bigiszero checks if a bigint is zero, and returns true if it is, or false if
-it is not.
-
-    const bigeq	: (a : bigint#, b : bigint# -> bool)
-
-Bigeq compares whether two integers are equal.
-
-    const bigcmp	: (a : bigint#, b : bigint# -> order)
-
-Bigcmp compares two big integers, and returns the ordering between them.
-`\`Before` if a < b, `\`After` if a > b, and `\`Equal` if the two values
-are equal.
-
-    const bigadd	: (a : bigint#, b : bigint# -> bigint#)
-    const bigsub	: (a : bigint#, b : bigint# -> bigint#)
-    const bigmul	: (a : bigint#, b : bigint# -> bigint#)
-    const bigdiv	: (a : bigint#, b : bigint# -> bigint#)
-    const bigmod	: (a : bigint#, b : bigint# -> bigint#)
-    const bigshl	: (a : bigint#, b : bigint# -> bigint#)
-    const bigshr	: (a : bigint#, b : bigint# -> bigint#)
-    const bigmodpow	: (b : bigint#, e : bigint#, m : bigint# -> bigint#)
-    const bigpow	: (a : bigint#, b : bigint# -> bigint#)
-
-All of these functions follow the convention mentioned in the summary: They
-apply the operation `a = a OP b`, where `a` is the first argument, and `b`
-is the second argument. They return `a`, without allocating a new result.
-
-    const bigdivmod	: (a : bigint#, b : bigint# -> (bigint#, bigint#))
-
-Bigdivmod is an exception to the above convention. Because it needs to return
-two values, it returns a tuple of newly allocated bigints.
-
-    generic bigeqi	: (a : bigint#, b : @a::(numeric,integral) -> bool)
-    generic bigaddi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    generic bigsubi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    generic bigmuli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    generic bigdivi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    generic bigshli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    generic bigshri	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-    const bigpowi	: (a : bigint#, b : uint64 -> bigint#)
-
-All of these are identical ot the bigint operations above, however instead of
-taking a bigint for their second operand, they take an integer. This is useful
-for when operations like multiplication or division by a small constant is
-needed.
-
-Examples
---------
-
-```{runmyr bigcmp}
-
-use std
-use bio
-
-const main = {args : byte[:][:]
-        var f
-
-        a = try(std.bigparse("1234_5678_1234_6789_6666_7777_8888"))
-        b = try(std.bigparse("0x75f3_fffc_1123_5ce4"))
-
-        match std.bigcmp(a, b)
-        | `std.Equal:   "{} is equal to {}\n", a, b)
-        | `std.Before:  "{} is less than {}\n", a, b)
-        | `std.After:  "{} is greater than {}\n", a, b)
-        ;;
-
-        std.bigmul(a, b)
-        std.bigdivi(a, 42)
-        std.put("a * b / 42 = {}\n", a)
-
-        std.bigfree(a, b)
-}
-```
--- a/doc/api/libstd/cli.txt
+++ /dev/null
@@ -1,290 +1,0 @@
-{
-        title:  CLI Parsing
-        description:  libstd: CLI Parsing
-}
-
-
-Command Line Parsing
---------------------
-
-Command line parsing is something that nearly every program needs. This
-section of libstd provides simple command line parsing with autogenerated
-help.
-
-    pkg std =
-            type optdef = struct
-                    argdesc	: byte[:]	/* the description for the usage */
-                    minargs	: std.size	/* the minimum number of positional args */
-                    maxargs	: std.size	/* the maximum number of positional args (0 = unlimited) */
-                    noargs	: std.bool	/* whether we accept args at all */
-                    opts	: optdesc[:]	/* the description of the options */
-            ;;
-            type optdesc = struct
-                    opt	: char
-                    arg	: byte[:]
-                    desc	: byte[:]
-                    optional	: bool
-            ;;
-            type optparsed = struct
-                    opts	: (char, byte[:])[:]
-                    args	: byte[:][:]
-            ;;
-
-            const optparse	: (optargs : byte[:][:], def : optdef# -> optparsed)
-            const optusage	: (prog : byte[:], def : optdef# -> void)
-    ;;
-
-Syntax
--------
-
-A command line is composed of a list of words, known as. These arguments may
-be options that the program can act on, known as "flags". These flags may take
-up to one argument. To avoid confusing with the top level arguments, this
-document will refer to them as "values". Anything that is not a flag is a
-"positional argument", or simply an "argument".
-
-In general, the POSIX syntax for arguments is followed, with a few minor
-enhancements. Myrddin program will use the following semantics for command
-line options:
-
- - Arguments are groupls of flags if they follow a '-'. A flag is any
-   single unicode character, potentially followed by a single value. This
-   value may be optional.
- - Flags that take values will consume the remainder of the argument as
-   the value. If the remainder of the argument is empty, then the next
-   argument is consumed as the value. For example, `-foo` and `-f oo`
-   are equivalent.
- - Any flags that do not take arguments may be placed before other
-   flags within the same argument. For example, `-x -y -z` is equivalent
-   to `-xyz`, as long as `-x` and `-y` have no optional arguments.
- - The first '--' stops flags from being recognized, and treats them
-   as arguments.
- - Flags may be supplied in any order, intermingled with arguments,
-   and repeated as many times as desired. An unrecognized flag is an
-   error, and will trigger a usage message.
-
-Types
-------
-
-The API provided for command line parsing is relatively declarative, with the
-options specified in a struct passed to the parsing.
-
-    type optdef = struct
-            argdesc	: byte[:]
-            minargs	: std.size
-            maxargs	: std.size
-            noargs	: std.bool
-            opts	: optdesc[:]
-    ;;
-
-The optdef is the top level structure describing the command line arguments.
-It contains the following fields:
-
-<dl>
-    <dt><code>argdesc</code></dt>
-    <dd>
-    <p>Argdesc is a string describing the positional arguments passed to the
-    program. It doesn't change the way that the arguments are parsed, but is
-    used to document the arguments to the user.</p>
-
-    <p>In general, this should be a summary of any expected argument. If a
-    variable number of them are expected, the argument should be followed
-    with a <code>...</code>.</p>
-
-    <p>For example, a program that takes an output and a list of inputs may
-    provide the following for <code>argdesc</code>:</p>
-
-    <p><code>"output inputs..."</code></p>
-
-    <p>When the help string is generated, the output would look like:</p>
-    <p><code>myprog [-o option] output inputs...</code></p>
-    </dd>
-
-    <dt><code>minargs</code></dt>
-    <dd>
-    <p>This argument limits the minimum number of arguments that the
-    program will accept without error. If at minimum 3 inputs are needed, for
-    example, then this value should be set to 3. This does not count flags,
-    nor does it count the program name.</p>
-    <p> If set to 0, this value is ignored. This is the default value.</p>
-    </dd>
-
-    <dt><code>maxargs</code></dt>
-    <dd>
-    <p>This argument limits the maximum number of arguments that the program
-    will accept without error. If the program takes at most 1 argument, for
-    example, example, then this value should be set to 3. Just like
-    <code>maxargs</code>, this does not count flags or the program name.
-    </p>
-    <p> If set to 0, this value is ignored. This is the default value.</p>
-    </dd>
-
-    <dt><code>noargs</code></dt>
-    <dd>
-    <p>This argument causes the program to reject any arguments at all.</p>
-    </dd>
-    <dt><code>opts</code></dt>
-    <dd><p>This is a list of descriptions of the options that this program
-    takes. This list may be empty, at which point this api still provides a
-    good way of checking that no invalid arguments are passed.</p>
-    </dd>
-</dl>
-    
-    
-    type optdesc = struct
-            opt	: char
-            arg	: byte[:]
-            desc	: byte[:]
-            optional	: bool
-    ;;
-
-This is a description of a command line argument. It contains the following
-fields to be set by the user:
-
-<dl>
-    <dt><code>opt</code></dt>
-    <dd>
-    <p>This is a single unicode character that is used for the option
-    flag.</p>
-    </dd>
-    <dt><code>arg</code></dt>
-    <dd>
-    <p>This is a single word description of the argument. If it is not present
-    or has zero length, this indicates that the flag takes no value.
-    Otherwise, the value is mandatory, unless the <code>optional</code> flag
-    is set.</p>
-    </dd>
-    <dt><code>optional</code></dt>
-    <dd>
-    <p>This is a boolean that allows for the value <code>arg</code> to be
-    optionally omitted when using the flag. It is disabled by default.
-    </p>
-    </dd>
-    <dt><code>desc</code></dt>
-    <dd>
-    <p>This is a short sentence describing <code>arg</code>. It has no
-    semantic effect on the option parsing, and is only used in generating
-    help output for the arguments.
-    </p>
-    </dd>
-</dl>
-
-
-    type optparsed = struct
-            opts	: (char, byte[:])[:]
-            args	: byte[:][:]
-            prog        : byte[:]
-    ;;
-
-This is the final result of parsing the options. The `opts` member contains a
-list of options in the form of `(opt, val)` pairs. The option `opt` will be
-repeated once for every time that the flag `opt` is seen within the command
-line.
-
-If there is no value passed with the flag, then the string will be the empty
-string. Otherwise, it will contain the string passed.
-
-The `args` member contains the arguments, collected for easy iteration, and the
-`prog` member contains the binary name.
-
-Functions
-----------
-
-    const optparse	: (optargs : byte[:][:], def : optdef# -> optparsed)
-
-Optparse takes an array `optargs` containing the command line arguments passed
-to the program, as well as an `optdef` pointer describing the expected
-arguments, and spits out out an `optparsed`. The arguments `optargs` are
-expected to contain the program name.
-
-    const optusage	: (prog : byte[:], def : optdef# -> void)
-
-
-Optusage takes the string `prog` containing the program name, and an `def`
-containing an `optdef` which describes the arguments to provide help for. It
-prints these out on `stderr` (fd 1), and returns.
-
-
-Examples:
---------
-
-This example is a trivial one, which parses no flags, and merely
-errors if given any.
-
-    const main = {args
-        var cmd
-        
-        cmd = std.optparse(args, &[
-                .argdesc = "vals",
-        ])
-        for arg in cmd.args
-                std.put("arg: {}\n", arg)
-        ;;
-    }
-
-This example shows some more advanced usage, and is extracted from
-mbld.
-
-    const main = {args
-	var dumponly
-	var targname
-	var bintarg
-	var cmd 
-	var libpath
-	
-	cmd = std.optparse(args, &[
-		.argdesc = "[inputs...]",
-		.opts = [
-			[.opt='t', .desc="list all available targets"],
-			[.opt='T', .arg="tag", .desc="build with specified systag"],
-			[.opt='S', .desc="generate assembly when building"],
-			[.opt='d', .desc="dump debugging information for mbld"],
-			[.opt='I', .arg="inc", .desc="add 'inc' to your include path"],
-			[.opt='R', .arg="root", .desc="install into 'root'"],
-			[.opt='b', .arg="bin", .desc="compile binary named 'bin' from inputs"],
-			[.opt='l', .arg="lib", .desc="compile lib named 'lib' from inputs"],
-			[.opt='r', .arg="rt", .desc="link against runtime 'rt' instead of default"],
-			[.opt='C', .arg="mc", .desc="compile with 'mc' instead of the default compiler"],
-			[.opt='M', .arg="mu", .desc="merge uses with 'mu' instead of the default muse"],
-		][:]
-	])
-	targname = ""
-	tags = [][:]
-	for opt in cmd.opts
-		match opt
-		| ('t', ""):	dumponly = true
-		| ('S', ""):	bld.opt_genasm = true
-		| ('I', arg):	bld.opt_incpaths = std.slpush(bld.opt_incpaths, arg)
-		| ('R', arg):	bld.opt_instroot = arg
-		| ('T', tag):	tags = std.slpush(tags, tag)
-		| ('b', arg):
-			targname = arg
-			bintarg = true
-		| ('l', arg):
-			targname = arg
-			bintarg = false
-		| ('r', arg):
-			if std.sleq(arg, "none")
-				bld.opt_runtime = ""
-			else
-				bld.opt_runtime = arg
-			;;
-		/*
-		internal undocumented args; used by compiler suite for
-		building with an uninstalled compiler.
-		*/
-		| ('d', arg): bld.opt_debug = true
-		| ('C', arg): bld.opt_mc = arg
-		| ('M', arg): bld.opt_muse = arg
-		| _:	std.die("unreachable\n")
-
-		;;
-	;;
-
-        for arg in cmd.args
-                /* build stuff */
-        ;;
-    }
-
-
-
--- a/doc/api/libstd/datastruct.txt
+++ /dev/null
@@ -1,181 +1,0 @@
-{
-        title:  Data Structures
-        description:  libstd: Data Structures
-}
-
-
-Data Structures
-----------------
-
-    pkg std =
-            type htab(@k, @v) = struct
-            ;;
-
-            type bitset = struct
-            ;;
-
-            /* hash tables */
-            generic mkht	: (h : (k : @k -> uint32), eq : (a : @k, b : @k -> bool) -> htab(@k, @v)#)
-            generic htfree	: (ht : htab(@k, @v)# -> void)
-            generic htput	: (ht : htab(@k, @v)#, k : @k, v : @v -> void)
-            generic htdel	: (ht : htab(@k, @v)#, k : @k -> void)
-            generic htget	: (ht : htab(@k, @v)#, k : @k -> option(@v))
-            generic htgetv	: (ht : htab(@k, @v)#, k : @k, fallback : @v-> @v)
-            generic hthas	: (ht : htab(@k, @v)#, k : @k -> bool)
-            generic htkeys	: (ht : htab(@k, @v)# -> @k[:])
-
-            /* bit sets */
-            const mkbs	: (-> bitset#)
-            const bsdup	: (bs : bitset# -> bitset#)
-            const bsfree	: (bs : bitset# -> void)
-            const bsmax	: (a : bitset# -> size)
-            generic bsput	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            generic bsdel	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            generic bshas	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            const bsdiff	: (a : bitset#, b : bitset# -> void)
-            const bsintersect	: (a : bitset#, b : bitset# -> void)
-            const bsunion	: (a : bitset#, b : bitset# -> void)
-            const bseq	: (a : bitset#, b : bitset# -> bool)
-            const bsissubset	: (a : bitset#, b : bitset# -> bool)
-            const bsclear	: (bs : bitset# -> bitset#)
-
-            /* prepackaged hashing and equality tests */
-            const strhash	: (s : byte[:]	-> uint32)
-            const streq	: (a : byte[:], b : byte[:]	-> bool)
-            generic ptrhash	: (p : @a#	-> uint32)
-            generic ptreq	: (a : @a#, b : @a#	-> bool)
-            generic inthash	: (v : @a::(integral,numeric)	-> uint32)
-            generic inteq	: (a : @a::(integral,numeric), b : @a::(integral,numeric) -> bool)
-            generic slhash	: (sl : @a[:] -> uint32)
-    ;;
-
-Hash Tables
------------
-
-The need for key value lookup shows up everywhere, so libstd contains an
-implementation of hash tables.
-
-    type htab(@k, @v) = struct
-    ;;
-
-The hash table is a generic type which contains any key and any value. The
-key used is `@k`, and the value is `@v`.
-
-    generic mkht	: (h : (k : @k -> uint32), eq : (a : @k, b : @k -> bool) -> htab(@k, @v)#)
-
-Mkht creates a hash table on the heap. It accepts two functions, for hashing
-and equality comparison. The hash table should be freed with `htfree`.
-
-    generic htfree	: (ht : htab(@k, @v)# -> void)
-
-Htfree frees a hash table and associated storage. The keys and values remain
-untouched.
-
-    generic htput	: (ht : htab(@k, @v)#, k : @k, v : @v -> void)
-
-Inserts a key value pair into the hash table `ht`. If there is already a value
-with the key `k`, then the key value pair will be replaced.
-
-    generic htdel	: (ht : htab(@k, @v)#, k : @k -> void)
-
-Removes a key value pair from the hash table `ht`.
-
-    generic htget	: (ht : htab(@k, @v)#, k : @k -> option(@v))
-
-Looks up a value from a hash table, returning `\`Some v` if the key is
-present, or `\`None` if the value is not present.
-
-    generic htgetv	: (ht : htab(@k, @v)#, k : @k, fallback : @v-> @v)
-
-Looks up a value from a hash table, returning the value if the key is
-present, or `fallback` if it is not present.
-
-    generic hthas	: (ht : htab(@k, @v)#, k : @k -> bool)
-
-Looks up a value from a hash table, returning `true` if the key is
-present, or `falase` if the value is not present.
-
-    generic htkeys	: (ht : htab(@k, @v)# -> @k[:])
-
-Returns a list of all the keys present in the hash table. This list is
-heap allocated, and must be freed with `slfree`.
-
-
-Bit Sets
---------
-
-The need for sets lookup shows up in many places, so libstd contains an
-implementation of bit sets. Any numeric value can be put into the set,
-and with the current API they may be freely intermixed [BUG?]
-
-    type bitset = struct
-    ;;
-
-The bitset holds a set of integers. It works well for relatively dense, small
-integers, as storage used is `O(max_value)`.
-
-    const mkbs	: (-> bitset#)
-
-Creates an empty bit set. The returned bit set should be freed with `bsfree`.
-
-    const bsdup	: (bs : bitset# -> bitset#)
-
-Duplicates an existing bit set. The returned bit set should be freed with
-`bsfree`.
-
-    const bsfree	: (bs : bitset# -> void)
-
-Frees all resources associated with the bitset `bs`.
-
-    const bsmax	: (a : bitset# -> size)
-
-Returns the maximum value that the bitset contains. This is an approximation
-of the capacity of the bitset, not a hard limit on the number of elements.
-
-    const bscount	: (a : bitset# -> size)
-
-Returns the total number of elements that the bitset contains. This is an
-O(n) operation that involves iterating all of the bits.
-
-    generic bsput	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-
-Inserts the integer value `v` into the bit set `bs`. Returns `true` if this
-operation changed the set, or `false` otherwise.
-
-    generic bsdel	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-
-Removes the integer value `v` from the bit set `bs`. Returns `true` if this
-operation changed the set, or `false` otherwise.
-
-    generic bshas	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-
-Returns whether the bit set `bs` contains the value `v`.
-
-    const bsdiff	: (a : bitset#, b : bitset# -> void)
-
-Takes the set difference between `a` and `b`, storing the result back into
-`a`.
-
-    const bsintersect	: (a : bitset#, b : bitset# -> void)
-
-Takes the set intersection between `a` and `b`, storing the result back into
-`a`.
-
-    const bsunion	: (a : bitset#, b : bitset# -> void)
-
-Takes the set union between `a` and `b`, storing the result back into `a`.
-
-    const bseq	: (a : bitset#, b : bitset# -> bool)
-
-Tests whether the bitsets `a` and `b` contain the same elements, returning
-`true` if they are equivalent and `false` otherwise.
-
-    const bsissubset	: (a : bitset#, b : bitset# -> bool)
-
-Tests whether every element of `b` is also within `a`, returning `true` if
-`true` if `b` is a subset of `a`, and `false` otherwise.
-
-    const bsclear	: (bs : bitset# -> bitset#)
-
-Zeros every value within the bitset `bs`. This is equivalent to iterating
-through it and deleting every element.
--- a/doc/api/libstd/dns.txt
+++ /dev/null
@@ -1,102 +1,0 @@
-{
-        title: DNS
-        description:    libstd: DNS
-}
-
-Networking
-----------
-
-     pkg std =
-            type rectype = union
-                    `DnsA	/* host address */
-                    `DnsNS	/* authoritative name server */
-                    `DnsCNAME	/* canonical name for an alias */
-                    `DnsSOA	/* marks the start of a zone of authority */
-                    `DnsWKS	/* well known service description */
-                    `DnsPTR	/* domain name pointer */
-                    `DnsHINFO	/* host information */
-                    `DnsMINFO	/* mailbox or mail list information */
-                    `DnsMX	/* mail exchange */
-                    `DnsTXT	/* text strings */
-                    `DnsAAAA	/* ipv6 host address */
-            ;;
-
-            type resolveerr = union
-                    `Badhost
-                    `Badsrv
-                    `Badquery
-                    `Badresp
-            ;;
-
-            type hostinfo = struct
-                    fam	: sys.sockfam
-                    stype	: sys.socktype
-                    ttl	: uint32
-                    addr	: netaddr
-            ;;
-
-            const resolve	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-            const resolvemx	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-            const resolverec	: (host : byte[:], t : rectype	-> result(hostinfo[:], resolveerr))
-    ;;
-
-
-Data Types
-----------
-
-    type rectype = union
-            `DnsA	/* host address */
-            `DnsNS	/* authoritative name server */
-            `DnsCNAME	/* canonical name for an alias */
-            `DnsSOA	/* marks the start of a zone of authority */
-            `DnsWKS	/* well known service description */
-            `DnsPTR	/* domain name pointer */
-            `DnsHINFO	/* host information */
-            `DnsMINFO	/* mailbox or mail list information */
-            `DnsMX	/* mail exchange */
-            `DnsTXT	/* text strings */
-            `DnsAAAA	/* ipv6 host address */
-    ;;
-
-This union contains all of the record types that we claim to know how to
-resolve. At the moment, few of them have been tested sufficiently (only A
-records can reasonably be said to be exercised).
-
-    type resolveerr = union
-            `Badhost
-            `Badsrv
-            `Badquery
-            `Badresp
-    ;;
-
-This union contains the errors that we can encounter when trying to resolve a
-host.
-
-    type hostinfo = struct
-            fam	: sys.sockfam
-            stype	: sys.socktype
-            ttl	: uint32
-            addr	: netaddr
-    ;;
-
-DNS Resolution
---------------
-
-    const resolve	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-
-Resolves the A or AAAA record for the host `host` using DNS. This function
-does caching, expiring based on the TTL. Returns all of the host info entries sent
-back by DNS or found in the cache on success, or a resolve error on failure.
-
-    const resolvemx	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-
-Resolves the MX record for the host `host` using DNS. This function does
-caching, expiring based on the TTL. Returns all of the host info entries sent
-back by DNS or found in the cache on success, or a resolve error on failure.
-
-    const resolverec	: (host : byte[:], t : rectype	-> result(hostinfo[:], resolveerr))
-
-Resolves a record from DNS. This function's interface is slightly broken, as
-it will never work for TXT or CNAME records.
-
-
--- a/doc/api/libstd/err.txt
+++ /dev/null
@@ -1,116 +1,0 @@
-{
-        title:  Error Handling
-        description:  libstd: Error Handling
-}
-
-
-Error Handling
---------------
-
-    pkg std =
-            type option(@a) = union
-                    `Some @a
-                    `None
-            ;;
-
-            type result(@a, @b) = union
-                    `Ok	@a
-                    `Fail	@b
-            ;;
-
-            $noret const fatalv	: (fmt : byte[:], ap : valist# -> void)
-            $noret const fatal	: (fmt : byte[:], args : ... -> void)
-            const assert	: (cond : bool, fmt : byte[:], args : ... -> void)
-            const die           : (msg : byte[:] -> void)
-            const suicide	: ( -> void)
-
-            generic try : (v : result(@a, @b) -> @a)
-            generic tryv : (v : result(@a, @b), d : @a -> @a)
-            generic get : (v : option(@a) -> @a)
-            generic getv : (v : option(@a), d : @a -> @a)
-    ;;
-
-Overview
---------
-
-Myrddin does not have exceptions. By convention, code will abort on
-programmer errors, such as passing invalid values where valid ones
-were expected -- for example, calling `std.fmt("{}")` with the wrong
-number of arguments int the list.
-
-For recoverable error conditions that depend on the environment, and
-not the developer making a mistake, one of the branched return types
-are conventionally used.
-
-For conditions where something can be either present or not, the `option(@a)`
-type is used. For places where there can be either a result or an error, the
-`result(@a, @e)` type is used.
-
-Generally, by convention, the type returned for the result should have a
-custom that converts it to something directly displayable to the user.
-
-Types
------
-
-    type option(@a) = union
-            `Some @a
-            `None
-    ;;
-
-As mentioned in the overview, `option(@a)` is a type that wraps up a result
-and error type. It is typically used  in places where a missing value is the
-only exceptional condition.
-
-    type result(@a, @b) = union
-            `Ok	@a
-            `Fail	@b
-    ;;
-
-
-The type `result(@a, @e)` is used to signal either success or an error
-condition. The first type parameter, `@a` is what is returned on success,
-and the second, `@b` is returned on failure.
-
-
-Functions
----------
-    $noret const fatalv	: (fmt : byte[:], ap : valist# -> void)
-    $noret const fatal	: (fmt : byte[:], args : ... -> void)
-
-Both fatal and fatalv exit the program with an error message, formatted as
-in `std.fmt`. They do not return.
-
-They exit with a failure status. On Unix, this status is `1`. On Plan 9,
-the status is the failure message that it prints out before exiting.
-
-    const assert	: (cond : bool, fmt : byte[:], args : ... -> void)
-
-Assert checks that condition is true. If it is not true, then the message
-is printed as in `std.fmt`, and the program is aborted with `suicide()`.
-
-    const suicide	: ( -> void)
-
-Suicide aborts a program. It does not print any message, it simply sends
-the program a SIGABRT or segfaults it. All threads are terminated, and the
-program goes away.
-
-    generic try : (v : result(@a, @b) -> @a)
-    generic get : (v : option(@a) -> @a)
-
-Try and get both return the value from the successful branch of their type:
-`try` returns the value contained in `\`std.Ok`, and `get` returns the value
-in `\`std.Some`.
-
-If this does not match the union, a diagnostic message is printed and the
-program is aborted.
-
-    generic tryv : (v : result(@a, @b), default : @a -> @a)
-    generic getv : (v : option(@a), default : @a -> @a)
-
-Try and get both return the value from the successful branch of their type:
-`try` returns the value contained in `\`std.Ok`, and `get` returns the value
-in `\`std.Some`.
-
-If this does not match the union, the default value is returned to the
-caller, as though the type had contained `\`Some default` or `\`Ok default` 
-
--- a/doc/api/libstd/files.txt
+++ /dev/null
@@ -1,369 +1,0 @@
-{
-        title:  File Handling
-        description:    libstd: File Handling
-}
-
-File Handling
--------------
-
-
-    pkg std =
-            type dir = struct
-            ;;
-
-            /* seek options */
-            const Seekset	: whence 
-            const Seekcur	: whence 
-            const Seekend	: whence 
-
-            /* open options */
-            const Ordonly  	: fdopt 
-            const Owronly  	: fdopt 
-            const Ordwr    	: fdopt 
-            const Otrunc   	: fdopt 
-            const Ocreat   	: fdopt 
-            const Oappend  	: fdopt 
-            const Odir	: fdopt 
-
-            /* directory handling */
-            const diropen	: (p : byte[:] -> std.result(dir#, byte[:]))
-            const dirread	: (d : dir# -> std.option(byte[:]))
-            const dirclose	: (d : dir# -> void)
-            const dirname	: (p : byte[:] -> byte[:])
-            const mkdir	: (path : byte[:], mode : int64 -> int64)
-            const mkpath	: (p : byte[:] -> bool)
-            const chdir	: (path : byte[:] -> bool)
-
-            /* file handling */
-            const open	: (path : byte[:], opts : fdopt -> std.result(fd, errno))
-            const openmode	: (path : byte[:], opts : fdopt, mode : int64 -> std.result(fd, errno))
-            const mktemp	: (base : byte[:], opts : fdopt, mode : int64 -> std.result((fd, byte[:]), errno)
-            const close	: (fd : fd -> int64)
-            const creat	: (path : byte[:], mode : int64 -> fd)
-            const read	: (fd : fd, buf : byte[:] -> size)
-            const write	: (fd : fd, buf : byte[:] -> size)
-            const seek	: (fd : fd, delta : off, whence : whence -> off)
-            const pipe	: (fds : fd[2]# -> int64)
-            const dup2	: (ofd : fd, nfd : fd -> fd)
-            const remove	: (path : byte[:] -> bool)
-            const unlink	: (path : byte[:] -> int)
-
-            /* path manipulation */
-            const basename	: (p : byte[:] -> byte[:])
-            const pathcat	: (a : byte[:], b : byte[:] -> byte[:])
-            const pathjoin	: (p : byte[:][:] -> byte[:])
-            const pathnorm	: (p : byte[:] -> byte[:])
-            const getcwd : (-> byte[:])
-
-            /* file properties */
-            const fmtime	: (f : byte[:]	-> result(time, errno))
-            const fsize	: (f : byte[:]	-> result(off, errno))
-            const fexists	: (f : byte[:]	-> bool)
-            const fisdir	: (f : byte[:]	-> bool)
-
-            /* convenience functions */
-            const slurp : (path : byte[:] -> result(byte[:], byte[:]))
-            const fslurp : (path : fd -> result(byte[:], byte[:]))
-            const blat : (path : byte[:], buf : byte[:], perm : int64 -> bool)
-            const fblat : (f : fd, buf : byte[:] -> bool)
-    ;;
-
-
-Data Types and Constants
-------------------------
-
-Libstd's file APIs are generally relatively thin wrappers around the host OS
-functions. They are a portable subset of this functionality, designed for both
-ease of use and portability.
-
-    type dir = struct
-    ;;
-
-The directory struct represents the current state of a directory walk.
-
-    /* seek options */
-    const Seekset	: whence 
-    const Seekcur	: whence 
-    const Seekend	: whence 
-
-These are a set of values which describe from where to seek within the file.
-
-    /* open options */
-    const Oread  	: fdopt 
-    const Owrite  	: fdopt 
-    const Ordwr    	: fdopt 
-    const Otrunc   	: fdopt 
-    const Ocreat   	: fdopt 
-
-These are a set of options that are passed to the open variants describing
-what mode to open the file in. These are bit masks which be OR'ed together to
-combine them.
-
-`Oread` and `Owrite` request permission to read and write the file, respectively.
-`Ordwr` is a convenience flag which ors read and write together. `Otrunc`
-indicates that the file should be truncated to zero bytes in length before it
-is opened. `Ocreat` indicates that the file should be created if it does not
-exist instead of returning an error. `Odir` indicates that this file should
-be opened as a directory.
-
-`Ocreat` does not create the path leading to it, and will return an error if
-that path does not exist.
-
-
-Directories
------------
-
-    const diropen	: (p : byte[:] -> std.result(dir#, byte[:]))
-
-The `diropen` function opens a path as a directory, and returns a pointer
-to an object which tracks the state of the directory, allowing for reading
-file names one by one from this directory.
-
-Returns: Either a directory wrapped up in the `\`Ok` branch of the result,
-or a string describing the failure reason in the `\`Fail` branch.
-
-    const dirread	: (d : dir# -> result(option(byte[:]), errno)
-
-The `dirread` reads a single entry from the directory, opened with `diropen`,
-returning it as a string. 
-
-Returns `\`Some entry`, or `\`None` at the end of the directory.
-
-    const dirclose	: (d : dir# -> void)
-
-`dirclose` closes a directory for reading. This frees all associated
-resources, returning them to the system. The directory passed in must have
-been opened with `diropen`.
-
-Returns: Nothing.
-
-    const mkdir	: (path : byte[:], mode : int64 -> errno)
-
-`mkdir` creates the directory specified in `path`. with the mode `mode`. It
-requires the parent directory to exist and be writable. Absolute paths will
-be created relative to the root of the file system, and relative paths will
-be created relative to the current working directory, as usual.
-
-If the directory already exists, this is counted as a failure to create the
-directory.
-
-Returns: Enone on success, or the error that caused the failure if it fails.
-
-    const mkpath	: (path : byte[:] -> errno)
-
-`mkpath` creates a full path specified by `path`. It creates all of the
-path components required to create the full path specified. It requires
-the parent of the first directory entry that is not currently in existence
-to be writable.
-
-Absolute paths will be created relative to the root of the file system, and
-relative paths will be created relative to the current working directory, as
-usual.
-
-Returns: Enone on success, or the error that caused the directory creation
-to fail on failure.
-
-    const chdir	: (path : byte[:] -> bool)
-
-Chdir changes the current working directory to the path specified in `path`.
-
-Returns: True on success, false on failure.
-
-Files
------
-
-    const open	: (path : byte[:], opts : fdopt -> result(fd, errno))
-    const openmode	: (path : byte[:], opts : fdopt, mode : int64 -> result(fd, errno))
-
-Open opens the file `path` for I/O according to the flags reqeusted in `opts`,
-and returns a result containing the file descriptor or error. The mode is a
-combination of the modes specified above: `Oread`,   `Owrite`, `Ordwr`,
-`Otrunc`, or `Ocreat`.
-
-Openmode is similar to open, however, if Ocreate is passed, it the file
-requested will be created with the permissions passed in.
-
-Returns: either a valid file descriptor on success, or an error describing why
-the open failed on failure.
-
-    const mktemp : (base : byte[:], opts : fdopt, mode : int64 -> std.result((fd, byte[:]), errno)
-
-Mktemp is similar to openmode, however instead of taking a full path as
-its first argument, it generates a unique name for a file in temporary
-storage by appending a random string to the base name `base`. The mode
-provided is in addition to the implicit Ocreat | Oexcl.
-
-Returns: Either a successful result containing the tuple of file descriptor
-opened and path generated, or an error describing the failure. The path
-is allocated with `std.slalloc`, and must be freed by the caller using
-`std.slfree`. The file descriptor must be closed as ususal.
-
-
-    const close	: (fd : fd -> void)
-
-Closes closes the file descriptor. If the file descriptor is valid, close
-is guaranteed to close it. If it is not valid, this is a no-op.
-
-    const read	: (fd : fd, buf : byte[:] -> result(size, errno))
-
-Reads up to the length of `buf` from the file descriptor `fd`, at the current
-offset within the file, advancing the offset by the count of bytes read. The
-buffer may not be filled entirely when the read completes. For example, when
-reading from a console, often only one line will be returned at a time.
-
-Conventionally, `0` bytes are returned at the end of the file.
-
-Returns: Either the number of bytes read on success, or the error that caused
-a failure reading on failure.
-
-    const write	: (fd : fd, buf : byte[:] -> result(size, errno))
-
-Write writes up to the length of `buf` to the file descriptor, writing the
-bytes at the current offset. The offset is advanced by the number of bytes
-that were written, extending the file size if necessary. Write is not
-guaranteed to write the full buffer.
-
-Returns: The number of bytes written on success, or the error that caused
-the failure on error.
-
-    const seek	: (fd : fd, delta : off, whence : whence -> result(off, errno))
-
-Seek changes the current offset within the file descriptor `fd` by `delta`.
-This delta can be treated in three different ways, depending on the value of
-`whence.
-
-If `whence` is Seekset, then `delta` is treated as an absolute value to seek
-to, and the offset is set to `delta`. If `whence` is `Seekcur`, then `delta`
-is added to the current offset.  If `whence` is `Seekend`, then `delta` is
-added to the size of the file.
-
-Returns: Either the new offset within the file on success, or the error that
-occurred on failure.
-
-    const pipe	: (fds : fd[2]# -> errno)
-
-Pipe creates a unidirectional channel for communication between processes.
-Two file descriptors are returned in the array fd. Data written to fd[1] is
-available in fd[0]. The pipe may or may not be buffered.
-
-Returns: Enone on success, otherwise, returns the error that caused this
-call to fail.
-
-    const dup2	: (ofd : fd, nfd : fd -> result(fd, errno))
-
-Dup2 copies the old fd `ofd` to the new fd `nfd`. If the file descriptor
-`nfd` is already open, then it is implicitly closed by this call before
-the fd is copied. This is done atomically.
-
-Returns: Either the new fd used, on success, or an error describing the
-failure.
-
-    const remove	: (path : byte[:] -> errno)
-
-Remove removes the file specified from the directory in which it is contained.
-The user must have write permissions for the directory in order to remove
-files from it. If `path` is a directory, it must be empty.
-
-Returns: Enone on success, otherwise the error that caused the failure.
-
-Path Manipulation
------------------
-    const basename	: (p : byte[:] -> byte[:])
-    const dirname	: (p : byte[:] -> byte[:])
-
-Given a string of the form "foo/bar/baz", `dirname()` returns the directory
-component of it -- in other words, everything up to the final `/`. It ignores
-trailing slashes. It 
-
-The caller is responsible for freeing the path with `slfree`.
-
-For example, `dirname("foo/bar//")` will return `"foo/bar"`.
-
-    const pathcat	: (a : byte[:], b : byte[:] -> byte[:])
-
-Pathcat joins two paths together, using '/' as a directory
-separator. The paths are normalized before being returned. This
-call is shorthand for `std.pathjoin([a, b][:])`.
-
-The caller is responsible for freeing the path with `slfree`.
-
-Returns: A concatenated path.
-
-    const pathjoin	: (p : byte[:][:] -> byte[:])
-
-Pathcat joins a list of paths together, using '/' as a directory
-separator. The paths are normalized before being returned. This
-call is shorthand for `std.pathjoin([a, b][:])`.
-
-The caller is responsible for freeing the path with `slfree`.
-
-Returns: A concatenated path.
-
-    const pathnorm	: (p : byte[:] -> byte[:])
-
-Pathnorm does a purely lexical normalization of the path. It removes
-redundant components, doubled `/` characters, and similar. The returned
-path is equivalent to the original input path.
-
-The caller is responsible for freeing the path with `slfree`.
-
-Returns: A new normalized path.
-
-    const getcwd : (-> byte[:])
-
-Returns the current working directory of the program. The caller is
-responsible for freeing the path with `slfree`.
-
-Returns: A string representing the working directory.
-
-File Properties
----------------
-
-    const fmtime	: (f : byte[:]	-> result(time, errno))
-
-Returns either the last modification time of the file `f`, or
-the error that was encountered extracting this information.
-
-    const fsize	: (f : byte[:]	-> result(off, errno))
-
-Returns either the size in bytes of the file `f`, or
-the error that was encountered extracting this information.
-
-    const fexists	: (f : byte[:]	-> bool)
-
-Returns `true` if the file is able to be `stat`ed, or `false`
-if this fails.
-
-    const fisdir	: (f : byte[:]	-> bool)
-
-Returns `true` if the file is a directory that is able to be `stat`ed, or
-`false` if this fails.
-
-Convenience Functions
----------------------
-
-    const slurp : (path : byte[:] -> result(byte[:], errno))
-
-Reads all bytes from `path` until the end of file.
-
-Returns either the file data, or the failure encountered.
-
-    const fslurp : (fd : fd -> result(byte[:], errno))
-
-Reads all bytes from the file descriptor `fd` until the end of file.
-
-Returns either the file data, or the failure encountered.
-
-    const blat : (path : byte[:], buf : byte[:], perm : int64 -> bool)
-
-Creates the file `path` with permissions `perm`, and writes as much of
-`buf` as it can into it.
-
-Returns Enone if no errors were encountered. Otherwise, the error is returned.
-
-    const fblat : (f : fd, buf : byte[:] -> bool)
-
-Writes as much of `buf` as it can into the file descriptor `fd`.
-
-Returns Enone if no errors were encountered. Otherwise, the error is returned.
-
--- a/doc/api/libstd/fmt.txt
+++ /dev/null
@@ -1,201 +1,0 @@
-{
-        title:  Formatted I/O
-        description:  libstd: Formatted I/O
-}
-
-
-
-Formatted I/O
--------
-
-    pkg std =
-            /* output to file descriptors */
-            const put	: (fmt : byte[:], args : ... -> size)
-            const fput	: (fd : fd, fmt : byte[:], args : ... -> size)
-            const putv	: (fmt : byte[:], ap : valist# -> size)
-            const fputv	: (fd : fd, fmt : byte[:], ap : valist# -> size)
-
-            /* formatting values */
-            const fmt	: (fmt : byte[:], args : ... -> byte[:])
-            const fmtv	: (fmt : byte[:], ap : valist# -> byte[:])
-            const bfmt	: (buf : byte[:], fmt : byte[:], args : ... -> byte[:])
-            const bfmtv	: (buf : byte[:], fmt : byte[:], ap : valist# -> byte[:])
-            const sbfmt	: (buf : strbuf#, fmt : byte[:], args : ... -> size)
-            const sbfmtv	: (buf : strbuf#, fmt : byte[:], ap : valist# -> size)
-            
-            /* custom formatting */
-            const fmtinstall	: (ty : byte[:], \
-                    fn : (sb : strbuf#, \
-                            ap : valist#, \
-                            opts : (byte[:],byte[:])[:] \
-                            -> void), \
-		optdesc : (byte[:], bool)[:] \
-		-> void)
-    ;;
-
-
-Overview
---------
-
-Formatting in Myrddin is done with format strings. These are effectively
-dynamically typed at runtime, using introspection to decide the best way to
-format a type. Custom formatters are allowed and encouraged.
-
-Formatting is specified with a `{}` pair, with any specifiers describing the
-formatting passed in as a comma separated set of key value pairs. For example,
-an integer can be padded with zeros and formatted in hex with the following
-format specifier: `{p=0,x}`. If you want a literal '{' character, it can
-be escaped by doubling it.
-
-None of the format specifiers print a newline character by default.
-
-Format Specifiers
---------------------------
-
-The set of specifiers for the default types is sparse, and is fully
-specified below.
-
-<dl>
-    <dt>w=WIDTH</dt>
-    <dd><p>Fill out to at least width WIDTH, filling with pad
-    characters.</p></dd>
-
-    <dt>p=PAD</dt>
-    <dd>
-    <p>Fill spare width with this character. Defaults to a space
-    character.</p> </dd>
-
-    <dt>x</dt>
-    <dd>
-    <p>Format in hex. This is only valid for integer types.</p>
-    </dd>
-
-    <dt>j=joiner</dt>
-    <dd>
-    <p>Join slices with the joiner string. This leaves off the square
-    brackets from the ends, and replaces the default joiner string ", ".
-    </p>
-    </dd>
-</dl>
-
-Specifiers can be installed by custom specifiers, and can be any
-arbitrary set of strings.
-
-Functions
----------
-
-All the format functions come in two variants: A variadic one, and one
-that takes a variadic argument list. The latter is present for ease of
-chaining from within a variadic function.
-
-    const put	: (fmt : byte[:], args : ... -> size)
-    const fput	: (fd : fd, fmt : byte[:], args : ... -> size)
-    const putv	: (fmt : byte[:], ap : valist# -> size)
-    const fputv	: (fd : fd, fmt : byte[:], ap : valist# -> size)
-
-The `put` set of functions will format and output to a file descriptor. For
-`put` and `putv`, the file descriptor is stdout. For `fput` and `fputv`, the
-file descriptor is the one that is provided.
-
-These functions write immediately, and do not buffer, although they do attempt
-to do their writing in a single system call, and will only split the call if
-the kernel indicates short writes.
-
-The `v` variants will take a variadic argument list for printing.
-
-Returns: the number of bytes written to the file descriptor.
-
-    const sbfmt	: (buf : strbuf#, fmt : byte[:], args : ... -> size)
-    const sbfmtv	: (buf : strbuf#, fmt : byte[:], ap : valist# -> size)
-
-The sbfmt functions will append to a string buffer, instead of writing to an
-output stream, but are otherwise similar to the `fmt` functions. These
-functions will return the number of bytes formatted. If the string buffer is
-statically sized, and gets filled, the truncated size will be returned.
-
-    const fmt	: (fmt : byte[:], args : ... -> byte[:])
-    const fmtv	: (fmt : byte[:], ap : valist# -> byte[:])
-
-These functions will format according to the format string, and return a
-freshly allocated string containing the formatted string. This string should
-be freed with `slfree`.
-
-    const bfmt	: (buf : byte[:], fmt : byte[:], args : ... -> byte[:])
-    const bfmtv	: (buf : byte[:], fmt : byte[:], ap : valist# -> byte[:])
-
-These functions will format according to the format string, putting the result
-into `buf`. They return a slice into the buffer array.
-    
-    const fmtinstall	: (ty : byte[:], \
-            fn : (sb : strbuf#, 
-                    ap : valist#, \
-                    opts : (byte[:],byte[:])[:] \
-                    -> void), \
-        optdesc : (byte[:], bool)[:] \
-        -> void)
-
-Fmtinstall installs a custom formatter for a type. The type `ty` is a type
-description that you would want to format. It can be obtained
-using `std.typeof(var)`, `fn` is a function that handles custom formatting,
-and `optdesc` is a list of options that this custom formater takes. It is
-in the form a list of strings -- the argument names -- and booleans that
-define whether these arguments take values.
-
-
-The custom formatter takes a string buffer `sb` which you are expected to
-format the custom input into, as well as a valist that you are expected to
-pull the value from. Finally, it takes an option list.
-
-If a formatter is already installed for a type, it is replaced.
-
-Examples
---------
-
-This example demonstrates a bunch of formatting using the std.format API. It
-covers all of the various format specifiers, escaping, as well as showing the
-formatting of complex types.
-
-```{runmyr fmtsimple}
-use std
-
-const main = {
-        /* default formats */
-	std.put("{} {}\n", "abcd", 123)
-	std.put("{}\n", [1,2,3][:])
-	std.put("{}\n", (1,"foo"))
-
-        /* mix in some format options */
-	std.put("{w=10}\n", "abcd")
-	std.put("{p=0,w=10}\n", "abcdefghijkl")
-	std.put("{w=10,x}\n", 10)
-	std.put("{p=0,w=10}\n", 10)
-
-        /* and now some escaping */
-	std.put("{}bar{}\n", "foo\n", "baz")
-	std.put("{{}}bar{}\n", "baz")
-	std.put("{{bar{}}}\n", "baz")
-}
-```
-
-This example shows how you would set up a 
-
-```{runmyr customfmt}
-use std
-
-const main = {
-        var x : int = 0 /* dummy: used for typeof */
-
-        std.fmtinstall(std.typeof(x), goaway, [][:])
-        std.put("custom format: {}\n", 0x41)
-}
-
-const goaway = {sb, ap, opts
-        var i : int64
-
-        i = std.vanext(ap)
-        std.sbfmt(sb, "go away! char val={}\n", i castto(char))
-}
-```
-
-
-
--- a/doc/api/libstd/index.txt
+++ /dev/null
@@ -1,711 +1,0 @@
-{
-        title:  libstd
-        description:  libstd: Summary
-}
-
-Libstd Summary
----------------
-
-This is a summary page listing all of the functions and types available
-in libstd, sorted by category. The library is a bit of a grab bag of
-functionality, but a good chunk of what is needed will be built in to
-the library.
-
-
-#### [Memory Allocation](alloc)
-
-Memory allocation is a function that nearly every program needs
-to be able to do. Myrddin's generics allow for relatively easy
-to use and typesafe functions for this to be written.
-
-    pkg std =
-            generic mk	: (val : @a -> @a#)
-            generic alloc	: (		-> @a#)
-            generic zalloc	: (		-> @a#)
-            generic free	: (v:@a#	-> void)
-            generic slalloc	: (len : size	-> @a[:])
-            generic slzalloc	: (len : size	-> @a[:])
-            generic slgrow	: (sl : @a[:]#, len : size	-> @a[:])
-            generic slzgrow	: (sl : @a[:]#, len : size	-> @a[:])
-            generic slfree	: (sl : @a[:]	-> void)
-            const bytealloc	: (sz:size	-> byte#)
-            const zbytealloc	: (sz:size	-> byte#)
-            const bytefree	: (m:byte#, sz:size	-> void)
-    ;;
-
-#### [Error Handling](err)
-
-Myrddin provides a number of types and operations for propagating errors
-for later handling.
-
-It also provides operations for throwing up your hands, setting yourself on
-fire, and screaming, if that's more appropriate.
-
-    pkg std =
-            type option(@a) = union
-                    `Some @a
-                    `None
-            ;;
-            pkg std =
-                    type result(@a, @b) = union
-                            `Ok	@a
-                            `Fail	@b
-                    ;;
-            ;;
-
-            $noret const fatalv	: (fmt : byte[:], ap : valist# -> void)
-            $noret const fatal	: (fmt : byte[:], args : ... -> void)
-            const assert	: (cond : bool, fmt : byte[:], args : ... -> void)
-            const suicide	: ( -> void)
-
-            generic try : (v : result(@a, @b) -> @a)
-            generic tryv : (v : result(@a, @b), d : @a -> @a)
-            generic get : (v : option(@a) -> @a)
-            generic getv : (v : option(@a), d : @a -> @a)
-    ;;
-
-#### [OS Interfaces](os)
-
-The OS interfaces cover some portable primitives for handling processes
-and OS errors. It restricts itself to a set of portable wrappers for OS
-functionality.
-
-For complete interfaces, the `sys` library is your friend, providing
-all OS functionality that can be provided.
-
-    pkg std =
-            type sysinfo = struct
-                    system	: byte[:]
-                    version	: byte[:]
-                    release	: byte[:]
-                    arch	: byte[:]
-                    uname	: sys.utsname	/* storage */
-            ;;
-
-            type waitstatus = union
-                    `Wsuccess
-                    `Wfailure
-                    `Wsignalled
-                    `Waiterror
-            ;;
-
-            const Enone	: errno
-            const Erange	: errno
-            const Ebadf	: errno
-            const Eexist	: errno
-            const Einval	: errno
-            const Efault	: errno
-            const Eio	: errno
-            const Emisc : errno
-
-            const getsysinfo	: (si : sysinfo# -> void)
-            const execvp	: (cmd : byte[:], args : byte[:][:] -> int64)
-            const execvpe	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
-            const getenv	: (name : byte[:] -> option(byte[:]))
-            const getenvv	: (name : byte[:], default : byte[:] -> byte[:])
-            const getpid	: ( -> pid)
-            const fork		: (-> pid)
-            const exec		: (cmd : byte[:], args : byte[:][:] -> int64)
-            const execve	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
-            const waitpid	: (pid:pid, loc:int32#, opt : int64	-> int64)
-            const spork	: (cmd : byte[:][:]	-> result((pid, fd, fd), int))
-            const sporkfd	: (cmd : byte[:][:], infd : fd, outfd : fd	-> result(pid, int))
-            const exit	: (status:int -> void)
-            const wait	: (pid : pid -> waitstatus)
-    ;;
-
-#### [File Handling](files)
-
-Many programs do file i/o by default. This package provides a portable
-interface to the common subset that most programs need and most OSes provide.
-
-    pkg std =
-            type dir = struct
-            ;;
-
-            /* seek options */
-            const Seekset	: whence 
-            const Seekcur	: whence 
-            const Seekend	: whence 
-
-            /* open options */
-            const Ordonly  	: fdopt 
-            const Owronly  	: fdopt 
-            const Ordwr    	: fdopt 
-            const Otrunc   	: fdopt 
-            const Ocreat   	: fdopt 
-            const Oappend  	: fdopt 
-            const Odir	: fdopt 
-
-            /* directory handling */
-            const diropen	: (p : byte[:] -> std.result(dir#, byte[:]))
-            const dirread	: (d : dir# -> std.option(byte[:]))
-            const dirclose	: (d : dir# -> void)
-            const dirname	: (p : byte[:] -> byte[:])
-            const mkdir	: (path : byte[:], mode : int64 -> int64)
-            const mkpath	: (p : byte[:] -> bool)
-            const chdir	: (path : byte[:] -> bool)
-
-            /* file handling */
-            const open	: (path : byte[:], opts : fdopt -> fd)
-            const openmode	: (path : byte[:], opts : fdopt, mode : int64 -> fd)
-            const close	: (fd : fd -> int64)
-            const creat	: (path : byte[:], mode : int64 -> fd)
-            const read	: (fd : fd, buf : byte[:] -> size)
-            const write	: (fd : fd, buf : byte[:] -> size)
-            const seek	: (fd : fd, delta : off, whence : whence -> off)
-            const pipe	: (fds : fd[2]# -> int64)
-            const dup2	: (ofd : fd, nfd : fd -> fd)
-            const remove	: (path : byte[:] -> bool)
-            const unlink	: (path : byte[:] -> int)
-
-            /* path manipulation */
-            const basename	: (p : byte[:] -> byte[:])
-            const pathcat	: (a : byte[:], b : byte[:] -> byte[:])
-            const pathjoin	: (p : byte[:][:] -> byte[:])
-            const pathnorm	: (p : byte[:] -> byte[:])
-            const getcwd : (-> byte[:])
-
-            /* file properties */
-            const fmtime	: (f : byte[:]	-> option(time))
-            const fsize	: (f : byte[:]	-> option(off))
-            const fexists	: (f : byte[:]	-> bool)
-            const fisdir	: (f : byte[:]	-> bool)
-
-            /* convenience functions */
-            const slurp : (path : byte[:] -> result(byte[:], byte[:]))
-            const fslurp : (path : fd -> result(byte[:], byte[:]))
-            const blat : (path : byte[:], buf : byte[:], perm : int64 -> bool)
-            const fblat : (f : fd, buf : byte[:] -> bool)
-    ;;
-
-#### [Networking](networking)
-
-The networking related functionality in libstd provides the ability to
-quickly and easily open file descriptors to a server, as well as to 
-resolve servers and handle IP parsing.
-
-Currently, there is a large hole in functionality for announcing and
-serving, where raw system specific network APIs neeed to be used
-from the `sys` library.
-
-    pkg std =
-            type rectype = union
-                    `DnsA	/* host address */
-                    `DnsNS	/* authoritative name server */
-                    `DnsCNAME	/* canonical name for an alias */
-                    `DnsSOA	/* marks the start of a zone of authority */
-                    `DnsWKS	/* well known service description */
-                    `DnsPTR	/* domain name pointer */
-                    `DnsHINFO	/* host information */
-                    `DnsMINFO	/* mailbox or mail list information */
-                    `DnsMX	/* mail exchange */
-                    `DnsTXT	/* text strings */
-                    `DnsAAAA	/* ipv6 host address */
-            ;;
-
-            type resolveerr = union
-                    `Badhost
-                    `Badsrv
-                    `Badquery
-                    `Badresp
-            ;;
-
-            type hostinfo = struct
-                    fam	: sys.sockfam
-                    stype	: sys.socktype
-                    ttl	: uint32
-                    addr	: ipaddr
-            ;;
-
-            type ipaddr = union
-                    `Ipv4	byte[4]
-                    `Ipv6	byte[16]
-            ;;
-
-            /* network connections */
-            const dial	: (dialstr : byte[:] -> result(fd, byte[:]))
-            const resolve	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-            const resolvemx	: (host : byte[:]	-> result(hostinfo[:], resolveerr))
-            const resolverec	: (host : byte[:], t : rectype	-> result(hostinfo[:], resolveerr))
-
-            /* ip parsing */
-            const ipparse	: (ip : byte[:]	-> option(ipaddr))
-            const ip4parse	: (ip : byte[:] -> option(ipaddr))
-            const ip6parse	: (ip : byte[:] -> option(ipaddr))
-
-            generic hosttonet	: (v : @a -> @a)
-            generic nettohost	: (v : @a -> @a)
-    ;;
-
-#### [Command Line Parsing](cli)
-
-Simple command line parsing is offered, designed to meet the needs of most
-programs quickly and easily. There isn't much to say here.
-    
-    pkg std =
-            type optdef = struct
-                    argdesc	: byte[:]	/* the description for the usage */
-                    minargs	: std.size	/* the minimum number of positional args */
-                    maxargs	: std.size	/* the maximum number of positional args (0 = unlimited) */
-                    noargs	: std.bool	/* whether we accept args at all */
-                    opts	: optdesc[:]	/* the description of the options */
-            ;;
-            type optdesc = struct
-                    opt	: char
-                    arg	: byte[:]
-                    desc	: byte[:]
-                    optional	: bool
-            ;;
-            type optparsed = struct
-                    opts	: (char, byte[:])[:]
-                    args	: byte[:][:]
-            ;;
-
-            const optparse	: (optargs : byte[:][:], def : optdef# -> optparsed)
-            const optusage	: (prog : byte[:], def : optdef# -> void)
-    ;;
-
-#### [Formatted Output](fmt)
-
-libstd supports a number of simple, easy to use formatting functions,
-which can provide a sane format for any type out of the box, but also
-support custom formatters for specific types, so that they can be pretty
-printed. Many of the builtin types, such as bigints, install custom
-formatters by default.
-
-    pkg std =
-            /* output to file descriptors */
-            const put	: (fmt : byte[:], args : ... -> size)
-            const fput	: (fd : fd, fmt : byte[:], args : ... -> size)
-            const putv	: (fmt : byte[:], ap : valist# -> size)
-            const fputv	: (fd : fd, fmt : byte[:], ap : valist# -> size)
-
-            /* formatting values */
-            const fmt	: (fmt : byte[:], args : ... -> byte[:])
-            const fmtv	: (fmt : byte[:], ap : valist# -> byte[:])
-            const bfmt	: (buf : byte[:], fmt : byte[:], args : ... -> byte[:])
-            const bfmtv	: (buf : byte[:], fmt : byte[:], ap : valist# -> byte[:])
-            const sbfmt	: (buf : strbuf#, fmt : byte[:], args : ... -> size)
-            const sbfmtv	: (buf : strbuf#, fmt : byte[:], ap : valist# -> size)
-            
-            /* custom formatting */
-            const fmtinstall	: (ty : byte[:], \
-                    fn : (sb : strbuf#, \
-                            ap : valist#, \
-                            opts : (byte[:],byte[:])[:] \
-                            -> void), \
-		optdesc : (byte[:], bool)[:] \
-		-> void)
-    ;;
-
-#### [Iteration Utilities](iterutil)
-
-Support for some common iteration patterns is provided. There are many kinds
-of iteration that are done, and some of the most common ones are directly
-supported by libstd.
-
-There are a few syntactic(!) issues in the language preventing these from
-taking arbitrary iterators as parameters, but when this is resolved, that
-restriction will be lifted.
-
-	pkg std =
-		type zipiter(@a, @b)
-		type reverseiter(@a)
-		type enumiter(@a)
-
-		impl iterable zipiter(@a, @b) -> (@a, @b)
-		impl iterable enumiter(@a) -> (size, @a)
-		impl iterable reverseiter(@a) -> @a
-
-		generic byzip	: (a : @a[:], b : @b[:]	 -> zipiter(@a, @b))
-		generic byenum	: (a : @a[:] -> enumiter(@a))
-		generic byreverse 	: (sl : @a[:] -> reverseiter(@a))
-	;;
-
-
-#### [Variadic Arguments](varargs)
-
-Myrddin supports variadic arguments for functions, and allows you
-to walk over them, similar to the varargs functions in C, but safer.
-
-In addition, the Myrddin compiler generates type information for the types
-that are compiled into a program. This code provides a rather awkward API
-for iterating over them, and inspecting their values.
-
-    pkg std =
-            type typedesc = union
-                    `Tynone
-                    
-                    /* atomic types */
-                    `Tyvoid
-                    `Tybool
-                    `Tychar
-                    
-                    `Tyint8
-                    `Tyint16
-                    `Tyint
-                    `Tyint32
-                    `Tyint64
-                    
-                    `Tybyte
-                    `Tyuint8
-                    `Tyuint16
-                    `Tyuint
-                    `Tyuint32
-                    `Tyuint64
-                    `Tyflt32
-                    `Tyflt64
-                    `Tyvalist
-                    
-                    /* compound types */
-                    `Typtr byte[:]
-                    `Tyfunc	typecursor
-                    `Tyslice byte[:]
-                    `Tyarray (size, byte[:])
-                    
-                    /* aggregate types */
-                    `Tytuple	typecursor
-                    `Tystruct	typecursor
-                    `Tyunion	typecursor
-                    /* name info */
-                    `Tyname (byte[:], byte[:])
-            ;;
-            type typecursor = struct
-                    nelt	: size
-                    rem	: byte[:]
-                    isnamed	: bool
-                    isiter	: bool
-            ;;
-            type typeinfo = struct
-                    size	: size
-                    align	: size
-            ;;
-            generic typeof	: (v : @a -> byte[:])
-            const typeenc	: (p : ...# -> typecursor)
-            const typeenccursor	: (e : byte[:] -> typecursor)
-            const typedesc	: (e : byte[:] -> typedesc)
-            const typeinfo	: (e : byte[:] -> typeinfo)
-            const tcnext	: (t : typecursor# -> byte[:])
-            const tcpeek	: (t : typecursor# -> byte[:])
-            const ncpeek	: (t : typecursor# -> (byte[:], byte[:]))
-            const ncnext	: (t : typecursor# -> (byte[:], byte[:]))
-
-            const vastart	: (args : ...# -> valist)
-            const vatype	: (ap : valist# -> byte[:])
-            const vabytes	: (ap : valist# -> byte[:])
-            const vaenter	: (ap : valist# -> valist)
-            generic vanext	: (ap : valist# -> @a)
-    ;;
-
-#### [Slice manipulation](slices)
-
-Slices are used everywhere within Myrddin code, so clearly we have
-some functions to manipulate them. They're listed here. Boopity boopity
-boo.
-
-    pkg std =
-            generic sleq	: (a : @a[:], b : @a[:] -> bool)
-            generic slcp    : (a : @a[:], b : @a[:] -> void)
-            generic slput	: (sl : @a[:], idx : size, elt : @a	-> @a[:])
-            generic slpush	: (sl : @a[:]#, elt : @a	-> @a[:])
-            generic sldup   : (sl : @a[:] -> @a[:])
-            generic slfill	: (sl : @a[:], v : @a	-> @a[:])
-            generic sljoin	: (dst : @a[:]#, src : @a[:]	-> @a[:])
-    ;;
-
-#### [String Manipulation](strings)
-
-String manipulation also tends to show up in code sometimes. Here are some
-functions that do that. These are all unicode aware, and will not corrupt
-utf8 data.
-
-    pkg std =
-            /* string buffers */
-            type strbuf = struct
-            ;;
-
-            const mksb	: (-> strbuf#)
-            const mkbufsb	: (buf : byte[:] -> strbuf#)
-            const sbfin	: (sb : strbuf# -> byte[:])
-            const sbfree	: (sb : strbuf# -> void)
-            const sbpeek	: (sb : strbuf# -> byte[:])
-            const sbputc	: (sb : strbuf#, v : char -> bool)
-            const sbputs	: (sb : strbuf#, v : byte[:] -> bool)
-            const sbputb	: (sb : strbuf#, v : byte -> bool)
-            const sbtrim	: (sb : strbuf#, len : size -> void)
-
-            /* string searching */
-            const strfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-            const strrfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-            const strhas	: (haystack : byte[:], needle : byte[:]	-> bool)
-            const hasprefix	: (s : byte[:], pre : byte[:] -> bool)
-            const hassuffix	: (s : byte[:], suff : byte[:] -> bool)
-
-            /* C strings */
-            const cstrlen	: (buf : byte[:] -> size)
-            const cstrconv	: (buf : byte[:] -> byte[:])
-            const cstrconvp	: (p : byte# -> byte[:])
-
-            /* tokenizing and splitting */
-            const strsplit	: (s : byte[:], delim : byte[:] -> byte[:][:])
-            const strtok	: (s : byte[:] -> byte[:][:])
-
-            /* string joining and stripping */
-            const strcat	: (a : byte[:], b : byte[:] -> byte[:])
-            const strjoin	: (strings : byte[:][:], delim : byte[:] -> byte[:])
-            const strstrip	: (str : byte[:] -> byte[:])
-            const strfstrip	: (str : byte[:] -> byte[:])
-            const strrstrip	: (str : byte[:] -> byte[:])
-
-            /* parsing numbers out of strings */
-            generic intparsebase	: (s : byte[:], base : int -> option(@a::(integral,numeric)))
-            generic intparse	: (s : byte[:]	-> option(@a::(integral,numeric)))
-            generic charval : (c : char, base : int -> @a::(integral,numeric))
-    ;;
-
-#### [Unicode](unicode)
-
-A bunch of predicates and conversions to handle unicode. This only
-provides simple functionality. For canonicalization, collation, and
-all of the other UAX algorithms, go look in.. oh, who am I kidding.
-I haven't had a chance to write them yet.
-
-    pkg std =
-            const Badchar	: char 
-            const Maxcharlen : size 
-            const Maxcharval : char 
-
-            /* utf8 information */
-            const charlen	: (chr : char -> size)
-            const encode	: (buf : byte[:], chr : char -> size)
-            const decode	: (buf : byte[:] -> char)
-            const striter	: (str : byte[:] -> (char, byte[:]))
-
-            /* character class predicates */
-            const isalpha	: (c : char -> bool)
-            const isdigit	: (c : char -> bool)
-            const isxdigit	: (c : char -> bool)
-            const isnum	: (c : char -> bool)
-            const isalnum	: (c : char -> bool)
-            const isspace	: (c : char -> bool)
-            const isblank	: (c : char -> bool)
-            const islower	: (c : char -> bool)
-            const isupper	: (c : char -> bool)
-            const istitle	: (c : char -> bool)
-
-            /* character class conversions */
-            const tolower	: (c : char -> char)
-            const toupper	: (c : char -> char)
-            const totitle	: (c : char -> char)
-    ;;
-
-#### [Pervasive Data Structures](datastruct)
-
-There are some data structures that basically every program seems to use:
-Sets, and hash tables. Libstd includes them for that reason.
-
-    pkg std =
-            type bitset = struct
-            ;;
-
-            type htab(@k, @v) = struct
-            ;;
-
-	    type htkviter(@k, @v)
-	    impl iterable htkviter
-
-	    type bsiter = struct
-	    impl iterable bsiter
-
-            /* bit sets */
-            const mkbs	: (-> bitset#)
-            const bsdup	: (bs : bitset# -> bitset#)
-            const bsfree	: (bs : bitset# -> void)
-            const bsmax	: (a : bitset# -> size)
-            const bscount	: (a : bitset# -> size)
-            generic bsput	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            generic bsdel	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            generic bshas	: (bs : bitset#, v : @a::(integral,numeric) -> bool)
-            const bsdiff	: (a : bitset#, b : bitset# -> void)
-            const bsintersect	: (a : bitset#, b : bitset# -> void)
-            const bsunion	: (a : bitset#, b : bitset# -> void)
-            const bseq	: (a : bitset#, b : bitset# -> bool)
-            const bsissubset	: (a : bitset#, b : bitset# -> bool)
-            const bsclear	: (bs : bitset# -> bitset#)
-	    const bybsvalue	: (bs : bitset# -> bsiter)
-
-            /* hash tables */
-            generic mkht	: (h : (k : @k -> uint32), eq : (a : @k, b : @k -> bool) -> htab(@k, @v)#)
-            generic htfree	: (ht : htab(@k, @v)# -> void)
-            generic htput	: (ht : htab(@k, @v)#, k : @k, v : @v -> void)
-            generic htdel	: (ht : htab(@k, @v)#, k : @k -> void)
-            generic htget	: (ht : htab(@k, @v)#, k : @k -> option(@v))
-            generic htgetv	: (ht : htab(@k, @v)#, k : @k, fallback : @v-> @v)
-            generic hthas	: (ht : htab(@k, @v)#, k : @k -> bool)
-            generic htkeys	: (ht : htab(@k, @v)# -> @k[:])
-            generic byhtkeyvals	: (ht : htab(@k, @v)# -> htkviter(@k, @v))
-
-            /* prepackaged hashing and equality tests */
-            const strhash	: (s : byte[:]	-> uint32)
-            const streq	: (a : byte[:], b : byte[:]	-> bool)
-            generic ptrhash	: (p : @a#	-> uint32)
-            generic ptreq	: (a : @a#, b : @a#	-> bool)
-            generic inthash	: (v : @a::(integral,numeric)	-> uint32)
-            generic inteq	: (a : @a::(integral,numeric), b : @a::(integral,numeric) -> bool)
-            generic slhash	: (sl : @a[:] -> uint32)
-    ;;
-
-
-#### [Pervasive Algorithms](algorithms)
-
-Many programs also use sorting and searching, so this is also provided by
-libstd. In addition, we package some useful comparison and hashing functions
-
-    pkg std =
-            /* the result of a comparison */
-            type order = union
-                    `Before
-                    `Equal
-                    `After
-            ;;
-
-            /* sorting and searching */
-            generic sort	: (sl:@a[:], cmp:(a:@a, b:@a -> order) -> @a[:])
-            generic lsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-            generic bsearch	: (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric)))
-            generic swap	: (a : @a#, b : @a# -> void)
-
-            /* prepackaged comparisons */
-            generic numcmp	: (a : @a, b : @a -> order)
-            const strcmp	: (a : byte[:], b : byte[:] -> order)
-            const strncmp	: (a : byte[:], b : byte[:], n : size -> order)
-
-            /* extrema and absolute values */
-            generic min	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-            generic max	: (a : @a::numeric, b : @a::numeric  -> @a::numeric)
-            generic clamp	: (a : @a::numeric, min : @a::numeric, max : @a::numeric -> @a::numeric)
-            generic abs	: (a : @a::numeric -> @a::numeric)
-    ;;
-
-#### [Randomness](randomness)
-    
-And of course, you can't go without being a little random at times.
-
-    pkg std =
-            const mksrng	: (seed : uint32 -> rng#)
-            const freerng	: (rng : rng# -> void)
-            generic rand	: (lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-            generic rngrand	: (rng : rng#, lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-            generic rngrandnum	: (rng : rng# -> @a::(numeric,integral))
-            const rngrandbytes	: (rng : rng#, buf : byte[:]	-> size)
-    ;;
-
-#### [Bigint Operations](bigint)
-
-While bigint usage in most programs is relatively rare, libstd needs them
-internally for handling floats, and several other widely used pieces of
-functionality also need them.
-
-As they are a significant amount of code, I decided it made sense to
-expose them in the public API.
-
-    pkg std =
-            type bigint = struct
-            ;;
-
-            generic mkbigint	: (v : @a::(numeric,integral) -> bigint#)
-            const bigfree	: (a : bigint# -> void)
-            const bigdup	: (a : bigint# -> bigint#)
-            const bigassign	: (d : bigint#, s : bigint# -> bigint#)
-            const bigmove	: (d : bigint#, s : bigint# -> bigint#)
-            const bigparse	: (s : byte[:] -> option(bigint#))
-            const bigclear	: (a : bigint# -> bigint#)
-            const bigbfmt	: (b : byte[:], a : bigint#, base : int -> size)
-            const bigtoint	: (a : bigint#	-> @a::(numeric,integral))
-            const bigiszero	: (a : bigint# -> bool)
-            const bigeq	: (a : bigint#, b : bigint# -> bool)
-            const bigcmp	: (a : bigint#, b : bigint# -> order)
-            const bigadd	: (a : bigint#, b : bigint# -> bigint#)
-            const bigsub	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmul	: (a : bigint#, b : bigint# -> bigint#)
-            const bigdiv	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmod	: (a : bigint#, b : bigint# -> bigint#)
-            const bigdivmod	: (a : bigint#, b : bigint# -> (bigint#, bigint#))
-            const bigshl	: (a : bigint#, b : bigint# -> bigint#)
-            const bigshr	: (a : bigint#, b : bigint# -> bigint#)
-            const bigmodpow	: (b : bigint#, e : bigint#, m : bigint# -> bigint#)
-            const bigpow	: (a : bigint#, b : bigint# -> bigint#)
-            generic bigeqi	: (a : bigint#, b : @a::(numeric,integral) -> bool)
-            generic bigaddi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigsubi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigmuli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigdivi	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigshli	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            generic bigshri	: (a : bigint#, b : @a::(integral,numeric) -> bigint#)
-            const bigpowi	: (a : bigint#, b : uint64 -> bigint#)
-    ;;
-
-
-#### [Closures](closures)
-
-There are functions for heapifying closures, too.
-
-    pkg std =
-            generic fndup	: (fn : @fn::function -> @fn::function)
-            generic fnfree	: (fn : @fn::function -> void)
-    ;;
-
-#### [Misc](misc)
-
-Well, I said it was a grab bag.  These don't really fit into any overarching
-category.
-
-    pkg std =
-            generic KiB	: @a::(integral,numeric)	
-            generic MiB	: @a::(integral,numeric)	
-            generic GiB	: @a::(integral,numeric)	
-            generic TiB	: @a::(integral,numeric)	
-            generic PiB	: @a::(integral,numeric)	
-            generic EiB	: @a::(integral,numeric)	
-            generic ZiB	: @a::(integral,numeric)	
-            generic YiB	: @a::(integral,numeric)	
-
-            generic Sec  : @a::(integral,numeric)
-            generic Msec  : @a::(integral,numeric)
-            generic Usec  : @a::(integral,numeric)
-
-            /* time */
-            const now	: (-> time)
-
-            /* packing integers */
-            generic putle64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-
-            /* unpacking integers */
-            generic getle64	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe64	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle32	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe32	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle16	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe16	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle8	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe8	: (buf : byte[:]	-> @a::(numeric,integral))
-
-            /* exploding and stitching floats */
-            const flt64bits	: (flt : flt64 -> int64)
-            const flt32bits	: (flt : flt32 -> int32)
-            const flt64frombits	: (bits : uint64 -> flt64)
-            const flt32frombits	: (bits : uint32 -> flt32)
-            const flt64explode	: (flt : flt64 -> (bool, int64, int64))
-            const flt32explode	: (flt : flt32 -> (bool, int32, int32))
-            const flt64stitch	: (flt : flt64 -> (bool, int64, int64))
-            const flt32stitch	: (flt : flt32 -> (bool, int32, int32))
-
-    ;;
--- a/doc/api/libstd/iterutil.txt
+++ /dev/null
@@ -1,100 +1,0 @@
-{
-        title:  libstd
-        description:  libstd: Summary
-}
-
-
-Iteration Utilities
-----------------
-
-	pkg std =
-		type zipiter(@a, @b)
-		type reverseiter(@a)
-		type enumiter(@a)
-
-		impl iterable zipiter(@a, @b) -> (@a, @b)
-		impl iterable enumiter(@a) -> (size, @a)
-		impl iterable reverseiter(@a) -> @a
-
-		generic byzip	: (a : @a[:], b : @b[:]	 -> zipiter(@a, @b))
-		generic byenum	: (a : @a[:] -> enumiter(@a))
-		generic byreverse 	: (sl : @a[:] -> reverseiter(@a))
-	;;
-
-Summary
---------
-
-Iteration over sequence is something that turns up regularly. The iteration
-utilities provided here simplify a number of common instances of iteration
-over collections. They allow for iterating over a zipped sequence,
-enumerating a collection of elements, or going over a collection of elements
-in reverse.
-
-All of these iterators hold a reference to the original data, and require that
-it not be freed until they are finished consuming it. They do not copy the
-slices that they iterate over, and all consume O(1) storage.
-
-Zip Iterators
--------------
-
-	impl iterable zipiter(@a, @b) -> (@a, @b)
-	generic byzip	: (a : @a[:], b : @b[:]	 -> zipiter(@a, @b))
-
-The zipiter takes two slices, and returns an iterator that will walk over them
-pair by pair. So, for example, if you were to call `std.byzip([1,2,3][:],
-[4,5,6][:])`, you would iterate through the elements `(1,4), (2,5), (3, 6)`.
-
-Zip Iterators
--------------
-	impl iterable enumiter(@a) -> (size, @a)
-	generic byenum	: (a : @a[:] -> enumiter(@a))
-
-The enumiter takes a single sequence, and returns the pair of (index, element)
-tuples. If you were to call `std.byenum(["hello", "there", "friend"][:])`, you
-iterate through the elements `(1, "hello"), (2, "there"), (3, "friend")`.
-
-Reverse Iterators
------------------
-
-	impl iterable reverseiter(@a) -> @a
-	generic byreverse 	: (sl : @a[:] -> reverseiter(@a))
-
-
-The reverse takes a single slice, and returns the same elements back, but in
-the reverse order. Calling `std.byenum(["hello", "there", "friend"][:])`
-would iterate in the sequence `"friend", "there", "hello".
-
-Examples
---------
-
-This is a simple zip iterator:
-
-```{runmyr zipiter}
-use std
-const main = {
-	for x in std.byzip([1,2,3][:], [4,5,6][:])
-		std.put("{}\n", x)
-	;;
-}
-```
-
-This is a simple enum iterator:
-
-```{runmyr enumiter}
-use std
-const main = {
-	for x in std.byenum(["hello", "world"][:])
-		std.put("{}\n", x)
-	;;
-}
-```
-
-```{runmyr reverseiter}
-use std
-const main = {
-	for x in std.byreverse(["hello", "world"][:])
-		std.put("{}\n", x)
-	;;
-}
-```
-
--- a/doc/api/libstd/misc.txt
+++ /dev/null
@@ -1,107 +1,0 @@
-{
-        title:  Misc
-        description:  libstd: Misc
-}
-
-Misc
------
-
-The mongrels and mutts of libstd.
-
-    pkg std =
-            generic KiB	: @a::(integral,numeric)	
-            generic MiB	: @a::(integral,numeric)	
-            generic GiB	: @a::(integral,numeric)	
-            generic TiB	: @a::(integral,numeric)	
-            generic PiB	: @a::(integral,numeric)	
-            generic EiB	: @a::(integral,numeric)	
-            generic ZiB	: @a::(integral,numeric)	
-            generic YiB	: @a::(integral,numeric)	
-
-            /* time */
-            const now	: (-> time)
-
-            /* packing integers */
-            generic putle64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putle8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-            generic putbe8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-
-            /* unpacking integers */
-            generic getle64	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe64	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle32	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe32	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle16	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe16	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getle8	: (buf : byte[:]	-> @a::(numeric,integral))
-            generic getbe8	: (buf : byte[:]	-> @a::(numeric,integral))
-
-            /* exploding and stitching floats */
-            const flt64bits	: (flt : flt64 -> int64)
-            const flt32bits	: (flt : flt32 -> int32)
-            const flt64frombits	: (bits : uint64 -> flt64)
-            const flt32frombits	: (bits : uint32 -> flt32)
-            const flt64explode	: (flt : flt64 -> (bool, int64, int64))
-            const flt32explode	: (flt : flt32 -> (bool, int32, int32))
-            const flt64stitch	: (flt : flt64 -> (bool, int64, int64))
-            const flt32stitch	: (flt : flt32 -> (bool, int32, int32))
-
-    ;;
-
-Constants
-----------
-
-    generic KiB	: @a::(integral,numeric)	
-    generic MiB	: @a::(integral,numeric)	
-    generic GiB	: @a::(integral,numeric)	
-    generic TiB	: @a::(integral,numeric)	
-    generic PiB	: @a::(integral,numeric)	
-    generic EiB	: @a::(integral,numeric)	
-    generic ZiB	: @a::(integral,numeric)	
-    generic YiB	: @a::(integral,numeric)	
-
-    generic Sec	: time
-    generic Msec : time
-    generic Usec : time
-
-These are just constants that you can multiply things by in order to scale
-units. If you want to get a 
-
-    const now	: (-> time)
-
-Returns the current time in signed microseconds since the Unix epoch. Can
-represent dates approximatelyl 70,000 years in either direction from the
-present.
-
-    generic putle64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putbe64	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putle32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putbe32	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putle16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putbe16	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putle8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-    generic putbe8	: (buf : byte[:], v :  @a::(numeric,integral) -> size)
-
-These functions pack integers into buffers. The suffix describes the number of
-bits that will be packed -- the values will be implicitly converted to an
-integer that is `nbits` long before packing into the buffer. Signed integers
-will be sign extended, and unsigned ones will be zero extended.
-
-    generic getle64	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getbe64	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getle32	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getbe32	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getle16	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getbe16	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getle8	: (buf : byte[:]	-> @a::(numeric,integral))
-    generic getbe8	: (buf : byte[:]	-> @a::(numeric,integral))
-
-These functions unpack integers from buffers. The numeric suffix describes how
-many bits will be extracted from the buffer. The value will implicitly be
-truncated or widened to the result returned by the specialization of this
-function.
--- a/doc/api/libstd/networking.txt
+++ /dev/null
@@ -1,181 +1,0 @@
-{
-        title: Networking
-        description:    libstd: Networking
-}
-Networking
-----------
-
-    pkg std =
-            type netaddr = union
-                    `Ipv4	byte[4]
-                    `Ipv6	byte[16]
-            ;;
-
-
-            /* network connections */
-            const dial	: (dialstr : byte[:] -> result(fd, byte[:]))
-            const announce	: (ds : byte[:] -> result(fd, byte[:]))
-            const listen	: (sock : fd -> result(fd, byte[:]))
-            const accept	: (lfd : fd -> result(fd, byte[:]))
-
-            /* ip parsing */
-            const ipparse	: (ip : byte[:]	-> option(netaddr))
-            const ip4parse	: (ip : byte[:] -> option(netaddr))
-            const ip6parse	: (ip : byte[:] -> option(netaddr))
-
-            generic hosttonet	: (v : @a -> @a)
-            generic nettohost	: (v : @a -> @a)
-    ;;
-
-Summary
--------
-
-This group of functions contains the basic, portable networking functionality
-provided by libstd. There are other packages shipped which provide access
-to the underlying functionality used to implement this code, and which may
-provide more control.
-
-The bulk of the functionality is fairly low level. Most of the client side
-networking should be done using nothing more than `dial` and `announce`
-
-Dial describes the endpoint to connect to in the form `proto!host!service`.
-`proto` can be any supported protocol.  The host specified can be an IP
-address, hostname, or path to a local socket. The service ismay be either a
-named service, or a protocol specific port. If the port is not a component of
-the address (eg, Unix domain sockets) then it should be ommitted.
-
-On plan 9, the full dial(2) dial string syntax is suported.
-
-Data Types
-----------
-
-This contains the infomation that we extract by resolving a host.
-
-    type ipaddr = union
-            `Ipv4	byte[4]
-            `Ipv6	byte[16]
-    ;;
-
-This contains an IP address. Either V4 or V6 is supported.
-
-Connections
-----------
-
-    const dial	: (dialstr : byte[:] -> result(fd, byte[:]))
-
-Dial connects to a dial string as described in the summary, returning either a
-file descriptor on success, or an error description on failure. The FD
-returned is a connection to the server.
-
-    const announce	: (ds : byte[:] -> result(fd, byte[:]))
-
-Announce sets up a file descriptor which is ready to listen for connections,
-and binds it to an address. Wildcards can be specified with '*' within the
-dial string.
-
-    const listen	: (sock : fd -> result(fd, byte[:]))
-
-Listen specifies that the socket created with `announce` is willing to accept
-connections.
-
-    const accept	: (lfd : fd -> result(fd, byte[:]))
-
-Accept takes the returned file descriptor from listen, and returns a file
-descriptor that is prepared for reading and writing.
-
-IP Parsing
-----------
-
-    const ipparse	: (ip : byte[:]	-> option(netaddr))
-
-Ipparse will parse an IP address. This will recognize either V4 or V6
-addresses, and `\`Some \`Ipv4 bits or `\`Some \`Ipv6 bits` as appropriate, or
-`\`None` if the address can't be parsed.
-
-    const ip4parse	: (ip : byte[:] -> option(netaddr))
-
-Parses an Ipv4 address from the string `ip`. The syntax expected is dotted
-quad notation. Returns `\` Some \`Ipv4 bits` if the address parses successfully, or
-`\`None` if parsing fails.
-
-    const ip6parse	: (ip : byte[:] -> option(netaddr))
-
-Parses an Ipv6 address from the string `ip`. Returns `\` Some \`Ipv4 bits` if
-the address parses successfully, or `\`None` if parsing fails. Zones are
-currently not supported. This is a bug.
-
-
-Endian flipping
---------------
-
-    generic hosttonet	: (v : @a -> @a)
-    generic nettohost	: (v : @a -> @a)
-
-
-Flips the bits in an integer to match the expected. These functions should be
-avoided in favor of explicit packing functions.
-
-Examples
---------
-
-Some simple examples of how to use the Myrddin networking API
-
-#### Echo Server
-
-	use std
-
-	const Dialstr = "tcp!*!1234"
-	const main = {
-		var lfd, afd
-		var buf : byte[1024]
-
-		match std.announce(Dialstr)
-		| `std.Ok f:    lfd = f
-		| `std.Fail e:  std.fatal("unable to announce on {}: {}\n", Dialstr, e)
-		;;
-
-		match std.listen(lfd)
-		| `std.Ok f:    afd = f
-		| `std.Fail e:  std.fatal("unable to listen on {}: {}\n", Dialstr, e)
-		;;
-
-		while true
-			match std.accept(afd)
-			| `std.Ok fd:
-				match std.read(fd, buf[:])
-				| `std.Ok n:
-					std.writeall(fd, buf[:n])
-				| `std.Fail e:
-					std.put("lost conection while reading: {}\n", e)
-				;;
-				std.close(fd)
-			| `std.Fail e:
-				std.fatal("unable to accept connection on {}: {}\n", Dialstr, e)
-			;;
-		;;
-	}
-		
-
-#### Echo Client
-
-	use std
-
-	const Dialstr = "tcp!localhost!1234"
-	const main = {args : byte[:][:]
-		var req, resp
-
-		match std.dial(Dialstr)
-		| `std.Ok fd:
-			req = std.strjoin(args[1:], " ")
-			std.writeall(fd, req)
-			resp = std.try(std.fslurp(fd))
-			std.put("{}\n", resp)
-		| `std.Fail e:
-			std.fatal("unable to dial {}: {}\n", Dialstr, e)
-		;;
-	}
-
-Bugs
-----
-The errors returned are strings, when they should be unions with default
-formatting functions.
--- a/doc/api/libstd/os.txt
+++ /dev/null
@@ -1,228 +1,0 @@
-{
-        title:  OS Interfaces
-        description:  libstd: OS Interfaces
-}
-
-
-OS Interfaces
--------------
-
-    pkg std =
-            type sysinfo = struct
-                    system	: byte[:]
-                    version	: byte[:]
-                    release	: byte[:]
-                    arch	: byte[:]
-            ;;
-
-            type waitstatus = union
-                    `Wsuccess
-                    `Wfailure
-                    `Wsignalled
-                    `Waiterror
-            ;;
-
-            const Enone	: errno 
-            const Eperm	: errno 
-            const Enoent	: errno 
-            const Esrch	: errno 
-            const Eintr	: errno 
-            const Eio	: errno 
-            const Enxio	: errno 
-            const E2big	: errno 
-            const Enoexec	: errno 
-            const Ebadf	: errno 
-            const Echild	: errno 
-            const Eagain	: errno 
-            const Enomem	: errno 
-            const Eacces	: errno 
-            const Efault	: errno 
-            const Enotblk	: errno 
-            const Ebusy	: errno 
-            const Eexist	: errno 
-            const Exdev	: errno 
-            const Enodev	: errno 
-            const Enotdir	: errno 
-            const Eisdir	: errno 
-            const Einval	: errno 
-            const Enfile	: errno 
-            const Emfile	: errno 
-            const Enotty	: errno 
-            const Etxtbsy	: errno 
-            const Efbig	: errno 
-            const Enospc	: errno 
-            const Espipe	: errno 
-            const Erofs	: errno 
-            const Emlink	: errno 
-            const Epipe	: errno 
-            const Edom	: errno 
-            const Erange	: errno 
-            const Emisc	: errno 
-
-            const Failmem	: byte#	
-
-            const getpid	: ( -> pid)
-            const getsysinfo	: (si : sysinfo# -> void)
-            const execvp	: (cmd : byte[:], args : byte[:][:] -> int64)
-            const execvpe	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
-            const getenv :	(name : byte[:] -> option(byte[:]))
-            const getenvv :	(name : byte[:], default : byte[:] -> byte[:])
-            const fork	: (-> pid)
-            const execv	: (cmd : byte[:], args : byte[:][:] -> int64)
-            const execve	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
-            const waitpid	: (pid:pid, loc:int32#, opt : int64	-> int64)
-            const spork	: (cmd : byte[:][:]	-> result((pid, fd, fd), int))
-            const sporkfd	: (cmd : byte[:][:], infd : fd, outfd : fd	-> result(pid, int))
-            const exit	: (status:int -> void)
-            const now	: (-> time)
-            const wait	: (pid : pid -> waitstatus)
-
-    ;;
-
-    type sysinfo = struct
-            system	: byte[:]
-            version	: byte[:]
-            release	: byte[:]
-            arch	: byte[:]
-    ;;
-
-The `sysinfo` struct is returned from the operating system, giving
-some information about the sytem that this program is running on. It
-is similar to the `uname` function in the standard C library, although
-it is guaranteed to be portable. All the storage for the members is
-within the private parts of the struct, and no freeing is needed to
-relase them.
-
-    type waitstatus = union
-            `Wsuccess
-            `Wfailure
-            `Wsignalled
-            `Waiterror
-    ;;
-
-This type indicates the exit status of a child process that was invoked
-with one of the exec family of functions. It only returns a broad category
-of values, and does not return the full details provided by the os -- this
-is not portable. If the exact exit status is needed, the `sys` package
-should cover this need.
-
-    const Enone	: errno 
-    const Erange	: errno 
-    const Ebadf	: errno 
-    const Eexist	: errno 
-    const Einval	: errno 
-    const Efault	: errno 
-    const Eio	: errno 
-    const Emisc	: errno 
-
-
-The errno results are used to signal OS errors. They are not going to remain
-stable, and will probably be replaced with system call specific unions for
-error handling in future API work. Use them, but parsimoniously. The code
-that uses them will break.
-
-Emisc is used for any non-portable error codes.
-
-    const getpid	: ( -> pid)
-
-Returns the process id of the current process.
-
-    const getsysinfo	: (si : sysinfo# -> void)
-
-Fills a `sysinfo` struct with information about the platform that the program
-is running on.
-
-    const execv	: (cmd : byte[:], args : byte[:][:] -> errno)
-    const execve	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> errno)
-
-    const execvp	: (cmd : byte[:], args : byte[:][:] -> errno)
-    const execvpe	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> errno)
-
-Executes a program. If the command `cmd` begins with a `/`, then it is
-resolved as an absolute path. Otherwise, command is resolved relative to the
-current directory.
-
-If the path in `cmd` is not an absolute path, the `execvp` variants of this
-function will search the path for this program in each directory relative to
-$PATH or $path, in addition to the current directory.
-
-The arguments in `args` are passed to the executed program as its argument
-vector. By convention, the first argument in the `args` array should be the
-filename of the program being executed.
-
-For the `execvp` exec variant, the current program's environment is inherited,
-and is not modified.
-
-The `execvpe` variant of this function takes an additional argument `env`,
-which is passed to the invoked binary, replacing alll the current environment
-variables. It is in the form of a list of `"ENV_VAR=value"` key value pairs.
-
-Returns: Errno on failure. On success, the function does not return.
-
-    const getenv :	(name : byte[:] -> option(byte[:]))
-
-The `getenv` function looks up a variable from the process environment.
-
-Returns: `\`Some env\_val` for an environment variable that is present in the
-environment, or `\`None` if it is not present.
-
-    const getenvv :	(name : byte[:], default : byte[:] -> byte[:])
-
-The `getenvv` is the same as `getenv, with the exception that will return the
-value of the environment variable if it is present, or `default` if there is
-no such environment variable.
-
-Returns: The value of "name" if present, or "default" if not.
-
-    const fork	: (-> pid)
-
-This forks a new process. This function returns twice, once in the parent
-and once in the child.
-
-On a successful fork, within the parent process `fork` returns a process ID
-greater than zero, which is the process id of the child process. Within the
-child process, `fork` returns zero.
-
-If the `fork` function returns a value less than zero, then creating a child
-process failed.
-
-Returns: The pid of the child.
-
-    const wait	: (pid : pid -> waitstatus)
-
-`wait` waits for a process with the PID `pid` to exit, returning its final
-status. This function blocks until the child process has exited. If the
-process has already exited before this function is called, but has not yet
-been called on the process id of the child process, then this function
-will return a status immediately.
-
-If the child process has already been waited on, calling this function is
-invalid, and it should return a `\`Waiterror`.
-
-Returns: A waitstatus, telling you if the process crashed, exited with
-failure, exited with success, or whether the wait call was invalid.
-
-    const spork	: (cmd : byte[:][:]	-> result((pid, fd, fd), errno))
-
-Spork stand for `Speak to Process Fork`. It returns a process id and an
-input and output file descriptor via which you can communicate to the process
-over stdin and stdout. Stderr is inherited from the current process.
-
-Returns: Either a tuple of (pid, stdin, stdout) on success, or the error
-that caused the failure.
-
-    const sporkfd	: (cmd : byte[:][:], infd : fd, outfd : fd	-> result(pid, errno))
-
-Sporkfd is identical to spork, however, instead of returning new file
-descriptors, it uses the file descriptors passed in.
-
-Returns: Either the pid spawned, or the error that caused the spawn failure.
-
-
-    const exit	: (status:int -> void)
-
-This exits a process with the status specified. On most Unixy systems,
-this will return the value to the shell. On Plan 9, this will call
-exits() with the number converted to a string.
-
-This function terminates the process.
--- a/doc/api/libstd/randomness.txt
+++ /dev/null
@@ -1,88 +1,0 @@
-{
-        title:  Randomness
-        description:    libstd: Randomness
-}
-
-
-Randomness
-----------
-
-    pkg std =
-            type rng = struct
-                ...
-            ;;
-
-            generic rand	: (lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-            generic randnum	: (rng : rng# -> @a::(numeric,integral))
-            const randbytes	: (buf : byte[:] -> size)
-
-            const mksrng	: (seed : uint32 -> rng#)
-            const freerng	: (rng : rng# -> void)
-            generic rngrand	: (rng : rng#, lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-            generic rngrandnum	: (rng : rng# -> @a::(numeric,integral))
-            const rngrandbytes	: (rng : rng#, buf : byte[:]	-> size)
-    ;;
-
-
-Overview
---------
-
-Currently, the random number generation interface is quite poor. It is not
-cryptographically secure, although it should be. It exposes some functions
-that it should not.
-
-Overall, deterministic random numbers should be removed from APIs that do not
-define the specific generator.
-
-Types
------
-
-    type rng = struct
-        ...
-    ;;
-
-The `rng` type contains the state for the random number generator.
-
-Functions
----------
-
-    generic rand	: (lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-
-Generates a random integer in the range [lo, hi), returning the value. The
-range [lo, hi) must be positive, nonempty, and the difference between hi and
-lo must be less then 2^(type_bits - 1)
-
-    generic randnum	: (rng : rng# -> @a::(numeric,integral))
-
-Generates a random integer of any magnitude the type may hold. The returned
-value may be negative, if the type is signed.
-
-    const randbytes	: (buf : byte[:] -> size)
-
-Fills a buffer with random bytes.
-
-    const mksrng	: (seed : uint32 -> rng#)
-
-Allocates and initializes a random number generator. The seed `seed` is used
-to seed the generator. The returned random number generator must be freed
-using `freerng`.
-
-    const freerng	: (rng : rng# -> void)
-
-Frees all resources associated with the random number generator `rng`.
-
-    generic rngrand	: (rng : rng#, lo : @a::(numeric,integral), hi : @a::(numeric,integral) -> @a::(numeric,integral))
-
-
-Generates a random integer from `rng` in the range [lo, hi), returning the
-value. The range [lo, hi) must be positive, nonempty, and the difference
-between hi and lo must be less then 2^(type_bits - 1)
-
-    generic rngrandnum	: (rng : rng# -> @a::(numeric,integral))
-
-Generates a random integer of any size from the random number generator `rng`.
-The returned value may be negative, if the type is signed.
-
-    const rngrandbytes	: (rng : rng#, buf : byte[:]	-> size)
-
-Fills a buffer with random bytes from the random number generator `rng`.
--- a/doc/api/libstd/slices.txt
+++ /dev/null
@@ -1,71 +1,0 @@
-{
-        title:  Slice Manipulation
-        description:  libstd: Slice Manipulation
-}
-
-
-Slice Manipulation
-------------------
-
-    pkg std =
-            generic sleq	: (a : @a[:], b : @a[:] -> bool)
-            generic slcp        : (dst : @a[:], src : @a[:] -> void)
-            generic slput	: (sl : @a[:], idx : size, elt : @a	-> @a[:])
-            generic slpush	: (sl : @a[:], elt : @a	-> @a[:])
-            generic slpop	: (sl : @a[:] -> (@a, @a[:]))
-            generic sldup       : (sl : @a[:] -> @a[:])
-            generic slfill	: (sl : @a[:], v : @a	-> @a[:])
-            generic sljoin	: (dst : @a[:]#, src : @a[:]	-> @a[:])
-    ;;
-
-
-Functions
----------
-
-    generic sleq	: (a : @a[:], b : @a[:] -> bool)
-
-Compares if two slices are equal, elementwise. Uses the '==' operator for
-each value. Returns true if they are equal, false otherwise.
-
-    generic slcp    : (dst : @a[:], src : @a[:] -> void)
-
-Copies all the elements from `src` to `dst`. The copy made is shallow,
-and done using the `=` operator. The two slices must be equal size. If they
-are not equal, this will cause the program to abort.
-
-    generic slput	: (sl : @a[:], idx : size, elt : @a	-> @a[:])
-
-Inserts a value `elt` into the slice `sl` at index `idx`, moving all values
-from `sl[idx:len]` to `sl[idx+1:len+1]`. This assumes that the slice is either
-empty, or is allocated on the heap using `slalloc`.
-
-This may move the slice, invalidating the original input argument.
-
-    generic slpush	: (sl : @a[:], elt : @a	-> @a[:])
-
-Inserts a value `elt` into the slice `sl` at index the end of the slice.
-
-This may move the slice, invalidating the original input argument.
-
-
-    generic slpop	: (sl : @a[:] -> (@a, @a[:]))
-
-Removes an element from the end of the slice, returning the element and the
-new, truncated slice.
-
-This may move the slice, invalidating the original input argument.
-
-    generic sldup   : (sl : @a[:] -> @a[:])
-
-Duplicates a slice. This function is equivalent to calling slalloc() followed
-by slcp().
-
-    generic slfill	: (sl : @a[:], v : @a	-> @a[:])
-
-Fills a slice with a value.
-
-    generic sljoin	: (dst : @a[:]#, src : @a[:]	-> @a[:])
-
-Concatenates `src` onto the end of `dst#`. Equivalent to iterating through
-every element of `src` and `slpush()`ing it onto `dst`.
-
--- a/doc/api/libstd/strings.txt
+++ /dev/null
@@ -1,205 +1,0 @@
-{
-        title:  Strings
-        description:  libstd: Strings
-}
-
-Summary
--------
-
-    pkg std =
-            /* string buffers */
-            type strbuf = struct
-            ;;
-
-            const mksb	: (-> strbuf#)
-            const mkbufsb	: (buf : byte[:] -> strbuf#)
-            const sbfin	: (sb : strbuf# -> byte[:])
-            const sbfree	: (sb : strbuf# -> void)
-            const sbpeek	: (sb : strbuf# -> byte[:])
-            const sbputc	: (sb : strbuf#, v : char -> bool)
-            const sbputs	: (sb : strbuf#, v : byte[:] -> bool)
-            const sbputb	: (sb : strbuf#, v : byte -> bool)
-            const sbtrim	: (sb : strbuf#, len : size -> void)
-
-            /* string searching */
-            const strfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-            const strrfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-            const strhas	: (haystack : byte[:], needle : byte[:]	-> bool)
-            const hasprefix	: (s : byte[:], pre : byte[:] -> bool)
-            const hassuffix	: (s : byte[:], suff : byte[:] -> bool)
-
-            /* C strings */
-            const cstrlen	: (buf : byte[:] -> size)
-            const cstrconv	: (buf : byte[:] -> byte[:])
-            const cstrconvp	: (p : byte# -> byte[:])
-
-            /* tokenizing and splitting */
-            const strsplit	: (s : byte[:], delim : byte[:] -> byte[:][:])
-            const bstrsplit	: (sp : byte[:][:], s : byte[:], delim : byte[:] -> byte[:][:])
-            const strtok	: (s : byte[:] -> byte[:][:])
-            const bstrtok	: (sp : byte[:][:], s : byte[:] -> byte[:][:])
-
-            /* string joining and stripping */
-            const strcat	: (a : byte[:], b : byte[:] -> byte[:])
-            const strjoin	: (strings : byte[:][:], delim : byte[:] -> byte[:])
-            const strstrip	: (str : byte[:] -> byte[:])
-            const strfstrip	: (str : byte[:] -> byte[:])
-            const strrstrip	: (str : byte[:] -> byte[:])
-
-            /* parsing numbers out of strings */
-            generic intparsebase	: (s : byte[:], base : int -> option(@a::(integral,numeric)))
-            generic intparse	: (s : byte[:]	-> option(@a::(integral,numeric)))
-            generic charval : (c : char, base : int -> @a::(integral,numeric))
-    ;;
-
-
-Types
-------
-
-    type strbuf = struct
-    ;;
-
-The `strbuf` type contains a string buffer under construction. It can operate
-in two modes: Allocated, and static. The allocated mode keeps track
-of buffer sizing, and grows it efficiently as the data is appended to it.
-
-The static mode, on the other hand, has a fixed size buffer that is provided
-to it, and truncates values to fit the buffer if needed. This can be used when
-allocations are undesirable.
-
-Functions: String buffers
---------------------------
-
-    const mksb	: (-> strbuf#)
-
-Mksb creates an string buffer. The buffer returned is in allocated mode, and
-starts off with an empty string.
-
-    const mkbufsb	: (buf : byte[:] -> strbuf#)
-
-Mkbufsb creates a fixed size string buffer, initialized with `buf`. The
-initial length of the string is empty, regardless of the contents of the
-buffer. Anything in it will be overwritten as appends happen.
-
-    const sbfin	: (sb : strbuf# -> byte[:])
-
-Sbfin finishes the string buffer. Any auxiliary resources allocated by the
-string buffer are released, and the final string that was constructed is
-returned. In dynamic mode, the string is heap allocated, and must be freed
-with `slfree`. Otherwise, it is simply a slice into the buffer passed in
-the `mkbufsb` call.
-
-    const sbfree	: (sb : strbuf# -> void)
-
-Sbfree frees the string buffer `sb`, and all associated resources. The string
-under construction is discarded if the buffer is dynamically allocated.
-
-    const sbpeek	: (sb : strbuf# -> byte[:])
-
-Sbpeek returns the portion of the string that has already been constructed
-by the string buffer, without freeing it. The returned string is only valid
-as long as the buffer is not modified.
-
-    const sbputc	: (sb : strbuf#, v : char -> bool)
-
-Sbputc appends a single character to the string buffer, encoding it into
-utf8 before appending it to the buffer. If the buffer is fixed and the
-character will not fit, then it will be dropped in its entirety.
-
-Returns: True if there was sufficient space to append the character, false
-otherwise.
-
-    const sbputs	: (sb : strbuf#, v : byte[:] -> bool)
-
-Sbputs appends a string to the string buffer. If the buffer is a static
-buffer, and the string is too long to fit, as much of it as can possibly fit
-will be copied. This may truncate characters mid-way through.
-
-Returns: True if there was sufficient space to append the character, false
-otherwise.
-
-    const sbputb	: (sb : strbuf#, v : byte -> bool)
-
-Sbputs appends a single byte to the string buffer. If the buffer is a static
-buffer and the character does not fit, the buffer will remain unmodified
-
-Returns: True if there was sufficient space to append the byte, false
-otherwise.
-
-    const sbtrim	: (sb : strbuf#, len : size -> void)
-
-Truncates a string buffer to the length provided. If the length provided i
-longer than the size of the buffer, the length of the buffer remains
-unmodified.
-
-
-Functions: Searching
---------------------
-
-    const strfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-    const strrfind	: (haystack : byte[:], needle : byte[:] -> option(size))
-
-Strfind finds the first occurrence of the string `needle` within the string
-`haystack`.Strrfind is similar, but it finds the last occurrence of `needle`
-within `haystack`.
-
-Returns: `\`std.Some index` if needle is found within haystack, or `\`None`
-otherwise.
-
-    const strhas	: (haystack : byte[:], needle : byte[:]	-> bool)
-
-Strhas returns `true` if the string `needle` is found within haystack.
-
-    const hasprefix	: (s : byte[:], pre : byte[:] -> bool)
-
-hasprefix returns `true` if the string `pre` is found at the start of `s`.
-
-    const hassuffix	: (s : byte[:], suff : byte[:] -> bool)
-
-hassuffix returns `true` if the string `pre` is found at the end of `s`.
-
-
-Functions: Splitting and joining
---------------------------------
-
-    const strsplit	: (s : byte[:], delim : byte[:] -> byte[:][:])
-    const strtok	: (s : byte[:] -> byte[:][:])
-
-Strsplit and strtok will split a string into its components. Strsplit uses a
-string passed in as a delimiter, while strtok will use a variable amount of
-whitespace to split the string. They dynamically allocate the split vector,
-but not the elements within it.
-
-If there are repeated delimiters, `strsplit` will include zero length strings
-between them. For example, `std.strsplit("a<><>b<>c", "<>")` will return
-`["a", "", "b", "c"]`.
-
-    const bstrsplit	: (sp : byte[:][:], s : byte[:], delim : byte[:] -> byte[:][:])
-    const strtok	: (sp : byte[:][:], s : byte[:] -> byte[:][:])
-
-The bstrsplit and bstrtok functions produce a split string similar to the
-strsplit versions above, but will fill the `sp` vector passed in, instead of
-allocating their own storage. If there are more splits to be made than the
-vector can hold, then the last element will contain the tail of the string.
-
-
-    const strcat	: (a : byte[:], b : byte[:] -> byte[:])
-
-Strcat will concatenate two strings, returning a new buffer containing the
-string that was created.
-
-    const strjoin	: (strings : byte[:][:], delim : byte[:] -> byte[:])
-
-
-Strcat will concatenate all strings in a list, returning a new buffer
-containing the string that was created. It will interpose the delimiter
-between them.
-
-    const strstrip	: (str : byte[:] -> byte[:])
-    const strfstrip	: (str : byte[:] -> byte[:])
-    const strrstrip	: (str : byte[:] -> byte[:])
-
-
-Strstrip will remove all whitespace characters from both ends of the string.
-Strfstrip and strrstrip will strip all whitespace characters from the start or
-end of the of the string, respectively.
--- a/doc/api/libstd/unicode.txt
+++ /dev/null
@@ -1,133 +1,0 @@
-{
-        title: Unicode
-        description:    libstd: Unicode
-}
-
-Unicode
---------
-
-    pkg std =
-            const Badchar	: char 
-            const Maxcharlen : size 
-            const Maxcharval : char 
-
-	    /* iterators */
-	    impl iterable chariter -> char
-
-	    const chariter	: (byte[:] -> chariter)
-
-            /* utf8 information */
-            const charlen	: (chr : char -> size)
-            const encode	: (buf : byte[:], chr : char -> size)
-            const decode	: (buf : byte[:] -> char)
-            const strstep	: (str : byte[:] -> (char, byte[:]))
-
-            /* character class predicates */
-            const isalpha	: (c : char -> bool)
-            const isdigit	: (c : char -> bool)
-            const isxdigit	: (c : char -> bool)
-            const isnum	: (c : char -> bool)
-            const isalnum	: (c : char -> bool)
-            const isspace	: (c : char -> bool)
-            const isblank	: (c : char -> bool)
-            const islower	: (c : char -> bool)
-            const isupper	: (c : char -> bool)
-            const istitle	: (c : char -> bool)
-
-            /* character class conversions */
-            const tolower	: (c : char -> char)
-            const toupper	: (c : char -> char)
-            const totitle	: (c : char -> char)
-    ;;
-
-Summary
--------
-
-As a reminder, Myrddin characters hold a single Unicode codepoint, and all
-strings are assumed to be encoded in UTF-8 by default. These functions are
-designed to facilitate manipuating unicode strings and codepoints.
-
-The APIs are generally designed that strings will be streamed through, and
-not encoded or decoded wholesale.
-
-Constants
----------
-    const Badchar	: char 
-
-This is a character value that is not, and will never be, a valid unicode
-codepoint. This is generally returned when we encounter an error fr 
-
-    const Maxcharlen : size 
-
-This is a constant defining the maximum number of bytes that a character may
-be decoded into. It's guaranteed that a buffer that is at least Maxcharlen
-bytes long will be able to contain any character.
-
-    const Maxcharval : char 
-
-This is the maximum value that any valid future unicode codepoint may decode
-into. Any character that is greater than this is an invalid character.
-
-Functions: Iterating over strings
---------------------------------
-
-	impl iterable chariter -> char
-
-	const chariter	: (byte[:] -> chariter)
-
-Chariter returns an iterator which steps through a string character by
-character.
-
-Functions: Encoding and Decoding
---------------------------------
-
-    const charlen	: (chr : char -> size)
-
-Charlen returns the length in bytes that decoding the character provided into
-unicode would take. This can vary between 1 and Maxcharlen bytes.
-
-    const encode	: (buf : byte[:], chr : char -> size)
-
-Encode takes a single character, and encodes it to a utf8 string. The buffer
-must be at least long enough to hold the character.
-
-Returns: The number of bytes written, or -1 if the character could not be
-encoded.
-
-    const decode	: (buf : byte[:] -> char)
-
-Decode converts the head of the buffer `buf` to a single unicode codepoint,
-returning the codepoint itself, or `Badchar` if the codepoint is invalid.
-
-The tail of the buffer is not considered, allowing this function to be used
-to peek at the contents of a string.
-
-    const strstep	: (str : byte[:] -> (char, byte[:]))
-
-strstep is a function for stepping through unicode encoded strings. It
-returns the tuple (`Badchar`, str[1:]) if the value cannot be decoded,
-or `(charval, str[std.charlen(charval):])` therwise.
-
-
-```{runmyr striter}
-    s = "abcd"
-    while s.len != 0
-            (c, s) = std.striter(s)
-            std.put("next char is {}\n", s)
-    ;;
-```
-
-Character Classes
------------------
-
-    const isalpha	: (c : char -> bool)
-    const isdigit	: (c : char -> bool)
-    const isxdigit	: (c : char -> bool)
-    const isnum	: (c : char -> bool)
-    const isalnum	: (c : char -> bool)
-    const isspace	: (c : char -> bool)
-    const isblank	: (c : char -> bool)
-    const islower	: (c : char -> bool)
-    const isupper	: (c : char -> bool)
-    const istitle	: (c : char -> bool)
-
--- a/doc/api/libstd/varargs.txt
+++ /dev/null
@@ -1,189 +1,0 @@
-{
-        title:  Varargs
-        description:  libstd: Varargs
-}
-
-Varargs
--------
-
-    pkg std =
-            type typedesc = union
-                    `Tynone
-                    
-                    /* atomic types */
-                    `Tyvoid
-                    `Tybool
-                    `Tychar
-                    
-                    `Tyint8
-                    `Tyint16
-                    `Tyint
-                    `Tyint32
-                    `Tyint64
-                    
-                    `Tybyte
-                    `Tyuint8
-                    `Tyuint16
-                    `Tyuint
-                    `Tyuint32
-                    `Tyuint64
-                    `Tyflt32
-                    `Tyflt64
-                    `Tyvalist
-                    
-                    /* compound types */
-                    `Typtr byte[:]
-                    `Tyfunc	typecursor
-                    `Tyslice byte[:]
-                    `Tyarray (size, byte[:])
-                    
-                    /* aggregate types */
-                    `Tytuple	typecursor
-                    `Tystruct	typecursor
-                    `Tyunion	typecursor
-                    /* name info */
-                    `Tyname (byte[:], byte[:])
-            ;;
-
-            type typecursor = struct
-                    nelt	: size
-            ;;
-
-            type typeinfo = struct
-                    size	: size
-                    align	: size
-            ;;
-
-            generic typeof	: (v : @a -> byte[:])
-            const typeenc	: (p : ...# -> typecursor)
-            const typeenccursor	: (e : byte[:] -> typecursor)
-            const typedesc	: (e : byte[:] -> typedesc)
-            const typeinfo	: (e : byte[:] -> typeinfo)
-            const tcnext	: (t : typecursor# -> byte[:])
-            const tcpeek	: (t : typecursor# -> byte[:])
-            const ncpeek	: (t : typecursor# -> (byte[:], byte[:]))
-            const ncnext	: (t : typecursor# -> (byte[:], byte[:]))
-
-            const vastart	: (args : ...# -> valist)
-            const vatype	: (ap : valist# -> byte[:])
-            const vabytes	: (ap : valist# -> byte[:])
-            const vaenter	: (ap : valist# -> valist)
-            generic vanext	: (ap : valist# -> @a)
-    ;;
-
-Overview
---------
-
-Type descriptions are encoded byte strings. 
-
-Types
------
-
-
-    type typedesc = union
-            ...
-    ;;
-
-
-Typedesc provides a description of a type. It can be paired with a valist for
-walking over the contents of a value, but this is ugly.
-
-
-    type typecursor = struct
-            nelt	: size
-    ;;
-
-A type cursor allows for iterating over the subtypes of a type. It exposes the
-number of elements in the subtype.
-
-    type typeinfo = struct
-            size	: size
-            align	: size
-    ;;
-
-Typeinfo contains all of the attributes that we care about for the type. This
-may expand in the future.
-
-
-Type iteration
----------
-
-    generic typeof	: (v : @a -> byte[:])
-
-Typeof takes any arbitrary value, and returns an encoded type description for
-the type of the value. It would be better to provide a first class interface
-for finding type encodings, but this needs thought.
-
-    const typeenc	: (p : ...# -> typecursor)
-
-Typeenc returns a type cursor for an argument list, allowing for iteration
-over the type of values within it.
-
-    const typeenccursor	: (e : byte[:] -> typecursor)
-
-Typeenccursor takes a type encoding, and converts it to a cursor with a single
-type. Iterating the cursor will return only the one type encoding that was
-passed to this function.
-
-    const typedesc	: (e : byte[:] -> typedesc)
-
-Typedesc extracts a typedesc from an encoded type. The type description
-may contain other type cursors for iterating over subtypes.
-
-    const typeinfo	: (e : byte[:] -> typeinfo)
-
-Typeinfo extracts a typeinfo from an encoded type. The type description
-contains attributes about the type, such as the size and alignment.
-
-    const tcnext	: (t : typecursor# -> byte[:])
-
-Tcnext pulls an encoded subtype from a type cursor and advances it.
-Calling this on a cursor that has a name is acceptable, and will
-discard the name.
-
-    const tcpeek	: (t : typecursor# -> byte[:])
-
-Tcnext pulls an encoded subtype from a type cursor and does not it.
-Calling this on a cursor that has a name is acceptable, and will
-discard the name.
-
-    const ncnext	: (t : typecursor# -> (byte[:], byte[:]))
-
-Ncnext pulls an encoded subtype from a type cursor for a type with named
-subtypes, and advances the type cursor. such as a struct or union, and returns
-the name and encoded type.
-
-    const ncpeek	: (t : typecursor# -> (byte[:], byte[:]))
-
-Ncpeek pulls an encoded subtype from a type cursor for a type with named
-subtypes, such as a struct or union, and returns the name and encoded
-type. This does not advance the cursor.
-
-Variadic Arguments
------------------
-
-    const vastart	: (args : ...# -> valist)
-
-Vastart takes a pointer to a variadic argument list, and returns a valist,
-which is basically an iterator for arguments.
-
-    const vatype	: (ap : valist# -> byte[:])
-
-Vatype returns a type encoding for the current variadic argument that the
-valist is pointing to.
-
-    generic vanext	: (ap : valist# -> @a)
-
-Vanext returns the next value for the variadic type, and advances the valist.
-
-    const vabytes	: (ap : valist# -> byte[:])
-
-Vanext returns a slice to the bytes of the variadic argument, and advances the
-valist.
-
-    const vaenter	: (ap : valist# -> valist)
-
-Vaenter does not advance the valist, but returns a new valist for the
-argument, allowing iteration over the fields within the argument. For example,
-if you had a struct passed as a variadic argument, calling 'vaenter' on it
-would allow iterating over the members of the struct.
--- a/doc/api/libtestr/index.txt
+++ /dev/null
@@ -1,64 +1,0 @@
-{
-        title:  libtestr
-        description:    Myrddin Test Library
-}
-
-Libtestr
----------
-
-    pkg testr =
-            type ctx
-            
-            type spec = struct
-            	name	: byte[:]
-            	fn	: (ctx : ctx# -> void)
-            ;;
-            
-            const run	: (specs : spec[:] -> void)
-            const ok	: (ctx : ctx# -> void)
-            const fail	: (ctx : ctx#, msg : byte[:] -> void)
-    ;;
-
-Overview
---------
-
-The testr library provides a simple library for running
-unit tests. It outputs subtest results in a format that mbld
-will be able to understand, log, and report on.
-
-Types
------
-
-    type ctx
-
-The context for the current test. Used to record the state
-of the set of tests currently running.
-
-    type spec = struct
-            name	: byte[:]
-            fn	: (ctx : ctx# -> void)
-    ;;	
-
-The specification for a single test. Contains the name
-of the test being run, and the code used to execute it.
-
-Mutex.
-
-Functions: Mutexes
-------------------
-            
-    const run	: (specs : spec[:] -> void)
-
-Runs a sequence of tests, recording the state of the test
-and outputting an appropriate log for mtest to consume.
-
-    const ok	: (ctx : ctx# -> void)
-
-Records a test success. It does not leave the current
-scope.
-
-    const fail	: (ctx : ctx#, msg : byte[:] -> void)
-
-Records a test failure. It does not leave the current
-scope.
-
--- a/doc/api/libthread/index.txt
+++ /dev/null
@@ -1,115 +1,0 @@
-{
-        title:  libthread
-        description:    Myrddin Thread Library
-}
-
-Libthread
----------
-
-    pkg thread =
-            trait atomic @a::(integral,numeric) =
-                    xget	: (p : @a# -> @a)
-                    xset	: (p : @a#, v : @a -> void)
-                    xadd	: (p : @a#, v : @a -> @a)
-                    xsub	: (p : @a#, v : @a -> @a)
-                    xcas	: (p : @a#, old : @a, new : @a -> @a)
-                    xchg	: (p : @a#, new : @a -> @a)
-            ;;
-
-            type cond = struct
-                    ...
-            ;;
-
-            type mutex = struct
-                    ...
-            ;;	
-
-            impl atomic int32
-            impl atomic int64
-            impl atomic uint32
-            impl atomic uint64
-
-            /* mutexes */
-            const mkmtx	: (-> mutex)
-            const mtxlock	: (mtx : mutex# -> void)
-            const mtxtrylock	: (mtx : mutex# -> bool)
-            const mtxunlock	: (mtx : mutex# -> void)
-
-            /* condition variables */
-            const mkcond	: (mtx : mutex# -> cond)
-            const condwait	: (cond : cond# -> void)
-            const condsignal	: (cond : cond# -> void)
-            const condbroadcast	: (cond : cond# -> void)
-    ;;
-
-Types
------
-
-    type cond = struct
-            ...
-    ;;
-
-Condition variable.
-
-    type mutex = struct
-            ...
-    ;;	
-
-    trait atomic @a::(integral,numeric) =
-            xget	: (p : @a# -> @a)
-            xset	: (p : @a#, v : @a -> void)
-            xadd	: (p : @a#, v : @a -> @a)
-            xsub	: (p : @a#, v : @a -> @a)
-            xcas	: (p : @a#, old : @a, new : @a -> @a)
-            xchg	: (p : @a#, new : @a -> @a)
-    ;;
-
-
-Mutex.
-
-Functions: Mutexes
-------------------
-
-    const mkmtx	: (-> mutex)
-
-Crates a new mutex, in the unlocked state.
-
-    const mtxlock	: (mtx : mutex# -> void)
-
-Locks a mutex. Blocks if the mutex is already locked.
-
-    const mtxtrylock	: (mtx : mutex# -> bool)
-
-Attempts to lock a mutex. Returns true if the lock was
-taken successful. Returns false if the lock was not taken.
-
-This call does not block.
-
-    const mtxunlock	: (mtx : mutex# -> void)
-
-Unlocks a mutex that is taken. It is a bug to call this on a mutex that you
-have not successfully locked.
-
-Functions: Condition Variables.
-------------------------------
-
-    const mkcond	: (mtx : mutex# -> cond)
-
-Creates a condition variable. Associates the mutex with the condition
-variable.
-
-    const condwait	: (cond : cond# -> void)
-
-Waits on the condition to be notiifed on. Must be called with the associated
-mutex locked. Unlocks the mutex that is associated with the condition variable
-and sleeps until someone has notified on the condition variable.
-
-    const condsignal	: (cond : cond# -> void)
-
-Wakes at least one waiter on the condition variable, allowing them to take the
-mutex.
-
-    const condbroadcast	: (cond : cond# -> void)
-
-Wakes all waiters on the condition variable.
-