luajson v0.10 Release Notes
===========================

User Visible Changes
--------------------
This release changes the system quite a bit from previous versions in
that there is more configurability.  There still is quite a bit of strong
defaulting to make it accept more data formats and encode such that the
most strict decoder *should* decode it.

It is now possible to obtain wrapped-up encoders and decoders with options
"compiled" in.  With decoders this is particularly bound-up (LPEG patterns),
encoders take advantage of this with less closure-count.

Extended features of newer LPEG versions can also be used as they are
available, either via function detection or version # parsing.

New decoder features:

 * Single-quoted strings
 * Function-call decoding
 * Generic string management
   * String post-processing option
   * UTF-16 -> UTF-8 code decoding for "\uXXXX" from Emil Renner Berthing by default (not req)
 * Handle extended UTF-8 spacing characters and BOF for inter-element spacing

New encoder features:

 * Function-call encoding
 * String pre-processing option
 * Fully modular encoding system
 * Encoding with similar option system as decoding


Plans for next release
----------------------

0.11

 * UTF-8 encoding/decoding validation (currently decoding only supported)
 * Optional \xXX encoding
 * JSON encoding with fully 'strict' options
 * Generic output mechanism (ropes, IO, etc)

1.0 beta

 * Full API documentation
 * Stable encoder/decoder option-apis.  Final 1.0 release will maintain
   that all options used in code will be future-proof, at least until 2.0

Updates since 0.9.1
===================

Emil Renner Berthing (1):
	decoder:
		Added proper utf8 decoding of strings
Thomas Harning Jr (38):
	-ungrouped-
		Merge branch '0.9-rockspec'
	base:
		Setup 0.9.1 rockspec with md5 of luaforge release
		added luarocks module to check out luajson from git (requires git patch)
		Preparing for next release pre-emptively
	decode-util:
		during a table merge, if a nil is located, skip it
	decoder/test:
		Added preliminary function-call handling
		Require name is string and func is function
		Support both patterns and strings as function name specifiers
		function calls receive as first argument the name used
		added support for multiple arguments to functions
		Moved function-call decoder to separate module
		added string post-processing utility
	decoder/tests:
		adds support for single-quoted strings w/ expected escape-handling
		support unicode whitespaces as whitespace around values
	decoder:
		Fully modularized strings/number/calls data-types
		Refactored boolean/null/undefined out into the 'others' module
		Provide workaround for missing lpeg.type in lpeg 0.6, 0.7, ...
		More stabilization of string decoder configuration as well as hooking unicode-handling in
		optimized 'number' option-defaulting
		unified configuration system into a fast-cached Tokend which only permits card-readng ops (writing in seprate referece...)
		Fixed return assertion to prevent 'Invalid JSON data' from being returned as second result
		Added simple LPEG version parser "x.y.z.." => x.y
		Added support for LPEG 0.9 accumulator replacement (fold) which may be faster
		string.char => string_char for optimization in utf8 decoder
	encoder/decoder:
		added support for 'undefined' value
	encoder/test:
		exposed and test string preprocessing option
	encoder:
		add string preprocessor handler (for encoding->utf8 mgmt)
		Break apart the encoder into distinct modules + add call encoding
		split out number encoder into own file to mirror decoder
		added applicable configuration options from the decoder to the number encoder
		enhanced configuration support to match the decoder's optionset where appropriate
		added 'initialObject' check to assert that the root object is in fact an object/array
		mirrored decoder's getDecoder => getEncoder setup
		performed full modularization of the encoder + added function-encode tests
	tests:
		Removed package.path alteration since 'make check' handles that as well as luarocks
		applied configuration optimizations take advantage of the encoder optimizations and simplifications from the decoders
		added UTF-16 => UTF-8 encoder test
		extends UTF tests with boundary tests and test # for break detect
