2021-06-17  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.20

2021-06-14  Sergey Poznyakoff  <gray@gnu.org>

	Enable pre-reading the memory mapped regions on request.

	The commit 4fb2326a4a introduced pre-reading of memory mapped
	regions.  While speeding up searches, it has a negative impact
	on write operatons, since every remapping effectively re-reads
	the entire database.  See https://github.com/Perl/perl5/issues/18884
	for details.

	* NEWS: Document changes.
	* doc/gdbm.texi: Document the GDBM_PREREAD flag.
	* src/gdbm.h.in (GDBM_PREREAD): New flag.
	* src/gdbmdefs.h (gdbm_file_info): New member: mmap_preread.
	* src/gdbmopen.c (gdbm_fd_open): Set mmap_preread if requested.
	* src/gdbmsetopt.c (setopt_gdbm_getflags): Report GDBM_PREREAD
	flag, if dbf->mmap_preread is set.
	* src/mmap.c (_gdbm_internal_remap): Use pre-fault reading only
	if dbf->mmap_preread is set.

2021-04-23  Sergey Poznyakoff  <gray@gnu.org>

	Fix possible integer overflows and cases of undefined behavior.

	* src/avail.c (avail_comp): Prevent integer overflow.
	(gdbm_avail_table_valid_p): Likewise.
	* src/gdbmdefs.h (off_t_sum_ok): Change return type.
	Return false if any argument is negative.
	* src/gdbmopen.c (compute_directory_size): Prevent integer overflow.
	* src/hash.c (_gdbm_hash): Treat dptr elements as unsigned
	integers.

2021-03-22  Sergey Poznyakoff  <gray@gnu.org>

	Fix minor memory leaks in gdbmtool

	* src/datconv.c (dsegm_list_free): Free name if necessary.
	* src/gram.y (defid): Free $1 when no longer needed.

2021-03-21  Sergey Poznyakoff  <gray@gnu.org>

	Merge branch 'newcache': Bucket cache rewritten from scratch.

	Enable automatic cache size by default.

	This provides for the optimal performance.

	Additional GDBM_XVERIFY flag can be used when opening the database
	to request extended database verification (entire avail stack will be
	checked).
	* src/bucket.c (cache_lookup): Handle cache_size == GDBM_CACHE_AUTO.
	(_gdbm_cache_init): Likewise.
	* src/gdbm.h.in (GDBM_XVERIFY): New flag to gdbm_open.
	(GDBM_CACHE_AUTO): New constant.
	Define error constants within enum.
	Fix definition of GDBM_BAD_HASH_ENTRY.
	* src/gdbmclose.c: Fix misleading comment.
	* src/gdbmconst.h: Define DEFAULT_CACHESIZE to be GDBM_CACHE_AUTO.
	* src/gdbmopen.c (gdbm_fd_open): Call gdbm_avail_verify if
	the GDBM_XVERIFY flag is set.

	* doc/gdbm.texi: Update.
	* doc/gdbm.3: Update.

2021-03-20  Sergey Poznyakoff  <gray@gnu.org>

	More optimizations in cache tree

	* src/bucket.c (gdbm_dir_entry_valid_p): Inline
	(cache_lookup): Keep track of cache hits.
	(_gdbm_get_bucket): Check the cache_entry first.
	(gdbm_get_cache_stats): Change signature. Return the per-db
	number of cache hits as well.
	* src/cachetree.c: Inline static functions.
	(_gdbm_cache_tree_lookup): Avoid extra level of indirection
	(nodeptr) at the expense of one additional comparison.
	* src/gdbm.h.in (gdbm_get_cache_stats): Change signature.
	* src/gdbmdefs.h (gdbm_file_info) <cache_hits>: New member.

2021-03-17  Sergey Poznyakoff  <gray@gnu.org>

	Fix memory leak in gdbmtool "next" command.

	* src/gdbmtool.c (nextkey_handler): Always free the previous key
	buffer.

	Fix memory leak in gdbmtool "next" command.

	* src/gdbmtool.c (nextkey_handler): Always free the previous key
	buffer.

	New functions for traversing the available space stack

	* src/Makefile.am: Add avail.c
	* src/avail.c: New file.
	* src/gdbm.h.in (gdbm_avail_verify): New proto.
	* src/gdbmdefs.h (GDBM_HEADER_AVAIL_SIZE): New macro.
	* src/gdbmopen.c (gdbm_avail_table_valid_p)
	(gdbm_avail_block_validate)
	(gdbm_bucket_avail_table_validate): Move to avail.c
	* src/gdbmtool.c (_gdbm_avail_list_size)
	(_gdbm_print_avail_list): Rewrite using gdbm_avail_traverse.
	* src/proto.h (gdbm_avail_traverse): New proto.
	* src/systems.h: Include stddef.h.

	New functions for traversing the available space stack

	* src/Makefile.am: Add avail.c
	* src/avail.c: New file.
	* src/gdbm.h.in (gdbm_avail_verify): New proto.
	* src/gdbmdefs.h (GDBM_HEADER_AVAIL_SIZE): New macro.
	* src/gdbmopen.c (gdbm_avail_table_valid_p)
	(gdbm_avail_block_validate)
	(gdbm_bucket_avail_table_validate): Move to avail.c
	* src/gdbmtool.c (_gdbm_avail_list_size)
	(_gdbm_print_avail_list): Rewrite using gdbm_avail_traverse.
	* src/proto.h (gdbm_avail_traverse): New proto.
	* src/systems.h: Include stddef.h.

	Follow-up fixes to fd5cf245ea.

	These address https://puszcza.gnu.org.ua/bugs/?503

	* src/gdbmdefs.h (gdbm_avail_block_valid_p): Remove.
	* src/gdbmopen.c (gdbm_avail_block_validate): Use inline conditional
	instead of gdbm_avail_block_valid_p.
	(gdbm_fd_open): Revert to reading master avail_block in two passes (as
	was before fd5cf245ea).
	(validate_header): Add back master avail block consistency check.
	* src/gdbmtool.c (_gdbm_avail_list_size): Use _gdbm_avail_block_read.
	* src/recover.c (_gdbm_finish_transfer): Reset dbf->file_size.

	Follow-up fixes to fd5cf245ea.

	These address https://puszcza.gnu.org.ua/bugs/?503

	* src/gdbmdefs.h (gdbm_avail_block_valid_p): Remove.
	* src/gdbmopen.c (gdbm_avail_block_validate): Use inline conditional
	instead of gdbm_avail_block_valid_p.
	(gdbm_fd_open): Revert to reading master avail_block in two passes (as
	was before fd5cf245ea).
	(validate_header): Add back master avail block consistency check.
	* src/gdbmtool.c (_gdbm_avail_list_size): Use _gdbm_avail_block_read.
	* src/recover.c (_gdbm_finish_transfer): Reset dbf->file_size.

2021-03-16  Sergey Poznyakoff  <gray@gnu.org>

	Verify if key/pair ends at a valid offset before attempting to read it.

	This fixes https://puszcza.gnu.org.ua/bugs/index.php?502.

	* src/findkey.c (gdbm_bucket_element_valid_p): Verify also if the
	key/data pair ends at a valid file offset.
	(_gdbm_read_entry): Set up the cache data only on success.
	* src/gdbmdefs.h (gdbm_bucket_element_valid_p): Remove declaration.
	(gdbm_file_info): New member 'file_size' keeps the recently retrieved
	value of the file size.  It is invalidated wherever data is written to
	the database.
	* src/fullio.c (_gdbm_full_write,_gdbm_file_extend): Invalidate
	dbf->file_size.
	* src/gdbmopen.c (gdbm_fd_open): Initialize file_size to -1.
	(_gdbm_file_size): New function.
	* src/mmap.c (_gdbm_file_size): Remove.
	* src/proto.h (_gdbm_file_size): New proto.

	Improve reading and validation of available blocks (avail_block).

	Fixes http://puszcza.gnu.org.ua/bugs/?501.

	* src/falloc.c (_gdbm_avail_block_read): New function.
	(pop_avail_block): Use _gdbm_avail_block_read.
	* src/gdbmdefs.h: Fix typo in the comment.
	* src/gdbmopen.c (gdbm_avail_block_validate): Take size of the avail
	block in bytes as the third argument.  All uses changed.
	(PARTIAL_HEADER_SIZE)
	(HEADER_AVAIL_SIZE): New macros.
	(_gdbm_validate_header): Validate the avail block as well.
	(validate_header): Don't validate the avail block fields here.
	(gdbm_fd_open): Read partial header up to the avail field, then read
	entire avail block using _gdbm_avail_block_read.
	* src/gdbmtool.c (_gdbm_print_avail_list): Fix avail block calculation
	(one extra entry was assumed).
	Use _gdbm_avail_block_read to obtain and validate block.
	* src/proto.h (_gdbm_avail_block_read): New proto.
	(gdbm_avail_block_validate): Change signature.

	Fix memory leak in gdbm_recover

	* src/recover.c (_gdbm_finish_transfer): Free the cache.

	Fix bug #499

	See http://puszcza.gnu.org.ua/bugs/?499

	* src/gdbm.h.in (GDBM_BAD_HASH_ENTRY): New error code.
	* src/gdbmseq.c (get_next_key): Verify the computed hash and bucket
	address for the obtained key.
	* src/gdbmerrno.c (gdbm_errlist): Add error message for
	GDBM_BAD_HASH_ENTRY.

	Verify if key/pair ends at a valid offset before attempting to read it.

	This fixes https://puszcza.gnu.org.ua/bugs/index.php?502.

	* src/findkey.c (gdbm_bucket_element_valid_p): Verify also if the
	key/data pair ends at a valid file offset.
	(_gdbm_read_entry): Set up the cache data only on success.
	* src/gdbmdefs.h (gdbm_bucket_element_valid_p): Remove declaration.
	(gdbm_file_info): New member 'file_size' keeps the recently retrieved
	value of the file size.  It is invalidated wherever data is written to
	the database.
	* src/fullio.c (_gdbm_full_write,_gdbm_file_extend): Invalidate
	dbf->file_size.
	* src/gdbmopen.c (gdbm_fd_open): Initialize file_size to -1.
	(_gdbm_file_size): New function.
	* src/mmap.c (_gdbm_file_size): Remove.
	* src/proto.h (_gdbm_file_size): New proto.

	Follow-up to 40a464d322

	* src/bucket.c (bucket_read): New function.
	(_gdbm_get_bucket): Use bucket_read.  Invalidate bucket in case
	of error.

	Improve reading and validation of available blocks (avail_block).

	This fixes remaining failures in http://puszcza.gnu.org.ua/bugs/?501.

	* src/falloc.c (_gdbm_avail_block_read): New function.
	(pop_avail_block): Use _gdbm_avail_block_read.
	* src/gdbmdefs.h: Fix typo in the comment.
	* src/gdbmopen.c (gdbm_avail_block_validate): Take size of the avail
	block in bytes as the third argument.  All uses changed.
	(PARTIAL_HEADER_SIZE)
	(HEADER_AVAIL_SIZE): New macros.
	(_gdbm_validate_header): Validate the avail block as well.
	(validate_header): Don't validate the avail block fields here.
	(gdbm_fd_open): Read partial header up to the avail field, then read
	entire avail block using _gdbm_avail_block_read.
	* src/gdbmtool.c (_gdbm_print_avail_list): Fix avail block calculation
	(one extra entry was assumed).
	Use _gdbm_avail_block_read to obtain and validate block.
	* src/proto.h (_gdbm_avail_block_read): New proto.
	(gdbm_avail_block_validate): Change signature.

	Don't leave erroneous bucket in GDBM_FILE if _gdbm_get_bucket fails

	This fixes most of bug #501 (http://puszcza.gnu.org.ua/bugs/?501).

	* src/bucket.c (_gdbm_get_bucket): Reinitialize dbf->bucket to
	NULL before returning failure.

2021-02-06  Sergey Poznyakoff  <gray@gnu.org>

	Fix bug #499

	See http://puszcza.gnu.org.ua/bugs/?499

	* src/gdbm.h.in (GDBM_BAD_HASH_ENTRY): New error code.
	* src/gdbmseq.c (get_next_key): Verify the computed hash and bucket
	address for the obtained key.
	* src/gdbmerrno.c (gdbm_errlist): Add error message for
	GDBM_BAD_HASH_ENTRY.

2021-01-09  Sergey Poznyakoff  <gray@gnu.org>

	Merge branch 'master' into newcache

	Minor changes

	* src/hash.c (_gdbm_hash): Suppress address sanitizer errors.
	* src/proto.h (gdbm_file_sync): Add missing return.
	* src/lex.l (input_context_pop): Delete current buffer when tos
	is reached.

2021-01-08  Sergey Poznyakoff  <gray@gnu.org>

	Reword some messages and add translator comments.

	* src/gdbmtool.c: Avoid duplicating the GDBM_BAD_AVAIL message.
	Add translator comments.
	* src/gdbmerrno.c: Add translator comments.
	* src/util.c: Likewise.

2021-01-02  Sergey Poznyakoff  <gray@gnu.org>

	Update copyright years

	Update copyright years

2020-12-24  Sergey Poznyakoff  <gray@gnu.org>

	Merge branch 'master' into newcache

	Fix the use of unprefixed dnl in configure.ac

2020-12-23  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.19

	Update the docs

	* doc/Makefile.am: Use gendocs.pl to generate web version of the
	manual.
	* doc/gdbm.texi: Update.
	* doc/gendocs.pl: New file.
	* doc/otherdoc.texi.in: New file.
	* doc/.gitignore: Ignore otherdoc.texi.
	* doc/webdoc.init: New file.
	* doc/gendocs.sh: Remove.
	* doc/gendocs_template: Remove.
	* doc/html.init: Remove.

2020-12-23  Sergey Poznyakoff  <gray@gnu.org.ua>

	Update copyright years

2020-12-23  Sergey Poznyakoff  <gray@gnu.org>

	Remove duplicate global declarations

	* src/gdbm_dump.c: Add missing I18N.
	* src/gdbm_load.c: Likewise.
	* src/parseopt.c (parseopt_program_doc)
	(parseopt_program_args): Remove duplicate declarations.

2020-10-31  Sergey Poznyakoff  <gray@gnu.org>

	Recover from ENOMEM in cache_lookup

	* src/bucket.c (cache_lookup): Try to recover from ENOMEM by freeing
	the least recently used cache entry.

2020-10-29  Sergey Poznyakoff  <gray@gnu.org>

	Minor changes.

	* src/bucket.c (_gdbm_cache_init): Minimum cache capacity is 1.
	* src/cachetree.c (_gdbm_cache_tree_lookup): Fix the description.
	(_gdbm_cache_tree_destroy): Speed up the tree traversal.
	* src/gdbmsetopt.c (setopt_gdbm_setcachesize): Don't enforce
	minimal cache capacity.

2020-10-09  Sergey Poznyakoff  <gray@gnu.org>

	Implement tagged structure initializers.

	* NEWS: Document changes.
	* doc/gdbm.texi: Document changes.
	* src/datconv.c (datum_scan_tag): Implement tagged structure
	initialization.
	* src/gdbmtool.c (kvlist_free): Made extern.
	(kvlist_find): New function.
	* src/gdbmtool.h (kvlist_find, kvlist_free)
	(dsegm_list_find): New protos.
	(dsegm_free_list): Rename to dsegm_list_free. All uses changed.
	* src/gram.y: Forbid duplicate tags in kvlist.

2020-10-08  Sergey Poznyakoff  <gray@gnu.org>

	Bugfixes.

	* doc/gdbm.texi: Fix the description of a sample content structure.
	* src/datconv.c (datum_scan_notag): Proceed to the next kvpair only
	for segments of the FDEF_FLD type.

2020-03-15  Sergey Poznyakoff  <gray@gnu.org>

	Implement the gdbm_bucket_count function.

	* src/gdbmcount.c (gdbm_bucket_count): New function.
	* src/gdbm.h.in (gdbm_bucket_count): New proto.
	* doc/gdbm.texi: Document gdbm_bucket_count.
	* src/gdbmtool.c (bucket_count): Reimplement via gdbm_bucket_count.

2020-01-27  Sergey Poznyakoff  <gray@gnu.org.ua>

	Update copyright years

	Minor changes

	* src/cachetree.c (_gdbm_node_set_elem): Remove function.
	* src/findkey.c: Finalize efaefe4c.

2019-11-16  Sergey Poznyakoff  <gray@gnu.org>

	Simplify memory allocation

	* src/gdbmdefs.h (cache_elem): Place one hash_bucket element at the
	end of the structure so it can be allocated along with it.
	* src/bucket.c (cache_elem_new): Allocate enough space for cache_elem
	and dbf->header->bucket_size hash bucket within.

2019-11-13  Sergey Poznyakoff  <gray@gnu.org.ua>

	Move cache element allocation to bucket.c.

	* src/bucket.c (_gdbm_cache_elem_new): Rename to cache_elem_new.
	Make static.
	(cache_lookup): Allocate new elem if _gdbm_cache_tree_lookup
	returned node_new.
	* src/cachetree.c (cache_tree): Remove dbf.
	(_gdbm_cache_tree_delete): Use node->adr.
	(cache_tree_lookup): Rename to _gdbm_cache_tree_lookup. Change
	signature. Return pointer to the (found or inserted) node. Don't
	allocate elem, this is responsibility of the caller.
	(_gdbm_cache_tree_alloc): Change signature.
	* src/gdbmdefs.h (cache_node): New definition (from cachetree.c)
	* src/proto.h: Fix protos.

	Namespace cleanup

	* src/proto.h (_gdbm_cache_tree_delete): Remove.
	(_gdbm_rbt_remove_node): Rename to _gdbm_cache_tree_delete.
	All uses changed

	Don't cache data pages

	* src/findkey.c (_gdbm_read_entry): Revert dc176a5c

2019-11-12  Sergey Poznyakoff  <gray@gnu.org>

	Rewrite bucket cache

	The new bucket cache uses the least recently used replacement
	policy (instead of the least recently read, implemented previously).
	It also allows for quick bucket lookups by the corresponding
	disk address. To this effect the cache entries form a red-black
	tree sorted by bucket address.

	Additionally, data buckets are also cached.

	* README: Describe the new branch.
	* src/bucket.c: Rewrite cache support.
	* src/cachetree.c: New file.
	* src/Makefile.am: Add new file.
	* src/findkey.c (_gdbm_read_entry): Use _gdbm_fetch_data.
	This ensures data pages are cached as well as buckets.
	* src/gdbm.h.in (GDBM_BUCKET_CACHE_CORRUPTED): New error code.
	(gdbm_cache_stat): New struct.
	(gdbm_get_cache_stats): New proto.
	* src/gdbmclose.c (gdbm_close): Call _gdbm_cache_free to dispose
	of the cache.
	* src/gdbmdefs.h (cache_elem_color): New data type.
	(cache_elem): New members: ca_left, ca_right, ca_node, and
	ca_hits.
	(cache_tree): New typedef.
	(gdbm_file_info): Remove bucket_cache and last_read.
	New fields: cache_num, cache_tree, cache_mru, cache_lru,
	cache_avail, cache_access_count.
	* src/gdbmerrno.c: Handle GDBM_BUCKET_CACHE_CORRUPTED.
	* src/gdbmopen.c (gdbm_fd_open): Change cache initialization.
	(_gdbm_init_cache, _gdbm_cache_entry_invalidate: Remove.
	* src/gdbmsetopt.c (setopt_gdbm_setcachesize): Cache can be
	re-initialized on the fly.
	* src/gdbmtool.c: Change bucket printing routines.
	* src/proto.h (_gdbm_read_bucket_at): Remove.
	(_gdbm_fetch_data,_gdbm_cache_init,_gdbm_cache_free)
	(_gdbm_cache_flush,_gdbm_cache_elem_new)
	(_gdbm_cache_tree_alloc,_gdbm_cache_tree_destroy)
	(_gdbm_cache_tree_delete,_gdbm_rbt_remove_node)
	(_gdbm_cache_tree_lookup): New protos.
	(_gdbm_init_cache,_gdbm_cache_entry_invalidate): Remove.
	* src/recover.c (_gdbm_finish_transfer): Adapt to the new
	cache structure.
	* src/update.c: Likewise.
	* tests/setopt00.at: Fix second GDBM_SETCACHESIZE test.

2019-10-29  Sergey Poznyakoff  <gray@gnu.org>

	Pre-read the memory mapped regions on systems that support it

	* src/mmap.c (GDBM_MMAP_FLAGS): Define to MAP_POPULATE or
	MAP_PREFAULT_READ, if available.
	(_gdbm_internal_remap): Use GDBM_MMAP_FLAGS.

	Minor changes

	* src/gdbmconst.h: Don't redefine SIZE_T_MAX
	* src/gdbmtool.c: Likewise.
	Include <termios.h>, instead of <sys/termios.h>
	* configure.ac: Don't check for termios.h
	* tests/closerr.c: Minor fixes.

2019-04-08  Sergey Poznyakoff  <gray@gnu.org>

	Update copyright years

	Preserve locking type during database reorganization

	* src/recover.c (_gdbm_finish_transfer): Preserve locking type.

2018-11-27  Sergey Poznyakoff  <gray@gnu.org>

	Fix typo in the manpage.

2018-10-27  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.18.1

2018-10-18  Sergey Poznyakoff  <gray@gnu.org>

	Restore backward compatibility with older databases

	* src/gdbmopen.c (validate_header): Silently accept databases with next_block
	pointing beyond end of file.

	Attempt recovery in case of invalid next_block header field

	* src/gdbmopen.c (validate_header): Return GDBM_NEED_RECOVERY
	if next_block is invalid.
	(_gdbm_validate_header): New function.
	(gdbm_fd_open): Set need_recovery depending on return from validate_header.
	(gdbm_open): Bail out on invalid value of GDBM_OPENMASK bits.
	* src/proto.h (_gdbm_validate_header): New proto.
	* src/recover.c (check_db): Re-validate the header.
	* src/gdbmtool.c (export_handler): Fix option processing.

2018-08-31  Sergey Poznyakoff  <gray@gnu.org>

	Various bugfixes.

	* compat/dbmopen.c (ndbm_open_dir_file0): Ignore ENOENT.
	* src/falloc.c (push_avail_block): Free temporary storage no matter
	what return status.
	* src/gdbm.h.in (GDBM_FILE_TRUNCATE_ERROR): New error code.
	* src/gdbmdump.c (_gdbm_dump_ascii): Initialize rc.
	* src/gdbmerrno.c: Handle new error.code
	* src/gdbmload.c (gdbm_load_bdb_dump): Initialize rc
	* src/gdbmopen.c (_gdbm_ftruncate): New function.
	(gdbm_fd_open): Use _gdbm_ftruncate. Check its return.
	* src/gdbmseq.c (gdbm_firstkey): Initialize dsize
	* src/gdbmtool.c (command_generator): Check if cmd is NULL.
	(shouldn't happen, but anyways).
	* src/mmap.c (_gdbm_mapped_lseek): Check for vailidity of the 'whence'
	parameter.
	* src/systems.h (TRUNCATE): Remove macro.
	* src/util.c (vgetyn): Remove unnecessary assignment.

2018-08-21  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.18

2018-08-19  Sergey Poznyakoff  <gray@gnu.org>

	Fix directory entry validation.

	Bug reported by Miroslav Lichvar and Marek Skalický

	* src/bucket.c (gdbm_dir_entry_valid_p): Fix lower limit for
	the allowed bucket address. Initial allocation of second block
	for the directory can be eventually returned to the available
	list when the directory is expanded during bucket splitting.

2018-08-12  Sergey Poznyakoff  <gray@gnu.org>

	Bugfix

	* src/gdbmdump.c (_gdbm_dump_ascii): Clear the GDBM_ITEM_NOT_FOUND error.
	* src/gdbmexp.c (gdbm_export_to_file): Likewise.
	* NEWS: Update.

2018-08-03  Sergey Poznyakoff  <gray@gnu.org>

	Bugfix

	* src/gdbmopen.c (gdbm_avail_table_valid_p): Fix improper use of
	the GDBM_DEBUG macro.

2018-07-31  Sergey Poznyakoff  <gray@gnu.org>

	Bugfix

	* src/gdbmsync.c (gdbm_sync): Always return a meaningful value

2018-07-30  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.17

2018-07-02  Sergey Poznyakoff  <gray@gnu.org>

	Bugfixes

	* src/recover.c (backup_name): Fix memory overwrite.
	* src/gdbmtool.c (recover_handler): New option "force".

2018-07-01  Sergey Poznyakoff  <gray@gnu.org>

	Change return value of gdbm_close and gdbm_sync

	* src/gdbm.h.in (gdbm_close, gdbm_sync): Return int
	(GDBM_FILE_CLOSE_ERROR, GDBM_FILE_SYNC_ERROR): New error codes.
	* src/gdbmclose.c (gdbm_close): Return 0 on success, -1 on failure.
	Set gdbm_errno and errno.
	* src/gdbmsync.c (gdbm_sync): Likewise.
	* src/gdbmerrno.c: Handle new error codes.
	* src/mmap.c (_gdbm_mapped_sync): Set gdbm_errno.
	* src/proto.h (gdbm_file_sync): Set gdbm_errno.

	* doc/gdbm.3: Document changes.
	* doc/gdbm.texi: Document changes.
	* NEWS: Document changes.
	* configure.ac: Set patchlevel.

	* tests/Makefile.am: Add new test.
	* tests/testsuite.at: Add new test.
	* tests/closerr.at: New test case.
	* tests/closerr.c: New test program.
	* tests/gtdel.c: Check gdbm_close return.
	* tests/gtdump.c: Likewise.
	* tests/gtfetch.c: Likewise.
	* tests/gtload.c: Likewise.
	* tests/gtopt.c: Likewise.
	* tests/gtrecover.c: Likewise.

2018-06-27  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.16

	Fix typo

	New gdbmtool variables: coalesce and centfree

	The two boolean variables control the use of free block coalescing and
	central free block modes in newly opened databases.

	Coalesce mode: take into account both left- and right-adjacent slots.

	* src/falloc.c (avail_lookup): Remove the start parameter.
	(avail_move): Take pointer to the count of entries in av_table.
	Update the pointed to value after performing the move.
	All uses changed.
	(_gdbm_put_av_elem): Rewrite the "can_merge" loop.

2018-06-25  Sergey Poznyakoff  <gray@gnu.org>

	Optimize operations on avail lists.

	Use binary search for look-ups.

	* src/falloc.c (avail_lookup, avail_move): New functions.
	(get_elem): Use avail_lookup to search.
	(_gdbm_put_av_elem): Use avail_lookup and avail_move to handle the
	avail table. In coalesce mode, store the index of the greater than
	or equal entry to avoid extra lookup in case no suitable entry is
	found.

2018-06-23  Sergey Poznyakoff  <gray@gnu.org>

	Bugfixes. Consistently use the coalesce_blocks flag.

	* src/bucket.c (_gdbm_split_bucket): Take into account coalesce_blocks
	* src/falloc.c (_gdbm_put_av_elem): Change to void return. All uses changed.
	* src/proto.h: Likewise.

	Fix the previous patch

	Silently restore sorting order of avail array when checking it.

	* src/gdbmdefs.h (gdbm_avail_table_valid_p): Remove const qualifier from
	the AV parameter.
	* src/gdbmopen.c (gdbm_avail_table_valid_p): Don't insist on proper
	ordering of the array. Restore it if neccessary.

	Maintain correct ordering of the avail table after coalescing.

	* src/falloc.c (_gdbm_put_av_elem): Float the merged entry to its
	proper position to preserve the sorting order.
	* THANKS: Thanks Adam Sampson

	Fix typo

2018-06-16  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.5

	* configure.ac: Version 1.5
	* NEWS: Update.
	* src/Makefile.am (VI_CURRENT): Increment to 6
	* src/bucket.c (_gdbm_get_bucket): Fix the upper limit for
	bucket_bits.
	* src/falloc.c (push_avail_block): Fill the allocated block
	with 0s.

2018-05-30  Sergey Poznyakoff  <gray@gnu.org>

	More error checking

	* src/bucket.c (_gdbm_get_bucket): Check if bucket_bits value is valid.
	* src/gdbmtool.c (_gdbm_print_avail_list): Reverse the sense of the
	conditional (fix regression).

	Avoid unnecessary memory reallocations during caching

	* src/findkey.c (_gdbm_read_entry): Reallocate cache_entry->ca_data.dptr only
	if necessary.
	* src/gdbmdefs.h (data_cache_elem): New member: dsize
	* src/gdbmdelete.c: Don't free cache_entry->ca_data.dptr
	* src/gdbmopen.c (_gdbm_init_cache): Initialize ca_data.dsize

	Rewrite gdbm_file_write etc. as inline functions.

	Fix the legacy operation (--disable-mmapped-io)

	* src/mmap.c (_gdbm_file_extend): Move to ...
	* src/fullio.c: ... here
	* src/proto.h (_gdbm_file_extend): New proto.
	* src/gdbmopen.c (gdbm_fd_open): Make sure the file size equals
	header->next_block.
	* src/gdbmsetopt.c [!HAVE_MMAP]: Don't disable GDBM_GETFLAGS.
	* src/update.c (_gdbm_end_update): Make sure disk file ends on
	header->next_block.

	Namespace cleanup

	Rename: __read   to  gdbm_file_read
	        __write  to  gdbm_file_write
	        __lseek  to  gdbm_file_seek
	        __fsync  to  gdbm_file_sync

	Drop debugging hooks

	The hooks were introduced as a temporary tool in de7834e9. They did
	their job and are not necessary any more.

	gdbmtool: bugfixes

	* src/gdbmtool.c (print_bucket_begin): Check return value from _gdbm_get_bucket.
	(source_handler): Don't gtry to push NULL stream.

	Fix memory leak in _gdbm_get_bucket

	Fix memory leaks in handling history (gdbmtool) and in gdbm_recover

2018-05-29  Sergey Poznyakoff  <gray@gnu.org>

	Minor changes

	* src/gdbmtool.c: Reduce memory consuption in -random mode. Some
	minor bugfixes as well.

2018-05-28  Sergey Poznyakoff  <gray@gnu.org>

	Improve num2word

	* tests/num2word.c: New options: -revert and -random

2018-05-27  Sergey Poznyakoff  <gray@gnu.org>

	Additional validation of avail_table.

	Verify that avail_table is sorted by size and that each element's
	size falls within allowed range.

	* src/bucket.c (gdbm_get_bucket): Fix bucket validation. Validate
	bucket_avail.
	(_gdbm_split_bucket): Check return from _gdbm_free.
	* src/falloc.c (adjust_bucket_avail,_gdbm_free): Return error code.
	All uses updated.
	(pop_avail_block): Fix eventual memory leak. Use gdbm_avail_block_validate.
	* src/gdbmdefs.h (gdbm_avail_table_valid_p): Change signature.
	* src/gdbmopen.c (gdbm_avail_table_valid_p): Traverse the array verifying
	address and size of each element.
	(gdbm_avail_block_validate)
	(gdbm_bucket_avail_table_validate): New functions.
	(validate_header): Remove call to gdbm_avail_block_valid_p. Avail_block
	is validated later, after it's been loaded.
	Bail out if header->next_block does not equal the file size.
	(gdbm_fd_open): Validate avail_block.
	* src/gdbmstore.c (_gdbm_store): Check return from _gdbm_free. Avoid
	endless loop in case of inconsistent h_table.
	* src/gdbmtool.c (_gdbm_print_avail_list): Use gdbm_avail_block_validate.
	* src/proto.h: Update.
	* tests/gtload.c: Improve error diagnostics.

2018-05-26  Sergey Poznyakoff  <gray@gnu.org>

	gdbmtool: quote special characters in command line input

2018-05-25  Sergey Poznyakoff  <gray@gnu.org>

	configure: emit a notice if --enable-gdbmtool-debug is used

	More database consistency checks

	* NEWS: Update.
	* THANKS: Update.
	* src/bucket.c (_gdbm_get_bucket): Check if directory entry is
	valid. Don't cache invalid buckets.
	* src/gdbm.h.in (GDBM_BAD_DIR_ENTRY): New error code.
	* src/gdbmerrno.c: Likewise.
	* src/gdbmopen.c (validate_header): Compute expected
	number of bucket elements based on the bucket size, not on
	the block size.
	(_gdbm_init_cache_entry): New function.
	* src/proto.h (_gdbm_init_cache_entry): New proto.
	* src/recover.c (gdbm_recover): Clear error state after return
	from check_db indicating failure.

2018-05-24  Sergey Poznyakoff  <gray@gnu.org>

	Various fixes

	* src/input-std.c: Bugfix
	* doc/gdbm.texi: Document changes.
	* README: Update.
	* configure.ac: New option --enable-gdbmtool-debug.
	* src/Makefile.am: Conditionally augment AM_YFLAGS and
	AM_LFLAGS with options that enable debugging.
	* src/gdbmtool.c: Conditionally enable --lex-trace and
	--gram-trace options.
	* src/gram.y: Likewise.
	* src/lex.l: Likewise.
	* tests/Makefile.am: Remove architecure-dependent tests.
	* tests/testsuite.at: Likewise.

	More input checking fixes

	* src/gdbmdefs.h (gdbm_avail_block_valid_p): Minimal capacity
	of an avail_block is 1 (one entry is stored in the block itself).
	* src/gdbmopen.c (gdbm_avail_table_valid_p): New function.
	(validate_header): Fix verification of dir_size and dir_bits.
	Verify avail.size.
	* src/falloc.c (pop_avail_block): Use gdbm_avail_table_valid_p
	* src/gdbmtool.c (_gdbm_print_avail_list): Likewise.

	Bugfix

	* tests/Makefile.am (EXTRA_DIST): Add missing file.

	More error checking; improve gdbm_recover

	* Makefile.am (set-dist-date): New rule
	(dist-hook): Catch FIXMEs in NEWS.
	* NEWS: Updated.
	* src/findkey.c (gdbm_bucket_element_valid_p): New function.
	(_gdbm_read_entry): Validate the retrieved bucket element.
	* src/gdbm.h.in (gdbm_recovery): New member: duplicate_keys.
	(GDBM_BAD_HASH_TABLE): New error code.
	* src/gdbmdefs.h (TYPE_WIDTH,SIGNED_TYPE_MAXIMUM)
	(OFF_T_MAX): New defines.
	(off_t_sum_ok): New function.
	(gdbm_bucket_element_valid_p): New prototype.
	* src/gdbmerrno.c: Support for GDBM_BAD_HASH_TABLE code.
	* src/gdbmtool.c (recover_handler): Fix argument counting.
	New argument 'summary' prints statistics summary at the end
	of the run.
	(export_handler,import_handler): Fix argument counting.
	* src/mmap.c (SUM_FILE_SIZE): Rewrite as inlined function.
	Add error checking.
	(_gdbm_mapped_remap): More error checking.
	* src/recover.c (run_recovery): Don't bail out on GDBM_CANNOT_REPLACE.
	(gdbm_recover): Initialize duplicate_keys
	* src/systems.h: Include limits.h

	Fix the use of return code from _gdbm_full_(read|write) functions

	error checking: check for avail_block consistency before using it

	* src/gdbmdefs.h (gdbm_avail_block_valid_p): New function.
	* src/gdbm.h.in (GDBM_BAD_AVAIL): New error code.
	* src/gdbmerrno.c: Support new error code.
	* src/falloc.c (pop_avail_block): Validate the avail_block
	* src/gdbmopen.c (validate_header): Validate the avail_block.
	* src/gdbmtool.c (_gdbm_avail_list_size)
	(_gdbm_print_avail_list): Validate the avail_block.

	Add new test

	gdbmtool: fix data conversion when storing structured content.

	* src/datconv.c (DEFNSCAN): Use proper target type to store in
	datum.
	(datum_scan_notag): Accept C-like initialization
	of array of characters by a quoted string.

2018-05-23  Sergey Poznyakoff  <gray@gnu.org>

	gdbmtool: accept commands from command line as well as from file

	Commands can be supplied to gdbmtool in three ways:

	 1. From a file, using the --file (-f) option:

	     gdbmtool -f comfile

	 2. From the command line, if first argument is the database name:

	     gdbmtool test.db count \; fetch mykey \; avail

	    Note the use of semicolon to delimit commands.

	 3. From the interactive shell, if neither of the above is used.

	* src/Makefile.am: Add new sources.
	* src/gdbmtool.c: Use new stream functions for input.
	* src/gdbmtool.h (setsource): Remove proto.
	(instream_t): New data type.
	(instream_name, instream_read)
	(instream_close, instream_interactive)
	(instream_eq): New functions.
	(instream_stdin_create)
	(instream_argv_create)
	(instream_file_create)
	(interactive, input_context_push): New protos.
	* src/gram.y: Accept ; in place of newline.
	* src/input-argv.c: New file.
	* src/input-file.c: New file.
	* src/input-rl.c: Rewrite to provide instream_t API.
	* src/input-std.c: Likewise.
	* src/lex.l: Rewrite.
	* tests/.gitignore: Update.
	* tests/Makefile.am: Add new tests. Incorporate
	DejaGNU tests.
	* tests/config/default.exp: New file.
	* tests/gdbmtool/base.exp: New file.
	* tests/gdbmtool00.at: New file.
	* tests/gdbmtool01.at: New file.
	* tests/gdbmtool02.at: New file.
	* tests/testsuite.at: Include new tests.

2018-05-19  Sergey Poznyakoff  <gray@gnu.org>

	Remove gdbm-1.8.3 compatibility layer

	* configure.ac: Remove gdbm-1.8.3 compatibility layer.
	Version 1.14.90
	* Makefile.am (ACLOCAL_AMFLAGS): Remove deprecated variable.
	(MAYBE_EXPORT): Remove variable and conditional.
	* NEWS: Update.
	* NOTE-WARNING: Update.
	* README: Update.
	* doc/gdbm.texi: Update.
	* export/.gitignore: Remove.
	* export/Makefile.am: Remove.
	* export/export.c: Remove.

	Catch more errors

	* src/gdbmdump.c (_gdbm_dump_ascii): Break on errors
	* src/gdbmopen.c (compute_directory_size): Remove unused argument.
	(validate_header): Catch dir_size and dir_bits mismatches.
	* src/mmap.c (_gdbm_mapped_lseek): Bail out on negative offsets.
	* tests/dump03.at: New test.
	* tests/dump04.at: New test.
	* tests/Makefile.am: Add new tests.
	* tests/testsuite.at: Add new tests.

	Add new tests

	* src/gdbm_dump.c: Fix exit code.
	* configure.ac: Determine presence of gzip and base64
	(GZIP_BIN,BASE64_BIN): New variables.
	* tests/atlocal.in (GZIP_BIN,BASE64_BIN): New variables.
	* tests/dump00.at: New file.
	* tests/dump01.at: New file.
	* tests/dump02.at: New file.
	* tests/Makefile.am: Add new tests.
	* tests/testsuite.at: Add new tests.

	Improve error checking

	* src/bucket.c (_gdbm_get_bucket): Improve validation.
	* src/fullio.c (_gdbm_full_read,_gdbm_full_write): Don't overwrite
	an already set error.
	* src/gdbm.h.in (GDBM_WRONG_OFF_T): Merge with GDBM_BAD_FILE_OFFSET.
	(GDBM_BAD_HEADER): New error code.
	* src/gdbmdump.c (_gdbm_dump_ascii): Check for database error code.
	* src/gdbmerrno.c (gdbm_errlist): Add GDBM_BAD_HEADER
	* src/gdbmopen.c (validate_header: Imporve logic.
	(_gdbm_init_cache): Initialize bucket_cache
	* src/gdbmseq.c (gdbm_firstkey): Check return value
	from _gdbm_get_bucket.
	* src/mmap.c (_gdbm_mapped_remap): Bail out if current position is bigger
	than file size.

	Fix typo

2018-05-16  Sergey Poznyakoff  <gray@gnu.org>

	Improve database file safety checks.

	* src/bucket.c (_gdbm_get_bucket): Verify bucket consistency.
	* src/gdbm.h.in (GDBM_BAD_BUCKET, GDBM_WRONG_ARCH): New error
	codes.
	* src/gdbmerrno.c (gdbm_errlist): New error codes.
	* src/gdbmopen.c (gdbm_fd_open): Improve header consistency checks.

2018-01-03  Sergey Poznyakoff  <gray@gnu.org>

	Bump library current version number

2018-01-01  Sergey Poznyakoff  <gray@gnu.org>

	Version 1.14

