Changes with APR-util 0.9.2

  *) Allow apu-config to work in symlinked install directories when
     'realpath' is available.  [Justin Erenkrantz]

  *) Fix bug in apr_strmatch when used with case-insensitive patterns.
     [Justin Erenkrantz]

  *) Allow apr_queue to have greater than int number of elements.
     [Justin Erenkrantz]

  *) Detect Berkeley DB 4.0 compiled with --with-uniquenames.
     [Philip Martin <philip@codematters.co.uk>]

  *) Allocate brigades from a bucket allocator rather than a pool. [Brian Pane]

  *) Update with the latest APR renames [Thom May]

  *) Update doxygen tags.  [Justin Erenkrantz]

  *) Add apr_ldap.hw for Windows build.
     [Andre Schild <A.Schild@aarboard.ch>]

  *) Add IPv6 literal address support to apr_uri_parse(), apr_uri_unparse(), 
     and apr_uri_parse_hostinfo().  PR 11887  [Jeff Trawick]

  *) Add apr_brigade_writev()  [Brian Pane]

  *) Add support for Berkeley DB 4.1.  [Justin Erenkrantz]

  *) Add --bindir option to apu-config.  [Justin Erenkrantz]

Changes with APR-util 0.9.1

  *) Add versioning infrastructure.
     [Justin Erenkrantz]

  *) Running "make check" in the toplevel directory or the test/ directory
     will build and run all test programs.  [Aaron Bannert]

  *) Bug #9789 : NDBM support 
     [Toomas Soome <tsoome@muhv.pri.ee>, Ian Holsman]

  *) Added a Thread safe FIFO bounded buffer (apr_queue) [Ian Holsman]

  *) Changed file_bucket_setaside() to use apr_file_setaside() instead
     of turning the file bucket into an mmap bucket.  [Brian Pane]

  *) Install libaprutil support libraries before installing libaprutil
     itself, since on some platforms libaprutil is relinked during
     make install and the support libraries need to exist already.
     [Jeff Trawick]

  *) Added a Resource List API for threadsafe access to persistent
     and dynamically created user-defined resources.  [Aaron Bannert]

  *) Adopted apr-util/xlate from apr/i18n for inclusion of apr-iconv
     as required by missing libiconv.  [William Rowe]

  *) Adopted apr-util/crypto/ uuid and md5 from apr.  [William Rowe]

  *) Look for expat in lib64 directories.  [Peter Poeml <poeml@suse.de>]

  *) Faster implementation of apr_brigade_puts()  [Brian Pane]

  *) Fixed a segfault in apr_date_parse_rfc() for some date formats
     where it was trying to overlay a potentially static input
     string even though it didn't really need to.
     [Cliff Woolley, Doug MacEachern]

  *) Ensure that apu-config does not print libtool libraries when
     using --libs.  [Justin Erenkrantz]

  *) Added apr_bucket_file_enable_mmap() function to the bucket
     API to let an application control whether a file bucket may
     be turned into an mmap bucket upon read.  (The default remains
     to do the mmap, but this function lets the app prevent the
     mmap in contexts where mmap would be a bad idea.  Examples
     include multiprocessors where mmap doesn't scale well and
     NFS-mounted filesystems where a bus error can result if
     a memory-mapped file is removed or truncated.) [Brian Pane]

  *) Added string-matching API (apr_strmatch.h)  [Brian Pane]

  *) Rearrange INCLUDES so that APRUTIL_PRIV_INCLUDES is always
     first.  [Garrett Rooney <rooneg@electricjellyfish.net>]

  *) Add --old-expat option to apu-config to allow users of apr-util to
     determine what expat it should expect to be installed.  If the
     flag is set to yes, it should include xmlparse.h.  If it is set to
     no, it should include expat.h.  [Justin Erenkrantz]

  *) Fix exporting of includes in apu-config.  [Justin Erenkrantz]

  *) Change bucket brigades API to allow a "bucket allocator" to be
     passed in at certain points.  This allows us to implement freelists
     so that we can stop using malloc/free so frequently.
     [Cliff Woolley, Brian Pane]

  *) add apr_rmm_realloc() function
     [Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>]

  *) renames: apr_ansi_time_to_apr_time becomes apr_time_ansi_put
     ap_exploded_time_t becomes apr_time_exp_t
     [Thom May <thom@planetarytramp.net>]

  *) Add detection support for FreeBSD's expat and expat2 ports.
     [Justin Erenkrantz]

  *) Deprecate check_brigade_flush(), which had several nasty bugs, and
     which was causing apr_brigade_write()'s logic to be less than obvious.
     Everything is now done in a slightly rearranged apr_brigade_write().
     [Cliff Woolley]

  *) Don't add /usr/include to the INCLUDES variable on expat's account.
     [Joe Orton <joe@manyfish.co.uk>]

  *) Remove the autoconf 2.5x cache directory in buildconf.
     [Joe Orton <joe@manyfish.co.uk>]

  *) BerkleyDB should NULL out the key if it is @EOF in vt_db_nextkey
     [Ian Holsman]

  *) Add ability to natively fetch and split brigades based on LF lines.
     [Justin Erenkrantz]

  *) add --with-berkeley-db=DIR & --with-gdbm  configure flags
     [Ian Holsman/Justin Erenkrantz]

  *) Fix expat detection to recognize installed versions.
     [Eric Gillespie, Jr. <epg@pretzelnet.org>]

  *) Add find_apu.m4 to allow third-party programs that use APR-util
     to have a standard m4 macro for detection.  [Justin Erenkrantz]

  *) Add apu-config - a shell script to allow third-party programs
     easy access to APR configuration parameters.  [Justin Erenkrantz]

  *) Add GMT offset calculation to apr_date_parse_rfc().  
     [Justin Erenkrantz]

  *) Introduce the apr_rmm api, to allow relocatable memory management
     of address-independent data stores, such as shared memory.
     [William Rowe]

  *) Rework and fix VPATH-build support.  [Justin Erenkrantz]

  *) Add support for Berkeley DB4.  [Justin Erenkrantz]

  *) Improve testdbm help.  [Justin Erenkrantz]

  *) Improve autoconf detection of DBMs.  [Justin Erenkrantz]

  *) BerkeleyDBM v2 now checks minor level for cursor ops [Ian Holsman]

  *) Reading a file bucket bigger than APR_MMAP_LIMIT (4MB) now yields
     a string of 4MB mmap buckets, rather than a string of 8KB heap buckets
     plus a 4MB mmap bucket.  To accomodate this, the mmap bucket destroy
     function explicitly deletes the apr_mmap_t after last reference
     to avoid having too much of a large file mapped at once if possible.
     [Cliff Woolley]

  *) Multi-DBM support (via apr_dbm_open_ex).  [Ian Holsman]

  *) Use apr_mmap_dup in mmap_setaside().  [Brian Pane <bpane@pacbell.net>]

  *) Dropped the "w" parameter from apr_bucket_heap_create() and
     apr_bucket_heap_make().  That parameter was originally intended
     to return the amount of data copied into the bucket, but it
     ended up being unnecessary because that amount is invariant from
     the size of the data and is available as b->length in the
     resulting bucket anyway.  [Cliff Woolley]

  *) Fix Makefile conversion for BSD/OS.  [Cliff Woolley]

  *) Use APR_XtOffsetOf instead of offsetof() in the ring macros for
     portability.  [Cliff Woolley]

  *) We now create exports.c and export_vars.h, which in turn create
     exports.c.  From this we generate two more files with different
     purposes: aprutil.exp - list of exported symbols; and exports.lo
     (exports.o) - an object file that can be linked with an executable
     to force resolution of all apr-util symbols.   [Aaron Bannert]

  *) Fix Berkley DBM support [Ian Holsman <ianh@apache.org>]

  *) Fix apr_brigade_vprintf so that it can handle more than
     4k of data at one time.  [Cody Sherr <csherr@covalent.net>]

  *) prefix UNP_* flags with APR_URI_

     rename:
     apr_uri_components                  -> apr_uri_t
     apr_uri_unparse_components          -> apr_uri_unparse
     apr_uri_parse_components            -> apr_uri_parse
     apr_uri_parse_hostinfo_components   -> apr_uri_parse_hostinfo

     s/APU_URI_/APR_URI_/g
     [Perl]

  *) Landed the link-to-LDAP to the build process, and the LDAP v2/v3
     compatibility functions.
     [Dave Carrigan <dave@rudedog.org>, Graham Leggett]

  *) Fix URI unparse function to handle the case where it would place a @
     when both the username and password were present but omitted.
     [Jon Travis <jtravis@covalent.net]

  *) Added apr_xml_parse_file() routine and a testxml program.
     [Ian Holsman <ianh@cnet.com>]

  *) Extend apr_bucket struct to add a pointer to a function used
     to free the bucket. This change enables custom buckets to
     completely specify how they are to be allocated and freed.
     Before this change, custom buckets were required to use the 
     same memory allocation scheme as the standard APR buckets.
     [Saeid Sakhitab, Bill Stoddard, Cliff Woolley, Roy Fielding]

  *) Install Expat when installing APR-util.  [Justin Erenkrantz]

  *) Make APR-util configure script rely on APR.  This removes the locally
     generated copy of libtool and uses the one in APR.  Fix up how we
     call the expat configure script.  Generate config.nice file.
     [Justin Erenkrantz]

  *) The apr_bucket lengths are now consistently apr_size_t, while any
     apr_brigade lengths (short of a read) are consistently apr_off_t.
     This is required for APR_HAS_LARGE_FILES handling.  [William Rowe]

  *) apr_bucket_file_create() and apr_bucket_file_make() now take a pool
     parameter which is the pool into which any needed data structures
     should be created during file_read().  This is used for MMAPing the
     file and reopening the file if the original apr_file_t is in XTHREAD
     mode.  [Cliff Woolley]

  *) apr_brigade_partition() now returns an apr_status_t. [Cliff Woolley]

  *) Add MD4 implementation in crypto.  [Sander Striker, Justin Erenkrantz]

  *) Moved httpd 2.0.18's util_date to apr_date and enhanced its parsing
     capabilities.  [Justin Erenkrantz]

  *) Moved httpd 2.0.18's util_uri to apr_uri and name-protected its
     symbols and functions.  [Justin Erenkrantz, Roy Fielding]

  *) Rename field "private" in struct apr_xml_elem to "priv" for C++
     compatibility.  PR #7727  [Joshua MacDonald <jmacd@cs.berkeley.edu>]

  *) Make APR_IMPLEMENT_EXTERNAL_HOOK_BASE generate a 
     ${namespace}_hook_get_${hookname} function to fetch the
     list of registered hooks [Doug MacEachern]

  *) Allow LTFLAGS to be overridden by the configure command-line
     (default="--silent") and introduce LT_LDFLAGS.  [Roy Fielding]

  *) Add APR_SHARELOCK support to apr_sdbm_open(), locking read operations
     with a shared lock and all write ops with an excl lock.  [Will Rowe]

  *) Namespace protect apr_sdbm, and normalize the return values (including
     the apr_sdbm_fetch, apr_sdbm_firstkey and apr_sdbm_nextkey functions).
     Normalized the get/clear error function names, and stores the actual 
     apr error for apr_sdbm_error_get. [Will Rowe]

  *) Introduce an apr_fileperms_t argument to apr_dbm_open(). [Will Rowe]

  *) Removed apr_bucket_do_create() macro, which was causing warnings
     about unreachable code in some compilers (notably MSVC).  What
     used to be done by this macro is now done inline in the various
     apr_bucket_foo_create() functions.  [Cliff Woolley]

  *) Make clean, distclean, and extraclean consistently according to the
     Gnu makefile guidelines.  [Justin Erenkrantz <jerenkrantz@ebuilt.com>]

  *) Migrate the --disable-libtool changes from APR to APR-util.
     This cleans things up, and allows more flexibility when building
     programs.  [Ryan Bloom]

  *) Allow APR-util to be compiled without libtool.  The default is
     to use libtool, but it can turned off with --disable-libtool
     on the configure command.  [Ryan Bloom]

  *) Repair calling convention for apr_register_optional_fn to
     eliminate GP fault on Win32.  [William Rowe]

  *) Substantial changes to correct linkage and declarations for
     generic hooks on dso architectures.  [Ben Laurie, Will Rowe]

  *) apr_bucket_shared_destroy() now returns a boolean value.
     [Cliff Woolley]

  *) We have to initialize the heap buckets to the correct length.
     we were seeing heap buckets with 17 chars in them reporting
     a length of 9017, because they were initialized to the amount
     of memory allocated, instead of the amount of memory used.
     This was only an issue for heap buckets created by the
     apr_brigade_* functions.   [Ryan Bloom]

  *) apr_bucket_init_types() and apr_bucket_insert_type() have been
     removed... they're not needed anymore. [Cliff Woolley]

  *) The apr_bucket_shared and apr_bucket_simple structures have been
     removed as an API simplification/optimization.  This should be
     transparent outside APR-util except to callers who attempt to
     directly manipulate the buckets' internal structure (which is
     not recommended anyway) and to callers who create their own
     bucket types. [Cliff Woolley]

  *) apr_bucket_simple_split() and apr_bucket_simple_copy() are now
     exported functions, which could be helpful in implementing
     external bucket types. [Cliff Woolley]

  *) The third parameter to apr_bucket_shared_make() is now
     'apr_off_t length' rather than 'apr_off_t end', since the
     end usually had to be computed by the caller and all we
     really want is the length anyway. [Cliff Woolley]

