

v3.23 (2018-08-28)
==================
Enhancements:
- opt: the option parser now recognizes long option abbreviations
- io: use modern readdir rather than readdir_r


v3.22 (2014-08-25)
==================
Enhancements:
- string: add the HXQUOTE_SQLBQUOTE quoting variant


v3.21 (2014-06-02)
==================
Enhancements:
- HXformat_add() now supports HXTYPE_MCSTR objects (with and without
  HXTYPE_IMMED)
- libxml_helper: New xml_getnsprop() function that gets the value of a
  property (element attribute) by namespace prefix


v3.20 (2014-04-18)
==================
Enhancements:
- resolve some link errors when built with Solaris ld


v3.19 (2014-02-21)
==================
Enhancements:
- string: add the HXQUOTE_SQLSQUOTE quoting variant
Internal changes:
- format: rework function calling code to support extending with functions


v3.18 (2014-03-01)
==================
Enhancements:
- string: add the HX_stpltrim function
Fixes:
- Make HX_strltrim move the correct number of bytes
Changes:
- remove wxCFF from wx_helper.hpp


v3.17 (2013-11-16)
==================
Enhancements:
- defs: add HX_SIZET_FMT and HX_LONGLONG_FMT
- support for Win64
Fixes:
- compile warnings on mingw were addressed


v3.16 (2013-09-29)
==================
Enhancements:
- format: remove 256-char format key length limit
Fixes:
- compile errors on mingw were addressed


v3.15 (2013-03-07)
==================
Enhancements:
- string: add HX_strchr2
- string: add HXQUOTE_URIENC mechanism for HX_strquote
Changes:
- defs: HXsizeof_member becomes FIELD_SIZEOF
  (to match the Linux kernel's macro name)


v3.14.1 (2012-12-31)
====================
Fixes:
- Restore forward-sorting order of ordered maps
  (revert "map: always have needle as second argument")


v3.14 (2012-11-14)
==================
Fixes:
- io: use pathconf(3) to determine dirent size for dir traversal
- rand: avoid division by zero when calling HX_irand with lo==hi
- time: use C++ static_cast syntax for C++ mode
- headers: improve operability with C89 compile mode


v3.13 (2012-07-28)
==================
Enhancements:
- defs: add DEMOTE_TO_PTR
- option: new HXOPT_RQ_ORDER flag, allows unconditional POSIX-style parsing
  (parsing terminates at first non-option encountered)
- option: add HXTYPE_SIZE_T
- time: add functions and macros for arithmetic and handling of timespec
  with support for negative time values
  * time: add HX_TIMESPEC_{EXP,FMT}
  * time: add HX_TIMEVAL_{EXP,FMT}
  * time: add the HX_timespec_isneg function
  * time: add the HX_timespec_neg function
  * time: add the HX_timespec_add function
  * time: add the HX_timespec_mul function
  * time: add the HX_timespec_mulf function
Changes:
- io: remove HX_REALPATH_SYMLINK
- time: rename HX_diff_timespec to HX_timespec_sub (old ABI kept)
- time: rename HX_diff_timeval to HX_timeval_sub (old ABI kept)
- string: make HX_memmem consider the special case of search_length=0
- string: optimize search_length=1 case in HX_memmem
- string: speed up HX_memmem searches for search_length >=2


v3.12.1 (2011-12-15)
====================
Fixes:
- build: make build error-free when using -Wl,--no-undefined
- string: make HX_strdup(NULL) valid again


v3.12 (2010-12-03)
==================
Fixes:
- defs: resolve warning for users of const_cast*() when using -Wextra
- format: error handling for HXformat2_aprintf
- option: do not omit dashes when passthru'ing unknown two-part long opts
- option: do not omit arg following unknown unknown two-part long opts in pthru
- option: do run callback on HXTYPE_BOOL
- option: correct passthrough of squashed unknown short options
- option: do not stop early when printing help/usage
- option: avoid crash when passing an empty argv
- option: avoid crash when passing NULL for struct HXoptcb.arg0
Enhancements:
- build: deactivate type-checking of the *_cast() macros for clang due to a
  compiler bug involving nested structs-in-typeofs
- option: allow argc=NULL on HX_getopt
- option: error handling for HX_getopt
- option: support POSIXLY_CORRECT environment variable
- string: add a HX_strndup function
- string: add a HX_strnlen function
- mc: use an implicit minimum allocated length
Changes:
- format: renamed HXformat2_[afs]printf back to HXformat_[afs]printf
- io: add mode argument to HX_mkdir
- map: avoid 1<<31 in constants
- option: remove struct HXoptcb.arg0
- option: remove struct HXoptcb.match_{ln,sh} by .flags
- option: let HX_getopt return code indicate system failure states
- option: remove struct HXoption.sval (replaced by .uptr)
- string: unline HX_strdup, HX_strlcat, HX_strlcpy, HX_strnlcat


v3.11 (2011-07-25)
==================
Enhancements:
- A LD_PRELOAD-able library libHX_rtcheck.so that adds global state correctness
  checks, was added.
- add a HXQUOTE_BASE64 to HX_strquote
Changes:
- HX_strquote will return NULL for unknown types now instead of just
  returning the input pointer


v3.10.1 (2011-04-06)
====================
Fixes:
- defs: BUILD_BUG_ON_EXPR had erroneously returned 1


v3.10 (2011-04-05)
==================
Fixes:
- build: resolve autoconf-2.68 warnings
- format: do not split arguments in %(lower) and %(upper)
Changes:
- defs: add array type checking in ARRAY_SIZE
- opt: use non-zero sentinel marker
- string: make HX_getl more resilient against errors
Enhancements:
- defs: add BUILD_BUG_ON_EXPR
- format: provide a %(substr) function
- io: add HX_readlink (zero-terminating mc-output readlink)
- io: add HX_realpath (supports relative-path output)


v3.9.1 (2011-01-17)
===================
Fixes:
- libHX/io.h was not copied on `make install`, which has been fixed


v3.9 (2011-01-15)
=================
Fixes:
- Added missing __cplusplus guards to libHX/io.h
- Added missing includes to libHX/string.h
- Use __typeof__ in includes
Changes:
- For filesystem/filehandle-related functions, io.h should now be included
  in userspace programs instead of misc.h
- libHX.so is now built with a symvers map file
Enhancements:
- hxdirstamp: new development helper program for library users
  (Note to distros: should be in libHX-devel; it is only used during builds)
- io: new functions HXio_full{read,write}


v3.8 (2010-12-01)
=================
This was supposed to go into 3.7 but I forgot to merge in time..
Changes:
- hexdump: colorize characters 0x00 thru 0x1F in tty mode


v3.7 (2010-12-01)
=================
Changes:
- libxml_helper: redo xml_newnode to take a parent and value string
- list: unify naming of reverse-direction functions
- misc: HX_zveclen now returns unsigned from (previous: int)
- dir: HXdir functions now work with struct HXdir * instead of void *
Fixes:
- list: avoid potential shadow warning when using HXclist_{shift,pop}
Enhancements:
- doc: add doc/api.txt that lists the minimum required versions for symbols


v3.6 (2010-08-16)
=================
Fixed:
- bitmap: set/clear/test had no effect due to wrong type selection
- bitmap: avoid left-shift larger than type on 64-bit
- string: fixed buffer overflow in HX_split when too few fields were present
  in the input


v3.5 (2010-08-01)
=================
Fixed:
- format2: failure to skip escaped char in "%(echo foo\ bar)" was corrected
- proc: properly check for HXPROC_STDx--HXPROC_STDx_NULL overlap
- strquote: do not cause allocation with invalid format numbers
Enhancements:
- format2: add the %(exec) function
- format2: add the %(shell) function
- format2: security feature for %(exec) and %(shell)
- format2: add the %(snl) function
- string: HX_strquote gained HXQUOTE_LDAPFLT (LDAP search filter) support
- string: HX_strquote gained HXQUOTE_LDAPRDN (LDAP relative DN) support
Changes:
- format1: removed older formatter in favor of format2
- format2: add check for empty key
- format2: function-specific delimiters
- format2: do nest-counting even with normal parentheses
- format2: check for zero-argument function calls
- hashmap: do not needlessy change TID when no reshape was done
- string: HX_basename (the fast variant) now recognizes the root directory
- string: HX_basename now returns the trailing component with slashes
  instead of everything after the last slash (which may have been nothing)


v3.4 (2010-04-03)
=================
Changes:
- add explicit initialize/deinitialize functions HX_init, HX_exit
Enhancements:
- add the HX_memmem function
- add the HXlist_empty function
- documentation updates: HXlist traversal


v3.3 (2010-01-20)
=================
Bug fixes:
- format: fix incorrect copying of non-expanded % strings
- proc: avoid calling close(-1) to not trip up valgrind
- shconfig: fix incorrect parsing of "\'"
- shconfig: fix incorrect processing of "\"\\\0BCD"
- shconfig: be more strict with syntax
Enhancements:
- deque: add HXdeque_genocide2
- format2: new format string (make-style) support
- mc: add HXmc_zvecfree
- shconfig: add HX_shconfig_map to return all entries of a shconfig file
- rand: add HX_drand ('double'-type bounds and return value)
- rand: avoid some function call overhead in HX_irand


v3.2 (2009-10-11)
=================
Enhancements:
- opt: add HXTYPE_MCSTR for storing into hxmc_t *s
- string: add HX_strquote


v3.1 (2009-09-13)
=================
Enhancements:
- added HXbitmap_* functions
Fixes:
- mc: HXmc_strcpy produced a zero-length string when NULL was copied


v3.0.1 (2009-08-31)
===================
Fixes:
- map: avoid underflow in value-based tree comparison


v3.0 (2009-08-27)
=================
Changes:
- automatically skip building testcases if C++ compiler not available
  (reminder: libHX itself does not require a C++ compiler)
- arbtree: HXbtree was removed in favor of the new HXmap
- clist: clist.h moved into list.h
- format: HXformat_* now uses struct HXformat_map,
  so that it does not tie itself to HXbtree
- mc: fix an alignment-induced overallocation
- rand: use faster modulo-based variant for numbers within RAND_MAX range
- rand: use libc rand() almost exclusively, only use /dev/urandom for seed
Enhancements:
- defs: add HXsizeof_member and HXtypeof_member
- map: new map API, with hash-based maps and classic rbtree-based maps
- time: add time delta functions (HX_diff_timeval/HX_diff_timespec)
Fixes:
- format: memory leaks fixes in HXformat


v2.9 (2009-07-11)
=================
Fixes:
- string: fixed number of fields and trailing NULL in HX_split4
Enhancements:
- string: add HX_basename_exact


v2.8 (2009-07-01)
=================
Enhancements:
- HXproc now knows about HXPROC_NULL_*, which can be used to discard I/O
- HXproc: expressly prohibit HXPROC_STD* for HXproc_run_sync


v2.7 (2009-04-08)
=================
Fixes:
- install missing wx_helper.hpp


v2.6 (2009-03-28)
=================
Documentation:
- install documentation
- update project URLs
- add section about Miscellaneous functions
Changes:
- arbtree: add "flat view" operation
- misc: added HX_fls
- misc: make HX_time_compare otime-capable
- add wx_helper.hpp


v2.5 (2009-02-11)
=================
Fixes:
- proc: fix fd setup when the standard channels are already closed


v2.4 (2009-02-05)
=================
Documentation updates. A few internal cleanups, nothing user-visible.


v2.3 (2009-01-13)
=================
Fixes:
- defs: only use __builtin_offsetof with GCC >= 4
- misc: fix time_compare on FreeBSD to actually use mtimespec
- mc: handle HXmc_length(NULL)
- dir: do not cause directory traversal to restart after 2^32 entries


v2.2 (2009-01-01)
=================
Fixes:
- defs/cast: avoid warning between conversion from type[] to type *
- defs/cast: add fallback defs for const_castN()
- arbtree: correctly set errno (to ENOENT) in HXbtree_find and _get
- string: document behavior details of HX_basename

Changes:
- removed old HX_vfsystem

Enhancements:
- defs: add HXSIZEOF_Z*
- defs: add HX_STRINGIFY
- proc: initial code
- string: add HX_split4 function


v2.1 (2008-12-23)
=================
- defs: fix bogus offsetof macro for non-GCC
- defs: add a pair of guarding parentheses in static_cast()
- doc: generate PDF file from LyX document


v2.0 (2008-12-23)
=================
Fixes:
- arbtree: reject illegal flag combinations
- arbtree: correctly set errno in HXbtree_find and HXbtree_get
- arbtree: do not return dangling pointer in HXbtree_del
- defs: add a working offsetof() and containerof() for C++ mode
- defs: use GCC's __builtin_offsetof
- defs: resolve warnings with signed_cast() for char* -> const char* conversions
- dir: HX_rrmdir: do not stop on error
- opt: fix interpretation of strings during conversion to bool
  (all strings that were not empty and not 0 were interpreted as "true",
  and this included the strings "no", "off" and "false", which should
  actually have mapped to, well, "false".)
- rand: use autoconf to detect presence of unix functions
- string: replace HX_strrev implementation by one that does not allocate


New feature: Type-checking casts.
- defs: enable type-checking signed_cast()
- defs: add signed_cast<> for C++ mode
- defs: rewrite static_cast() to not cause -Wshadow warnings when nested
- defs: rewrite const_cast() to do type checking
  (actually, const_cast1(), cosnt_cast2() and const_cast3() were introduced.
  const_cast() is kept to not break program compilation.)


New misc code:
- ctype_helper: initial version
- deque: add struct HXdeque_node->char *sptr as a typed variant for ptr
- mc: add HXmc_setlen()
- opt: HXTYPE_BOOL and HXTYPE_NONE now take int * (instead of unsigned int *)


New arbtree code:
- arbtree: add struct HXbtree_node->char *skey and char *sdata
- arbtree: support arbitrary key/data duplication
- arbtree: add HXbtree_init2


Removals:
- mc: remove HXmc_dup
  [you can use HXmc_meminit(old, HXmc_length(old))]
- string: HX_strmid behavior changed for length=0
  [no more "remaining string", now returns a zero-length string]


v1.28 (2008-11-18)
==================
- add HXTYPE_{U,}INT{8,16,32,64}
- add includedir to cflags (libHX.pc)


v1.27 (2008-12-23)
==================
No functional changes for Linux platforms.

- build: fixed compile errors with i586-mingw32msvc cross compile
- regenerated the Makefile.in files in the tarball with an updated
  version of automake-tranquility so that they are now
  POSIX-compliant and work with BSD make


v1.26 (2008-10-12)
==================
- add HX_hexdump() for debugging within programs
- fix double free in the error path of HX_getopt() when a long option preceded
  a short option of which the latter had problems (i.e. missing argument)
- add actual typechecking to signed_cast()
- add typechecking to static_cast(),
  (but this is normally disabled to avoid compile interruption)


v1.25 (2008-09-07)
==================
- install missing misc.h
- HXmc: pointer was not automatically updated after hmc_trunc()
- HXmc: rename functions and put them into the HX* namespace (API change)
- HXmc: make code resistant to memory allocation failure


v1.23 (2008-09-02)
==================
- code cleanup: misc.h has been split off libHX.h
- add defs.h


v1.22 (2008-07-16)
==================
- need to use lstat() on directory operations such as mkdir and rrmdir
- use RTLD_LAZY when opening dynamic libraries
- add libxml_helper


v1.18 (2008-06-10)
==================
- implement reverse iterating through HXlist
- remove deprecated HXlist_init_head() and HXclist_init_head()
  [replaced by HXlist_init() and HXclist_init()]
- added HX_ffs()


v1.17 (2008-05-08)
==================
- HXlist: added HXlist_for_each_safe, HXlist_for_each_entry_safe
- HXclist: added HXclist_del


v1.15 (2008-04-04)
==================
- HXformat: add %(ifempty) and %(ifnempty) tags
- libHX.h: split into {arbtree,deque,option,string}.h (and libHX.h)
- Add inline-doubly-linked-list data structures


v1.10.2 (2007-12-06)
====================
- [r105]: pass up NULL from memory allocation error
- [r108]: only return success on EEXIST when HXF_KEEP was given
- [r112]: HX_dirname() incorrectly computed the path


v1.10.1 (2007-09-17)
====================
- [r96]: Fix output of line-wrapped help text
- tarball: in libHX 1.10.0 I forgot to provide the configure - sorry
  (but you could regenerate it using ./autogen.sh if you have autotools)
