MPDM Release Notes
==================

2.1.5
-----

 - Bug fixes:
   - Escape the base directory in glob().
 - New features:
   - New array function mpdm_reverse().

2.1.4
-----

 - Use the APPID variable in mpdm_app_dir().

2.1.2
-----

 - New features:
   - mpdm_join() joins more types.
   - mpdm_iterator() returns index/element pairs when iterating
     an array and can also iterate files and numbers.
   - New function mpdm_fmt(), like mpdm_sprintf() but for only one value.
     As a bonus it includes the percent-commands `j' (output as JSON) and
     `t' (followed by a curly brace-enclosed strftime() format).
   - mpdm_sscanf() also supports a %t command, to parse a time string
     (inverse of the one in mpdm_fmt(), and %j, to parse a JSON string.
   - New channel implementation (bidirectional communication for
     threads).
   - New function mpdm_rename().
   - New function mpdm_slice().
   - New function mpdm_getcwd().

2.1.1
-----

 - New features:
   - mpdm_join() allows the joining of two arrays.
   - New function mpdm_set().

2.1.0
-----

 - New features:
   - Support for client TCP/IP connections via the new
     mpdm_connect() function.
   - New function mpdm_tr(), to transliterate strings.
 - Bugfixes:
   - The pclose() win32 implementation returns the process exit
     status correctly.

2.0.1
-----

 - Optimizations:
   - Numeric values created with MPDM_I() and MPDM_R() do not have
     their string representation created until needed by a call to
     mpdm_string() (which can never happen).
 - New features:
   - New function mpdm_sget_i().
   - New macros MPDM_AA() and MPDM_AS(), for local stack-allocated
     (i.e. using alloca()) arrays and strings, meant to be used
     for optimized, short-lived temporary values.

2.0.0
-----

 - The system has been refactored to be a pure reference counting
   system, so sweeping / garbage collection no longer exists.
 - Executable values and functions now include a new argument to
   hold a context (used to implement local symbol tables and such).
 - mpdm_adel() and mpdm_hdel() no longer return the deleted element.
 - mpdm_aset() and mpdm_hset() no longer return the old element.
 - mpdm_sort() sorts the array instead of returning a new one.
 - New functions mpdm_strcat_sn(), mpdm_pokewsn(),
   mpdm_join_s(), mpdm_split_s(), mpdm_cmp_s(), mpdm_strcat_s().
 - Some refactoring to diminish memory usage (no more `prev'
   pointers in the value list, less residual values).
 - mpdm_regex() always return an array in global searches (maybe
   an empty one) and if searching for an array of regexes (maybe
   be a partial one).
 - The following functions had had their arguments swapped:
    - mpdm_split() and mpdm_split_s().
    - mpdm_join() and mpdm_join_s().
    - mpdm_sscanf().
    - mpdm_regex().
    - mpdm_sregex().

1.0.9
-----

 * mpdm_ival() now accepts numbers prefixed by `0b' as binary
   numbers.
 * Similarly, mpdm_sprintf() now accepts the `%b' code to
   print a value as a binary number.
 * Fixed mpdm_sset() when the previous-to-last value to be
   assigned is executable (this is bug 1114).
 * New function mpdm_iterator().

1.0.8
-----

 * New function mpdm_sscanf().
 * Fixed mpdm_encoding() to allow again empty strings as its
   argument to fall back to default encoding.
 * Improved file encoding autodetection by looking at the
   UTF BOM marks. The detected encoding is stored in the
   `DETECTED_ENCODING' root key.

1.0.7
-----

 * Fixed a bug when processing backslashes in the substitution
   string in sregex(), that made them dissappear if they were
   not escaping an ampersand.
 * Fixed a bug in win32 globbing.
 * The dump_1() function is now pluggable.
 * New function mpdm_chdir().

1.0.6
-----

 * The environment is stored in a hash called ENV in mpdm_root().
 * Under win32, the LANG environment variable is hand-built if
   none is set.
 * If the third argument to sregex() is a hash, the values can
   now also be executable ones.
 * New internal flag for values to mark them as deleted.

1.0.5
-----

 * The mpdm_regex() function now accepts a new flag, `g', to match
   globally; in this case, an array of matches are returned instead
   of a string scalar.
 * The mpdm_stat() function now returns a 14 element array, with a
   newly #13 argument containing the canonicalized file name, if
   the underlying system supports it.
 * A bunch of embedded charset encoders have been implemented for
   iso8859-1, utf-16 and utf-32 with or without BOM autodetection.

1.0.4
-----

 * API Changes; const has been added wherever possible.

1.0.3
-----

 * The hashing function has changed to a less accurate but faster one.
 * There is a new, adaptive way of sweeping: if default_sweep if set
   to a negative value (different from -1), it's used as a divisor
   of the total count of values; this will be the number of values
   that will be swept on each call to mpdm_sweep(0). This way, the
   number of swept values depend on the total count.
 * New functions mpdm_set_ival() and mpdm_set_rval().
 * New function mpdm_get_filehandle().

1.0.2
-----

 * Components of a compact symbol can be executable, apart from
   hashes and arrays.
 * mpdm_cmp() is optimized to return 0 when comparing the same value.

1.0.1
-----

 * mpdm_cmp() now correctly compares NULL and NULL as equal.
 * %c in mpdm_sprintf() now works with Unicode (wchar_t) characters.
 * The substitution string in mpdm_sregex() now can include the
   special character & to select the matched string. To include a
   literal &, escape it with \.
