Exess
=====

Exess is a simple library for reading and writing [XSD][] datatypes.

Exess is useful for applications that need to read/write common datatypes
from/to strings, in a standard and locale-independent format.  It supports
reading any valid syntax, and writing in canonical form.  The implementation is
not complete, but includes support for all of the common datatypes that are
generally useful (the XML-specific and partial Gregorian calendar datatypes are
omitted).

Conversion to a string and back is lossless for all supported values.  For
example, writing a `float` number to a string then reading it back will yield
the exact same `float` as the original value.

The API consists mainly of simple read and write functions for each datatype.
A variant type is also included which allows generic code to work with values
of any type.  For flexibility, allocation is handled by the caller, making it
possible to work on the stack, or read and write values to fields in some
structure.  Syntax errors are reported with a descriptive error code and
character offset, allowing friendly error messages to be produced.

Supported Datatypes
-------------------

Exess supports reading and writing:

  * `boolean`, like "false", "true", "0", or "1".

  * `decimal`, like "1.234" (stored as `double`).

  * `float` and `double`, like "4.2E1" or "4.2e1".

  * The unbounded integer types `integer`, `nonPositiveInteger`,
    `negativeInteger`, `nonNegativeInteger`, and `nonPositiveInteger` (stored
    as `int64_t` or `uint64_t`).

  * The fixed size integer types `long`, `int`, `short`, `byte`,
    `unsignedLong`, `unsignedInt`, `unsignedShort`, and `unsignedByte`.

  * `duration`, like "P1Y6M".

  * `time`, like "12:30:00.00".

  * `date`, like "2001-12-31".

  * `hex`, like "EC5355".

  * `base64`,like "Zm9vYmFy".

Dependencies
------------

None, except the C standard library.

Building
--------

A [Meson][] build definition is included which can be used to do a proper
system installation with a `pkg-config` file, generate IDE projects, run the
tests, and so on.  For example, the library and tests can be built and run like
so:

    meson setup build
    cd build
    ninja test

Documentation
-------------

 * [API reference (single page)](https://drobilla.gitlab.io/exess/c/singlehtml)
 * [API reference (paginated)](https://drobilla.gitlab.io/exess/c/html)

See the [Meson documentation][] for more details on using Meson.

 -- David Robillard <d@drobilla.net>

[XSD]: https://www.w3.org/TR/xmlschema-2/

[Meson]: https://mesonbuild.com/

[Meson documentation]: https://mesonbuild.com/Quick-guide.html
