Made a start on some documentation
diff --git a/yxml.pod b/yxml.pod
new file mode 100644
index 0000000..978a6a8
--- /dev/null
+++ b/yxml.pod
@@ -0,0 +1,249 @@
+=head1 Introduction
+
+Yxml is a small non-validating and mostly conforming XML parser written in C.
+
+The latest version of yxml and this document can be found on
+L<http://dev.yorhel.nl/yxml>.
+
+B<This document is a work in progress, there's still some useful stuff missing.>
+
+=head1 Compiling yxml
+
+Due to the small size of yxml, the recommended way to use it is to copy the
+L<yxml.c|http://g.blicky.net/yxml.git/plain/yxml.c> and
+L<yxml.h|http://g.blicky.net/yxml.git/plain/yxml.h> from the git repository
+into your project directory, and compile and link yxml.c as part of your
+program or library.
+
+The git repository also includes a Makefile. Running C<make> without specifying
+a target will compile a C<.a> file for easy static linking. A test suite is
+available under C<make test>.
+
+=head1 API documentation
+
+=head2 Overview
+
+Yxml is designed to be very flexible and efficient, and thus offers a
+relatively low-level stream-based API. The entire API consists of two typedefs
+and three functions:
+
+  typedef enum { /* .. */ } yxml_ret_t;
+  typedef struct { /* .. */ } yxml_t;
+
+  void yxml_init(yxml_t *x, char *buf, size_t bufsize);
+  yxml_ret_t yxml_parse(yxml_t *x, int ch);
+  yxml_ret_t yxml_eof(yxml_t *x);
+
+The values of I<yxml_ret_t> and the public fields of I<yxml_t> are explained in
+detail below. Parsing a file using yxml involves three steps:
+
+=over
+
+=item 1. Initialization, using C<yxml_init()>.
+
+=item 2. Parsing. This is performed in a loop where C<yxml_parse()> is called
+on each character of the input file.
+
+=item 3. Finalization, using C<yxml_eof()>.
+
+=back
+
+
+=head2 Initialization
+
+  #define BUFSIZE 4096
+  char *buf = malloc(BUFSIZE);
+  yxml_t x;
+  yxml_init(&x, buf, BUFSIZE);
+
+The parsing state for an input document is remembered in the C<yxml_t>
+structure. This structure needs to be allocated and initialized before parsing
+a new XML document.
+
+Allocating space for the C<yxml_t> structure is the responsibility of the
+application. Allocation can be done on the stack, but it is also possible to
+embed the struct inside a larger object or to allocate space for the struct
+separately.
+
+C<yxml_init()> takes a pointer to an (uninitialized) C<yxml_t> struct as first
+argument and performs the necessary initialization. The two additional
+arguments specify a pointer to a buffer and the size of this buffer. The given
+buffer must be writable, but does not have to be initialized by the
+application.
+
+The buffer is used internally by yxml to keep a stack of opened XML element
+names, property names and PI targets. The size of the buffer determines both
+the maximum depth in which XML elements can be nested and the maximum length of
+element names, property names and PI targets. Each name consumes
+C<strlen(name)+1> bytes in the buffer, and the first byte of the buffer is
+reserved for the C<\0> byte. This means that in order to parse an XML document
+with an element name of 100 bytes, a property name or PI target of 50 bytes and
+a nesting depth of 10 levels, the buffer must be at least
+C<1+10*(100+1)+(50+1)=1062> bytes. Note that properties and PIs don't nest, so
+the C<max(PI_name, property_name)> only needs to be counted once.
+
+It is not currently possibly to dynamically grow the buffer while parsing, so
+it is important to choose a buffer size that is large enough to handle all the
+XML documents that you want to parse. Since element names, property names and
+PI targets are typically much shorter than in the previous example, a buffer
+size of 4 or 8 KiB will give enough headroom even for documents with deep
+nesting.
+
+As a useful hack, it is possible to merge the memory for the C<yxml_t> struct
+and the stack buffer in a single allocation:
+
+  yxml_t *x = malloc(sizeof(yxml_t) + BUFSIZE);
+  yxml_init(x, x+1, BUFSIZE);
+
+This way, the complete parsing state can be passed around with a single
+pointer, and both the struct and the buffer can be freed with a single call to
+C<free(x)>.
+
+
+=head2 Parsing
+
+  yxml_t *x; /* An initialized state */
+  char *doc; /* The XML document as a zero-terminated string */
+  for(; *doc; doc++) {
+    yxml_ret_t r = yxml_parse(x, *doc);
+    if(r < 0)
+      exit(1); /* Handle error */
+    /* Handle any tokens we are interested in */
+  }
+
+The actual parsing of an XML document is facilitated by the C<yxml_parse()>
+function. It accepts a pointer to an initialized C<yxml_t> struct as first
+argument and a byte as second argument. The byte is passed as an C<int>, and
+values in the range of -128 to 255 (both inclusive) are accepted. This way you
+can pass either C<signed char> or C<unsigned char> values, yxml will work fine
+with both. To parse a complete document, C<yxml_parse()> needs to be called
+for each byte of the document in sequence, as done in the above example.
+
+For each byte, C<yxml_parse()> will return either I<YXML_OK> (0), a token (>0)
+or an error (<0). I<YXML_OK> is returned if the given byte has been
+parsed/consumed correctly but that otherwise nothing worthy of note has
+happened. The application should then continue processing and pass the next
+byte of the document.
+
+=head3 Public State Variables
+
+After each call to C<yxml_parse()>, a number of interesting fields in the
+C<yxml_t> struct are updated. The fields documented here are part of the API,
+and are considered as extra return values of C<yxml_parse()>. All of these
+fields should be considered read-only.
+
+=over
+
+=item C<char *elem;>
+
+Name of the currently opened XML element. Points into the buffer given to
+C<yxml_init()>. Described in L</Elements>.
+
+=item C<char *attr;>
+
+Name of the currently opened attribute. Points into the buffer given to
+C<yxml_init()>. Described in L</Attributes>.
+
+=item C<char *pi;>
+
+Target of the currently opened PI. Points into the buffer given to
+C<yxml_init()>. Described in L</Processing Instructions>.
+
+=item C<char data[8];>
+
+Character data of element contents, attribute values or PI contents. Described
+in L</Character Data>.
+
+=item C<uint32_t line;>
+
+Number of the line in the XML document that is currently being parsed.
+
+=item C<uint64_t byte;>
+
+Byte offset into the current line the XML document.
+
+=item C<uint64_t total;>
+
+Byte offset into the XML document.
+
+=back
+
+The values of the I<elem>, I<attr>, I<pi> and I<data> elements depend on the
+parsing context, and only remain valid within that context. The exact contexts
+in which these fields contain valid information is described in their
+respective sections below.
+
+The I<line>, I<byte> and I<total> fields are mainly useful for error reporting.
+When C<yxml_parse()> or C<yxml_eof()> returns with an error, these fields can
+be used to generate a useful error message. For example:
+
+  printf("Parsing error at %s:%"PRIu32":%"PRIu64" byte offset %"PRIu64",
+    filename, x->line, x->byte, x->total);
+
+=head3 Error Handling
+
+Errors are not recoverable. No further calls to C<yxml_parse()> or
+C<yxml_eof()> should be performed on the same C<yxml_t> struct. Re-initializing
+the same struct using C<yxml_init()> to start parsing a new document is
+possible, however.  The following error values may be returned by
+C<yxml_parse()>:
+
+=over
+
+=item YXML_EREF
+
+Invalid character or entity reference. E.g. C<&whatever;> or C<&#ABC;>.
+
+=item YXML_ECLOSE
+
+Close tag does not match open tag. E.g. C<< <Tag> .. </SomeOtherTag> >>.
+
+=item YXML_ESTACK
+
+Stack overflow. This happens when the buffer given to C<yxml_init()> was not
+large enough to parse this document. E.g. when elements are too deeply nested
+or an element name, attribute name or PI target is too long.
+
+=item YXML_ESYN
+
+Miscellaneous syntax error.
+
+=back
+
+=head3 Elements
+
+The C<YXML_ELEMSTART> and C<YXML_ELEMEND> tokens are returned when an XML
+element is opened and closed, respectively. When C<YXML_ELEMSTART> is returned,
+the I<elem> struct field will hold the name of the element. This field will be
+valid (i.e. keep pointing to the name of the opened element) until the end of
+the attribute list. That is, until any token other than those described in
+L</Attributes> is returned. Although the I<elem> pointer itself may be reused
+and modified while parsing the contents of the element, the buffer that I<elem>
+points to will remain valid up to and including the corresponding
+C<YXML_ELEMCLOSE>.
+
+Yxml will validate that elements properly nest and that the name of each
+closing tag properly matches that of the respective opening tag. The
+application may safely assume that each C<YXML_ELEMSTART> is properly matched
+with a C<YXML_ELEMCLOSE>, or that otherwise an error is returned. Furthermore,
+only a single root element is allowed. When the root element is closed, no
+further C<YXML_ELEMSTART> tokens will be returned.
+
+No distinction is made between self-closing tags and elements with empty
+content. For example, both C<< <a/> >> and C<< <a></a> >> will result in the
+C<YXML_ELEMSTART> token (with C<elem="a">) followed by the C<YXML_ELEMEND>
+token.
+
+Element contents are returned in the form of the C<YXML_CONTENT> token and the
+I<data> field. This is described in more detail in L</Character Data>.
+
+=head3 Attributes
+
+=head3 Processing Instructions
+
+=head3 Character Data
+
+
+=head2 Finalization
+
+