summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-12-25 15:59:16 +0000
committer <>2015-02-03 11:29:43 +0000
commit5919c67c0cc46fea1ad0f884c04d7ea8a463fce7 (patch)
tree860f08eda66df9272df23fe4ba0f79e26560ea88 /doc
downloadgdbm-tarball-5919c67c0cc46fea1ad0f884c04d7ea8a463fce7.tar.gz
Imported from /home/lorry/working-area/delta_gdbm-tarball/gdbm-1.11.tar.gz.HEADgdbm-1.11master
Diffstat (limited to 'doc')
-rw-r--r--doc/Makefile.am83
-rw-r--r--doc/Makefile.in967
-rw-r--r--doc/fdl.texi507
-rw-r--r--doc/gdbm.3469
-rw-r--r--doc/gdbm.info3013
-rw-r--r--doc/gdbm.texinfo2567
-rw-r--r--doc/gdbm_dump.188
-rw-r--r--doc/gdbm_load.1108
-rw-r--r--doc/gdbmtool.1443
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/version.texi4
11 files changed, 8253 insertions, 0 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..223c892
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,83 @@
+# This file is part of GDBM. -*- Makefile -*-
+# Copyright (C) 2007, 2011 Free Software Foundation, Inc.
+#
+# GDBM is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GDBM is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+
+# Documentation
+
+info_TEXINFOS = gdbm.texinfo
+gdbm_TEXINFOS=\
+ fdl.texi
+
+man_MANS = gdbm.3 gdbm_dump.1 gdbm_load.1 gdbmtool.1
+EXTRA_DIST = $(man_MANS)
+
+GENDOCS=gendocs.sh
+
+TEXI2DVI=texi2dvi -E
+
+# Make sure you set TEXINPUTS.
+# TEXINPUTS=/usr/share/texmf/pdftex/plain/misc/ is ok for most distributions
+.PHONY: manual
+manual:
+ TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \
+ MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ TEXI2DVI="$(TEXI2DVI) -t @finalout" \
+ $(GENDOCS) --texi2html $(PACKAGE) '$(PACKAGE_NAME) manual'
+
+# Checking
+check-tabs:
+ @if test -n "`cat $(info_TEXINFOS) $(gdbm_TEXINFOS) | tr -d -c '\t'`"; then \
+ echo "Sources contain tabs; run make untabify"; \
+ false; \
+ fi
+
+check-sentence-spacing:
+ @if grep -q '\. [@A-Z]' $(info_TEXINFOS) $(gdbm_TEXINFOS); then \
+ echo >&2 "Sources contain single-space sentence separators"; \
+ echo >&2 "Run make fix-sentence-spacing to fix"; \
+ fi
+
+check-fixmes:
+ @for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \
+ do \
+ sed -e = $$file | \
+ sed -n 'N;/@c *FIXME:/{s/\(^[0-9][0-9]*\).*@c *FIXME:\(.*\)/'$$file':\1: \2/gp}'; \
+ done > $@-t; \
+ if [ -s $@-t ]; then \
+ echo "Unresolved FIXMEs:"; \
+ cat $@-t; \
+ rm $@-t; \
+ false; \
+ else \
+ rm -f $@-t; \
+ fi
+
+check-format: check-tabs check-sentence-spacing
+
+check-docs: check-format check-fixmes
+
+untabify:
+ emacs -batch -l untabify.el $(info_TEXINFOS) $(gdbm_TEXINFOS)
+
+fix-sentence-spacing:
+ for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \
+ do \
+ if grep -q '\. [@A-Z]' $$file; then \
+ mv $$file $${file}~; \
+ sed -r 's/\. ([@A-Z])/. \1/g' $${file}~ > $$file; \
+ fi; \
+ done
+
+final: untabify fix-sentence-spacing \ No newline at end of file
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..c121eb0
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,967 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# This file is part of GDBM. -*- Makefile -*-
+# Copyright (C) 2007, 2011 Free Software Foundation, Inc.
+#
+# GDBM is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GDBM is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+
+# Documentation
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(gdbm_TEXINFOS) $(top_srcdir)/build-aux/mdate-sh \
+ $(srcdir)/version.texi $(srcdir)/stamp-vti \
+ $(top_srcdir)/build-aux/texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
+am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
+am__v_DVIPS_0 = @echo " DVIPS " $@;
+am__v_DVIPS_1 =
+AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@)
+am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@)
+am__v_MAKEINFO_0 = @echo " MAKEINFO" $@;
+am__v_MAKEINFO_1 =
+AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@)
+am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@)
+am__v_INFOHTML_0 = @echo " INFOHTML" $@;
+am__v_INFOHTML_1 =
+AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@)
+am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@)
+am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@;
+am__v_TEXI2DVI_1 =
+AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@)
+am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@)
+am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@;
+am__v_TEXI2PDF_1 =
+AM_V_texinfo = $(am__v_texinfo_@AM_V@)
+am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@)
+am__v_texinfo_0 = -q
+am__v_texinfo_1 =
+AM_V_texidevnull = $(am__v_texidevnull_@AM_V@)
+am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
+am__v_texidevnull_0 = > /dev/null
+am__v_texidevnull_1 =
+INFO_DEPS = $(srcdir)/gdbm.info
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
+DVIS = gdbm.dvi
+PDFS = gdbm.pdf
+PSS = gdbm.ps
+HTMLS = gdbm.html
+TEXINFOS = gdbm.texinfo
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \
+ "$(DESTDIR)$(man3dir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOM4TE = @AUTOM4TE@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GDBM183_INCLUDEDIR = @GDBM183_INCLUDEDIR@
+GDBM183_LIBDIR = @GDBM183_LIBDIR@
+GDBM183_LIBRARY = @GDBM183_LIBRARY@
+GDBM_COUNT_T = @GDBM_COUNT_T@
+GDBM_VERSION_MAJOR = @GDBM_VERSION_MAJOR@
+GDBM_VERSION_MINOR = @GDBM_VERSION_MINOR@
+GDBM_VERSION_PATCH = @GDBM_VERSION_PATCH@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+info_TEXINFOS = gdbm.texinfo
+gdbm_TEXINFOS = \
+ fdl.texi
+
+man_MANS = gdbm.3 gdbm_dump.1 gdbm_load.1 gdbmtool.1
+EXTRA_DIST = $(man_MANS)
+GENDOCS = gendocs.sh
+TEXI2DVI = texi2dvi -E
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texinfo
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnits doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+.texinfo.info:
+ $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ $(am__cd) $(srcdir); \
+ else \
+ rc=$$?; \
+ $(am__cd) $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texinfo.dvi:
+ $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \
+ $<
+
+.texinfo.pdf:
+ $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \
+ $<
+
+.texinfo.html:
+ $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp)
+ $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@ && mv $(@:.html=.htp) $@; \
+ else \
+ rm -rf $(@:.html=.htp); exit 1; \
+ fi
+$(srcdir)/gdbm.info: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS)
+gdbm.dvi: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS)
+gdbm.pdf: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS)
+gdbm.html: gdbm.texinfo $(srcdir)/version.texi $(gdbm_TEXINFOS)
+$(srcdir)/version.texi: $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: gdbm.texinfo $(top_srcdir)/configure
+ @(dir=.; test -f ./gdbm.texinfo || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/gdbm.texinfo`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+ $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) $(AM_V_texinfo) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+ done
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+uninstall-pdf-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(psdir)/$$f"; \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+ if test -f $$file; then \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f "$(distdir)/$$relfile" || \
+ cp -p $$file "$(distdir)/$$relfile"; \
+ else :; fi; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf gdbm.t2d gdbm.t2p
+
+clean-aminfo:
+ -test -z "gdbm.dvi gdbm.pdf gdbm.ps gdbm.html" \
+ || rm -rf gdbm.dvi gdbm.pdf gdbm.ps gdbm.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-man3: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man3dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.3[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man3:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man3dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.3[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+ done
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ $(am__strip_dir) \
+ d2=$$d$$p; \
+ if test -d "$$d2"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+ else \
+ list2="$$list2 $$d2"; \
+ fi; \
+ done; \
+ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+ done; }
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
+ fi; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ echo "$$ifile"; \
+ else : ; fi; \
+ done; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+ @$(POST_INSTALL)
+ @if $(am__can_run_installinfo); then \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man: install-man1 install-man3
+
+install-pdf: install-pdf-am
+
+install-pdf-am: $(PDFS)
+ @$(NORMAL_INSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-man uninstall-pdf-am uninstall-ps-am
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
+ clean-libtool cscopelist-am ctags-am dist-info distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-man1 install-man3 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-vti pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-dvi-am uninstall-html-am \
+ uninstall-info-am uninstall-man uninstall-man1 uninstall-man3 \
+ uninstall-pdf-am uninstall-ps-am
+
+
+# Make sure you set TEXINPUTS.
+# TEXINPUTS=/usr/share/texmf/pdftex/plain/misc/ is ok for most distributions
+.PHONY: manual
+manual:
+ TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \
+ MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ TEXI2DVI="$(TEXI2DVI) -t @finalout" \
+ $(GENDOCS) --texi2html $(PACKAGE) '$(PACKAGE_NAME) manual'
+
+# Checking
+check-tabs:
+ @if test -n "`cat $(info_TEXINFOS) $(gdbm_TEXINFOS) | tr -d -c '\t'`"; then \
+ echo "Sources contain tabs; run make untabify"; \
+ false; \
+ fi
+
+check-sentence-spacing:
+ @if grep -q '\. [@A-Z]' $(info_TEXINFOS) $(gdbm_TEXINFOS); then \
+ echo >&2 "Sources contain single-space sentence separators"; \
+ echo >&2 "Run make fix-sentence-spacing to fix"; \
+ fi
+
+check-fixmes:
+ @for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \
+ do \
+ sed -e = $$file | \
+ sed -n 'N;/@c *FIXME:/{s/\(^[0-9][0-9]*\).*@c *FIXME:\(.*\)/'$$file':\1: \2/gp}'; \
+ done > $@-t; \
+ if [ -s $@-t ]; then \
+ echo "Unresolved FIXMEs:"; \
+ cat $@-t; \
+ rm $@-t; \
+ false; \
+ else \
+ rm -f $@-t; \
+ fi
+
+check-format: check-tabs check-sentence-spacing
+
+check-docs: check-format check-fixmes
+
+untabify:
+ emacs -batch -l untabify.el $(info_TEXINFOS) $(gdbm_TEXINFOS)
+
+fix-sentence-spacing:
+ for file in $(info_TEXINFOS) $(gdbm_TEXINFOS); \
+ do \
+ if grep -q '\. [@A-Z]' $$file; then \
+ mv $$file $${file}~; \
+ sed -r 's/\. ([@A-Z])/. \1/g' $${file}~ > $$file; \
+ fi; \
+ done
+
+final: untabify fix-sentence-spacing
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..20fe23a
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,507 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008, 2011 Free Software
+Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/doc/gdbm.3 b/doc/gdbm.3
new file mode 100644
index 0000000..c08ece3
--- /dev/null
+++ b/doc/gdbm.3
@@ -0,0 +1,469 @@
+.\" This file is part of GDBM.
+.\" Copyright (C) 2011, 2013 Free Software Foundation, Inc.
+.\"
+.\" GDBM is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 3, or (at your option)
+.\" any later version.
+.\"
+.\" GDBM is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+.TH GDBM 3 "May 8, 2013" "GDBM" "GDBM User Reference"
+.SH NAME
+GDBM \- The GNU database manager. Includes \fBdbm\fR and \fBndbm\fR
+compatibility.
+.SH SYNOPSIS
+.nf
+.B #include <gdbm.h>
+.sp
+.BI "extern gdbm_error" " gdbm_errno";
+.br
+.BI "extern char *" gdbm_version ;
+.br
+.BI "GDBM_FILE gdbm_open (const char *" name ", int " block_size ", "
+.ti +21
+.BI "int " flags ", int " mode ", "
+.ti +21
+.BI "void (*" fatal_func ")(const char *))";
+.br
+.BI "void gdbm_close (GDBM_FILE " dbf ");"
+.br
+.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag );
+.br
+.BI "datum gdbm_fetch (GDBM_FILE " dbf ", datum " key );
+.br
+.BI "int gdbm_delete (GDBM_FILE " dbf ", datum " key );
+.br
+.BI "datum gdbm_firstkey (GDBM_FILE " dbf ");"
+.br
+.BI "datum gdbm_nextkey (GDBM_FILE " dbf ", datum " key );
+.br
+.BI "int gdbm_reorganize (GDBM_FILE " dbf ");"
+.br
+.BI "void gdbm_sync (GDBM_FILE " dbf ");"
+.br
+.BI "int gdbm_exists (GDBM_FILE " dbf ", datum " key );
+.br
+.BI "const char *gdbm_strerror (gdbm_error " errno );
+.br
+.BI "int gdbm_setopt (GDBM_FILE " dbf ", int " option ", int " value ", int " size );
+.br
+.BI "int gdbm_fdesc (GDBM_FILE " dbf );
+.br
+.PP
+.SS DBM Compatability routines:
+.PP
+.B #include <dbm.h>
+.sp
+.BI "int dbminit (const char *" name ");"
+.br
+.BI "int store (datum " key ", datum " content );
+.br
+.BI "datum fetch (datum " key );
+.br
+.BI "int delete (datum " key );
+.br
+.BI "datum firstkey (void);"
+.br
+.BI "datum nextkey (datum " key );
+.br
+.BI "int dbmclose (void);"
+.PP
+.SS NDBM Compatability routines:
+.PP
+.B #include <ndbm.h>
+.sp
+.BI "DBM *dbm_open (const char *" name ", int " flags ", int " mode );
+.br
+.BI "void dbm_close (DBM *" file );
+.BI datum dbm_fetch (DBM *" file ", datum " key );
+.br
+.BI "int dbm_store (DBM *" file ", datum " key ", datum " content ", int " flags );
+.br
+.BI "int dbm_delete (DBM *" file ", datum " key );
+.br
+.BI "datum dbm_firstkey (DBM *" file );
+.br
+.BI "datum dbm_nextkey (DBM *" file ", datum " key );
+.br
+.BI "int dbm_error (DBM *" file );
+.br
+.BI "int dbm_clearerr (DBM *" file );
+.br
+.BI "int dbm_pagfno (DBM *" file );
+.br
+.BI "int dbm_dirfno (DBM *" file );
+.br
+.BI "int dbm_rdonly (DBM *" file );
+.SH DESCRIPTION
+\fBGNU dbm\fR is a library of routines that manages data files that contain
+key/data pairs. The access provided is that of storing,
+retrieval, and deletion by key and a non-sorted traversal of all
+keys. A process is allowed to use multiple data files at the
+same time.
+
+This manpage is a short description of the \fBGDBM\fR library.
+For a detailed discussion, including examples of the configuration and
+usage recommendations, refer to the \fBGDBM Manual\fR available in
+Texinfo format. To access it, run:
+
+ \fBinfo gdbm\fR
+
+Should any discrepancies occur between this manpage and the
+\fBGDBM Manual\fR, the later shall be considered the authoritative
+source.
+
+A process that opens a gdbm file is designated as a "reader" or a
+"writer". Only one writer may open a gdbm file and many readers may
+open the file. Readers and writers can not open the gdbm file at the
+same time. The procedure for opening a gdbm file is:
+
+.BI "GDBM_FILE gdbm_open (const char *" name ", int " block_size ", "
+.ti +21
+.BI "int " flags ", int " mode ", "
+.ti +21
+.BI "void (*" fatal_func ")(const char *))";
+
+\fIName\fR is the name of the file (the complete name,
+gdbm does not append any characters to this name). \fIBlock_size\fR is
+the size of a single transfer from disk to memory. This parameter is
+ignored unless the file is a new file. The minimum size is 512. If
+it is less than 512, dbm will use the stat block size for the file system.
+\fIRead_write\fR can have one of the following values:
+.TP
+.B GDBM_READER
+reader
+.TP
+.B GDBM_WRITER
+writer
+.TP
+.B GDBM_WRCREAT
+writer - if database does not exist create new one
+.TP
+.B GDBM_NEWDB
+writer - create new database regardless if one exists
+.PP
+The \fBGDBM_NOMMAP\fR added to \fIread_write\fR by bitwise or instructs
+\fBgdbm_open\fR to disable the use of
+.BR mmap (2).
+.PP
+For the last three (writers of the database) the following may be added
+added to \fIread_write\fR by bitwise or:
+.TP
+.B GDBM_SYNC
+Causes all database operations to be synchronized to the disk,
+.TP
+.B GDBM_NOLOCK
+Pevents the library from performing any locking on the database file.
+.PP
+The option
+.B GDBM_FAST
+is now obsolete, since gdbm defaults to no-sync mode.
+.PP
+\fIMode\fR is the file mode (see \fBchmod(2)\fR and \fBopen(2)\fR) if the
+file is created. \fI(*Fatal_func) ()\fR is a function for dbm to call
+if it detects a fatal error. The only parameter of this function is a string.
+If the value of 0 is provided, \fBgdbm\fR will use a default function.
+
+The return value is the pointer needed by all other routines to
+access that gdbm file. If the return is the NULL pointer, \fBgdbm_open\fR
+was not successful. The errors can be found in \fIgdbm_errno\fR for gdbm
+errors and in \fIerrno\fR for system errors. (For error codes, see
+gdbmerrno.h.)
+
+In all of the following calls, the parameter \fIdbf\fR refers to the pointer
+returned from \fBgdbm_open\fR.
+
+It is important that every file opened is also closed. This is needed to
+update the reader/writer count on the file. This is done by:
+
+.BI "void gdbm_close (GDBM_FILE " dbf ");"
+
+The database is used by 3 primary routines. The first stores data in the
+database.
+
+.BI "int gdbm_store (GDBM_FILE " dbf ", datum " key ", datum " content ", int " flag );
+
+\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the
+key data. \fIContent\fR is the data to be associated with the \fIkey\fR.
+\fIFlag\fR can have one of the following values:
+.TP
+.B GDBM_INSERT
+Insert only, generate an error if key exists;
+.TP
+.B GDBM_REPLACE
+Replace contents if key exists.
+.PP
+If a reader calls \fBgdbm_store\fR, the return value will be \-1.
+If called with \fBGDBM_INSERT\fR and \fIkey\fR is in the database, the return
+value will be 1. Otherwise, the return value is 0.
+
+\fINOTICE: If you store data for a key that is already in the data base,
+\fBgdbm\fI replaces the old data with the new data if called with \fBGDBM_REPLACE\fI.
+You do not get two data items for the same key and you do not get an
+error from \fBgdbm_store\fI.
+
+NOTICE: The size in \fBgdbm\fI is not restricted like in \fBdbm\fI or \fBndbm\fI. Your data
+can be as large as you want.\fR
+
+To search for some data, use:
+
+.BI "datum gdbm_fetch (GDBM_FILE " dbf ", datum " key );
+
+\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is
+the key data.
+
+If the \fIdptr\fR element of the return value is NULL, no data was
+found. Otherwise the return value is a pointer to the found data.
+The storage space for the \fIdptr\fR element is allocated using
+\fBmalloc(3)\fR. \fBGdbm\fI does not automatically free this data.
+It is the programmer's responsibility to free this storage when it is
+no longer needed.
+
+To search for some data, without retrieving it:
+
+.BI "int gdbm_exists (GDBM_FILE " dbf ", datum " key );
+
+\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is
+the key data to search for.
+
+If the \fIkey\fR is found within the database, the return value
+will be true. If nothing appropiate is found, false is returned.
+This routine is useful for checking for the existence of a record,
+without performing the memory allocation done by \fBgdbm_fetch\fR.
+.PP
+To remove some data from the database:
+
+.BI "int gdbm_delete (GDBM_FILE " dbf ", datum " key );
+
+\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the
+key data.
+
+The return value is \-1 if the item is not present or the requester is a reader.
+The return value is 0 if there was a successful delete.
+
+The next two routines allow for accessing all items in the database. This
+access is not key sequential, but it is guaranteed to visit every key in
+the database once. (The order has to do with the hash values.)
+
+.BI "datum gdbm_firstkey (GDBM_FILE " dbf ");"
+.br
+.BI "datum gdbm_nextkey (GDBM_FILE " dbf ", datum " key );
+
+\fIDbf\fR is the pointer returned by \fBgdbm_open\fR. \fIKey\fR is the
+key data.
+
+The return values are both of type \fBdatum\fR. If the \fIdptr\fR
+element of the return value is NULL, there is no first key or next key.
+Again notice that \fIdptr\fR points to data allocated by \fBmalloc(3)\fR
+and \fBgdbm\fR will not free it for you.
+
+These functions were intended to visit the database in read-only algorithms,
+for instance, to validate the database or similar operations.
+
+File `visiting' is based on a `hash table'. \fIgdbm_delete\fR re-arranges the
+hash table to make sure that any collisions in the table do not leave some item
+`un-findable'. The original key order is NOT guaranteed to remain unchanged in
+ALL instances. It is possible that some key will not be visited if a loop like
+the following is executed:
+.sp
+.nf
+.in +5
+key = gdbm_firstkey (dbf);
+while (key.dptr)
+ {
+ nextkey = gdbm_nextkey (dbf, key);
+ if (some condition)
+ gdbm_delete ( dbf, key );
+ free (key.dptr);
+ key = nextkey;
+ }
+.in
+.fi
+.PP
+The following routine should be used very infrequently.
+
+.BI "int gdbm_reorganize (GDBM_FILE " dbf ");"
+
+If you have had a lot of deletions and would like to shrink the space
+used by the \fBgdbm\fR file, this routine will reorganize the database.
+\fBGdbm\fR will not shorten the length of a \fBgdbm\fR file except by
+using this reorganization. (Deleted file space will be reused.)
+
+Unless your database was opened with the \fBGDBM_SYNC\fR flag, \fBgdbm\fR does not
+wait for writes to be flushed to the disk before continuing.
+The following routine can be used to guarantee that the database is
+physically written to the disk file.
+
+.BI "void gdbm_sync (GDBM_FILE " dbf ");"
+
+It will not return until the disk file state is syncronized with the
+in-memory state of the database.
+
+To convert a \fBgdbm\fR error code into English text, use this routine:
+
+.BI "const char *gdbm_strerror (gdbm_error " errno );
+
+\fBGdbm\fR now supports the ability to set certain options on an
+already open database.
+
+.BI "int gdbm_setopt (GDBM_FILE " dbf ", int " option ", int " value ", int " size );
+
+Where \fIdbf\fR is the return value from a previous call to \fBgdbm_open\fR,
+and \fIoption\fR specifies which option to set. The valid options are
+currently:
+.TP
+.B GDBM_CACHESIZE
+Set the size of the internal bucket cache. This option may only be set once
+on each \fIGDBM_FILE\fR descriptor, and is set automatically to 100 upon the
+first access to the database.
+.TP
+.B GDBM_FASTMODE
+ Set \fBfast mode\fR to either on or off. This allows \fBfast mode\fR to
+be toggled on an already open and active database. \fIvalue\fR (see below)
+should be set to either TRUE or FALSE. \fIThis option is now obsolete.\fR
+.TP
+.B GDBM_SYNCMODE
+Turn on or off file system synchronization operations. This setting defaults
+to off; \fIvalue\fR (see below) should be set to either TRUE or FALSE.
+.TP
+.B GDBM_CENTFREE
+Set \fBcentral free block pool\fR to either on or off.
+The default is off, which is how previous versions of \fBGdbm\fR
+handled free blocks. If set, this option causes all subsequent free
+blocks to be placed in the \fBglobal\fR pool, allowing (in thoery)
+more file space to be reused more quickly. \fIvalue\fR (see below) should
+be set to either TRUE or FALSE.
+\fINOTICE: This feature is still under study.\fR
+.TP
+.B GDBM_COALESCEBLKS
+Set \fBfree block merging\fR to either on or off.
+The default is off, which is how previous versions of \fBGdbm\fR
+handled free blocks. If set, this option causes adjacent free blocks
+to be merged. This can become a CPU expensive process with time, though,
+especially if used in conjunction with \fBGDBM_CENTFREE\fR. \fIvalue\fR
+(see below) should be set to either TRUE or FALSE.
+\fINOTICE: This feature is still under study.\fR
+.PP
+\fIvalue\fR is the value to set \fIoption\fR to, specified as an integer
+pointer. \fIsize\fR is the size of the data pointed to by \fIvalue\fR.
+The return value will be \-1 upon failure, or 0 upon success. The global
+variable \fIgdbm_errno\fR will be set upon failure.
+
+For instance, to set a database to use a cache of 10, after opening it
+with \fBgdbm_open\fR, but prior to accessing it in any way, the following
+code could be used:
+.sp
+.nf
+.in +5
+int value = 10;
+
+ret = gdbm_setopt( dbf, GDBM_CACHESIZE, &value, sizeof(int));
+.in
+.fi
+.PP
+If the database was opened with the \fBGDBM_NOLOCK\fR flag, the user may
+wish to perform their own file locking on the database file in order to
+prevent multiple writers operating on the same file simultaneously.
+
+In order to support this, the \fIgdbm_fdesc\fR routine is provided.
+
+.BI "int gdbm_fdesc (GDBM_FILE " dbf );
+
+Where \fIdbf\fR is the return value from a previous call to \fBgdbm_open\fR.
+The return value will be the file descriptor of the database.
+
+The following two external variables may be useful:
+
+\fIgdbm_errno\fR is the variable that contains more information about
+gdbm errors. (gdbm.h has the definitions of the error values and
+defines gdbm_errno as an external variable.)
+
+\fIgdbm_version\fR is the string containing the version information.
+
+There are a few more things of interest. First, \fBgdbm\fR files are
+not "sparse". You can copy them with the UNIX \fBcp(1)\fR command and
+they will not expand in the copying process. Also, there is a
+compatibility mode for use with programs that already use UNIX
+\fBdbm\fR. In this compatibility mode, no \fRgdbm\fR file pointer is
+required by the programmer, and only one file may be opened at a time.
+All users in compatibility mode are assumed to be writers. If the
+\fBgdbm\fR file is a read only, it will fail as a writer, but will
+also try to open it as a reader. All returned pointers in datum
+structures point to data that \fBgdbm\fR WILL free. They should be
+treated as static pointers (as standard UNIX \fBdbm\fR does).
+.SH LINKING
+This library is accessed by specifying \fI\-lgdbm\fR as the last
+parameter to the compile line, e.g.:
+.sp
+.nf
+.in +5
+gcc \-o prog prog.c \-lgdbm
+.in
+.fi
+.PP
+If you wish to use the \fBdbm\fR or \fBndbm\fR compatibility routines,
+you must link in the \fIgdbm_compat\fR library as well. For example:
+.sp
+.nf
+.in +5
+gcc \-o prog proc.c \-lgdbm \-lgdbm_compat
+.in
+.fi
+.\" .SH BUGS
+
+.SH "BUG REPORTS"
+Send bug reports to <bug\-gdbm@gnu.org>.
+.SH "SEE ALSO"
+.BR gdbm_dump (1),
+.BR gdbm_load (1),
+.BR gdbmtool (1).
+.SH AUTHORS
+by Philip A. Nelson, Jason Downs and Sergey Poznyakoff.
+.SH COPYRIGHT
+Copyright \(co 1990 - 2011 Free Software Foundation, Inc.
+
+GDBM is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GDBM is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GDBM. If not, see <http://gnu.org/licenses/gpl.html>
+.SH CONTACTS
+You may contact the original author by:
+.br
+ e-mail: phil@cs.wwu.edu
+.br
+ us-mail: Philip A. Nelson
+.br
+Computer Science Department
+.br
+Western Washington University
+.br
+Bellingham, WA 98226
+
+You may contact the current maintainers by:
+.br
+ e-mail: downsj@downsj.com
+.br
+and
+ e-mail: gray@gnu.org
+
+.\" Local variables:
+.\" eval: (add-hook 'write-file-hooks 'time-stamp)
+.\" time-stamp-start: ".TH GDBM 3 \""
+.\" time-stamp-format: "%:B %:d, %:y"
+.\" time-stamp-end: "\""
+.\" time-stamp-line-limit: 20
+.\" end:
diff --git a/doc/gdbm.info b/doc/gdbm.info
new file mode 100644
index 0000000..4e086e6
--- /dev/null
+++ b/doc/gdbm.info
@@ -0,0 +1,3013 @@
+This is gdbm.info, produced by makeinfo version 4.13 from gdbm.texinfo.
+
+INFO-DIR-SECTION Programming & development tools
+START-INFO-DIR-ENTRY
+* GDBM: (gdbm). The GNU database manager.
+* gdbm_dump: gdbm_dump(gdbm). Dump the GDBM database into a flat file.
+* gdbm_load: gdbm_load(gdbm). Load the database from a flat file.
+END-INFO-DIR-ENTRY
+
+ Published by the Free Software Foundation, 51 Franklin Street, Fifth
+Floor Boston, MA 02110-1301, USA
+
+ Copyright (C) 1989-1999, 2007-2011 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover, and no Back-Cover texts. A copy of
+the license is included in the section entitled "GNU Free Documentation
+License."
+
+
+File: gdbm.info, Node: Top, Next: Copying, Up: (dir)
+
+The GNU database manager.
+*************************
+
+GNU `dbm' is a library of functions implementing a hashed database on a
+disk file. This manual documents GNU `dbm' Version 1.11 (`gdbm'). The
+software was originally written by Philip A. Nelson. This document
+was originally written by Pierre Gaumond from texts written by Phil.
+
+* Menu:
+
+Introduction:
+
+* Copying:: Your rights.
+* Intro:: Introduction to GNU dbm.
+* List:: List of functions.
+
+Functions:
+
+* Open:: Opening the database.
+* Close:: Closing the database.
+* Count:: Counting records in the database.
+* Store:: Inserting and replacing records in the database.
+* Fetch:: Searching records in the database.
+* Delete:: Removing records from the database.
+* Sequential:: Sequential access to records.
+* Reorganization:: Database reorganization.
+* Sync:: Insure all writes to disk have competed.
+* Flat files:: Export and import to Flat file format.
+* Errors:: Convert internal error codes into English.
+* Options:: Setting internal options.
+* Locking:: File locking.
+
+* Error codes:: Error codes returned by `gdbm' calls.
+* Variables:: Two useful variables.
+* Compatibility:: Compatibility with UNIX dbm and ndbm.
+
+Programs
+
+* gdbmtool:: Examine and modify a GDBM database.
+* gdbm_dump:: Dump the database into a flat file.
+* gdbm_load:: Load the database from a flat file.
+* gdbmexport:: Export a database into a portable format.
+* Exit codes:: Exit codes returned by GDBM utilities.
+
+Other topics:
+
+* Bugs:: Problems and bugs.
+* Resources:: Additional resources,
+
+* GNU Free Documentation License:: Document license.
+* Index:: Index
+
+
+File: gdbm.info, Node: Copying, Next: Intro, Prev: Top, Up: Top
+
+1 Copying Conditions.
+*********************
+
+This library is "free"; this means that everyone is free to use it and
+free to redistribute it on a free basis. GNU `dbm' (`gdbm') is not in
+the public domain; it is copyrighted and there are restrictions on its
+distribution, but these restrictions are designed to permit everything
+that a good cooperating citizen would want to do. What is not allowed
+is to try to prevent others from further sharing any version of `gdbm'
+that they might get from you.
+
+ Specifically, we want to make sure that you have the right to give
+away copies `gdbm', that you receive source code or else can get it if
+you want it, that you can change these functions or use pieces of them
+in new free programs, and that you know you can do these things.
+
+ To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies `gdbm', you must give the recipients all the rights that you
+have. You must make sure that they, too, receive or can get the source
+code. And you must tell them their rights.
+
+ Also, for our own protection, we must make certain that everyone
+finds out that there is no warranty for anything in the `gdbm'
+distribution. If these functions are modified by someone else and
+passed on, we want their recipients to know that what they have is not
+what we distributed, so that any problems introduced by others will not
+reflect on our reputation.
+
+ `Gdbm' is currently distributed under the terms of the GNU General
+Public License, Version 3. (_NOT_ under the GNU General Library Public
+License.) A copy the GNU General Public License is included with the
+distribution of `gdbm'.
+
+
+File: gdbm.info, Node: Intro, Next: List, Prev: Copying, Up: Top
+
+2 Introduction to GNU `dbm'.
+****************************
+
+GNU `dbm' (`gdbm') is a library of database functions that use
+extensible hashing and works similar to the standard UNIX `dbm'
+functions. These routines are provided to a programmer needing to
+create and manipulate a hashed database. (`gdbm' is _NOT_ a complete
+database package for an end user.)
+
+ The basic use of `gdbm' is to store key/data pairs in a data file.
+Each key must be unique and each key is paired with only one data item.
+The keys can not be directly accessed in sorted order. The basic unit
+of data in `gdbm' is the structure:
+
+ typedef struct {
+ char *dptr;
+ int dsize;
+ } datum;
+
+ This structure allows for arbitrary sized keys and data items.
+
+ The key/data pairs are stored in a `gdbm' disk file, called a `gdbm'
+database. An application must open a `gdbm' database to be able
+manipulate the keys and data contained in the database. `gdbm' allows
+an application to have multiple databases open at the same time. When
+an application opens a `gdbm' database, it is designated as a `reader'
+or a `writer'. A `gdbm' database can be opened by at most one writer
+at a time. However, many readers may open the database simultaneously.
+Readers and writers can not open the `gdbm' database at the same time.
+
+
+File: gdbm.info, Node: List, Next: Open, Prev: Intro, Up: Top
+
+3 List of functions.
+********************
+
+The following is a quick list of the functions contained in the `gdbm'
+library. The include file `gdbm.h', that can be included by the user,
+contains a definition of these functions.
+
+ #include <gdbm.h>
+
+ GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func);
+ void gdbm_close(dbf);
+ int gdbm_store(dbf, key, content, flag);
+ datum gdbm_fetch(dbf, key);
+ int gdbm_delete(dbf, key);
+ datum gdbm_firstkey(dbf);
+ datum gdbm_nextkey(dbf, key);
+ int gdbm_reorganize(dbf);
+ void gdbm_sync(dbf);
+ int gdbm_exists(dbf, key);
+ char *gdbm_strerror(errno);
+ int gdbm_setopt(dbf, option, value, size);
+ int gdbm_fdesc(dbf);
+ int gdbm_export (GDBM_FILE, const char *, int, int);
+ int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp);
+ int gdbm_import (GDBM_FILE, const char *, int);
+ int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag);
+ int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount);
+ int gdbm_version_cmp (int const a[], int const b[]);
+
+ The `gdbm.h' include file is often in the `/usr/local/include'
+directory. (The actual location of `gdbm.h' depends on your local
+installation of `gdbm'.)
+
+
+File: gdbm.info, Node: Open, Next: Close, Prev: List, Up: Top
+
+4 Opening the database.
+***********************
+
+ -- gdbm interface: GDBM_FILE gdbm_open (const char *NAME, int
+ BLOCK_SIZE, int FLAGS, int MODE, void (*fatal_func)(const
+ char *))
+ Initializes `gdbm' system. If the file has a size of zero bytes,
+ a file initialization procedure is performed, setting up the
+ initial structure in the file.
+
+ The arguments are:
+
+ NAME
+ The name of the file (the complete name, `gdbm' does not
+ append any characters to this name).
+
+ BLOCK_SIZE
+ It is used during initialization to determine the size of
+ various constructs. It is the size of a single transfer from
+ disk to memory. This parameter is ignored if the file has
+ been previously initialized. The minimum size is 512. If
+ the value is less than 512, the file system block size is
+ used, otherwise the value of BLOCK_SIZE is used.
+
+ FLAGS
+ If `flags' is set to `GDBM_READER', the user wants to just
+ read the database and any call to `gdbm_store' or
+ `gdbm_delete' will fail. Many readers can access the
+ database at the same time. If `flags' is set to
+ `GDBM_WRITER', the user wants both read and write access to
+ the database and requires exclusive access. If `flags' is set
+ to `GDBM_WRCREAT', the user wants both read and write access
+ to the database and wants it created if it does not already
+ exist. If `flags' is set to `GDBM_NEWDB', the user want a
+ new database created, regardless of whether one existed, and
+ wants read and write access to the new database.
+
+ The following may also be logically or'd into the database
+ flags: `GDBM_SYNC', which causes all database operations to be
+ synchronized to the disk, `GDBM_NOLOCK', which prevents the
+ library from performing any locking on the database file, and
+ `GDBM_NOMMAP', which disables the memory mapping mechanism.
+ The option `GDBM_FAST' is now obsolete, since `gdbm' defaults
+ to no-sync mode.
+
+ If the host `open' call (*note open: (open(2))open.)
+ supports the `O_CLOEXEC' flag, the `GDBM_CLOEXEC' can be or'd
+ into the flags, to enable the close-on-exec flag for the
+ database file descriptor.
+
+ MODE
+ File mode (see *note change permissions of a file:
+ (chmod(2))chmod, and *note open a file: (open(2))open.),
+ which is used if the file is created).
+
+ FATAL_FUNC
+ A function for `gdbm' to call if it detects a fatal error.
+ The only parameter of this function is a string. If the
+ value of `NULL' is provided, `gdbm' will use a default
+ function.
+
+ The return value, is the pointer needed by all other functions to
+ access that `gdbm' file. If the return is the `NULL' pointer,
+ `gdbm_open' was not successful. The errors can be found in
+ `gdbm_errno' variable (*note gdbm_errno: Variables.). Available
+ error codes are discussed in *note Error codes::.
+
+ In all of the following calls, the parameter DBF refers to the
+ pointer returned from `gdbm_open'.
+
+
+File: gdbm.info, Node: Close, Next: Count, Prev: Open, Up: Top
+
+5 Closing the database.
+***********************
+
+It is important that every file opened is also closed. This is needed
+to update the reader/writer count on the file:
+
+ -- gdbm interface: void gdbm_close (GDBM_FILE DBF)
+ This function closes the `gdbm' file and frees all memory
+ associated with it. The parameter is:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+
+File: gdbm.info, Node: Count, Next: Store, Prev: Close, Up: Top
+
+6 Number of Records
+*******************
+
+ -- gdbm interface: int gdbm_count (GDBM_FILE DBF, gdbm_count_t *PCOUNT)
+ Counts number of records in the database DBF. On success, stores
+ it in the memory location pointed to by PCOUNT and return 0. On
+ error, sets `gdbm_errno' (if relevant, also `errno') and returns
+ -1.
+
+
+File: gdbm.info, Node: Store, Next: Fetch, Prev: Count, Up: Top
+
+7 Inserting and replacing records in the database.
+**************************************************
+
+ -- gdbm interface: int gdbm_store (GDBM_FILE DBF, datum KEY, datum
+ CONTENT, int FLAG)
+ The function `gdbm_store' inserts or replaces records in the
+ database.
+
+ The parameters are:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ KEY
+ The search key.
+
+ CONTENT
+ The data to be associated with the key.
+
+ FLAG
+ Defines the action to take when the key is already in the
+ database. The value `GDBM_REPLACE' (defined in `gdbm.h')
+ asks that the old data be replaced by the new CONTENT. The
+ value `GDBM_INSERT' asks that an error be returned and no
+ action taken if the KEY already exists.
+
+ This function can return the following values:
+
+ -1
+ The item was not stored in the database because the caller
+ was not an official writer or either KEY or CONTENT have a
+ `NULL' `dptr' field.
+
+ Both KEY and CONTENT must have the `dptr' field be a
+ non-`NULL' value. Since a `NULL' `dptr' field is used by
+ other functions to indicate an error, it cannot be valid data.
+
+ +1
+ The item was not stored because the argument FLAG was
+ `GDBM_INSERT' and the KEY was already in the database.
+
+ 0
+ No error. The value of CONTENT is keyed by KEY. The file on
+ disk is updated to reflect the structure of the new database
+ before returning from this function.
+
+If you store data for a KEY that is already in the data base, `gdbm'
+replaces the old data with the new data if called with `GDBM_REPLACE'.
+You do not get two data items for the same `key' and you do not get an
+error from `gdbm_store'.
+
+ The size in `gdbm' is not restricted like `dbm' or `ndbm'. Your
+data can be as large as you want.
+
+
+File: gdbm.info, Node: Fetch, Next: Delete, Prev: Store, Up: Top
+
+8 Searching for records in the database.
+****************************************
+
+ -- gdbm interface: datum gdbm_fetch (GDBM_FILE DBF, datum KEY)
+ Looks up a given KEY and returns the information associated with
+ it. The `dptr' field in the structure that is returned points to a
+ memory block allocated by `malloc'. It is the caller's
+ responsibility to free it when no longer needed.
+
+ If the `dptr' is `NULL', no data was found.
+
+ The parameters are:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ KEY
+ The search key.
+
+An example of using this function:
+
+ content = gdbm_fetch (dbf, key);
+ if (content.dptr == NULL)
+ {
+ fprintf(stderr, "key not found\n");
+ }
+ else
+ {
+ /* do something with content.dptr */
+ }
+
+ You may also search for a particular key without retrieving it:
+
+ -- gdbm interface: int gdbm_exists (GDBM_FILE DBF, datum KEY)
+ Returns `true' (`1') if the KEY exists in DBF and `false' (`0')
+ otherwise.
+
+ The parameters are:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ KEY
+ The search key.
+
+
+File: gdbm.info, Node: Delete, Next: Sequential, Prev: Fetch, Up: Top
+
+9 Removing records from the database.
+*************************************
+
+To remove some data from the database, use the `gdbm_delete' function.
+
+ -- gdbm interface: int gdbm_delete (GDBM_FILE DBF, datum KEY)
+ Deletes the data associated with the given KEY, if it exists in
+ the database DBF. The file on disk is updated to reflect the
+ structure of the new database before returning from this function.
+
+ The parameters are:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ DATUM KEY
+ The search key.
+
+ The function returns `-1' if the item is not present or the
+ requester is a reader. The return of `0' marks a successful
+ delete.
+
+
+File: gdbm.info, Node: Sequential, Next: Reorganization, Prev: Delete, Up: Top
+
+10 Sequential access to records.
+********************************
+
+The next two functions allow for accessing all items in the database.
+This access is not `key' sequential, but it is guaranteed to visit every
+`key' in the database once. The order has to do with the hash values.
+`gdbm_firstkey' starts the visit of all keys in the database.
+`gdbm_nextkey' finds and reads the next entry in the hash structure for
+`dbf'.
+
+ -- gdbm interface: datum gdbm_firstkey (GDBM_FILE DBF)
+ Initiate sequential access to the database DBF. The returned
+ value is the first key accessed in the database. If the `dptr'
+ field in the returned datum is `NULL', the database contains no
+ data.
+
+ Otherwise, `dptr' points to a memory block obtained from `malloc',
+ which holds the key value. The caller is responsible for freeing
+ this memory block when no longer needed.
+
+ -- gdbm interface: datum gdbm_nextkey (GDBM_FILE DBF, datum PREV)
+ This function continues the iteration over the keys in DBF,
+ initiated by `gdbm_firstkey'. The parameter PREV holds the value
+ returned from a previous call to `gdbm_nextkey' or `gdbm_firstkey'.
+
+ The function returns next key from the database. If the `dptr'
+ field in the returned datum is `NULL', all keys in the database
+ has been visited.
+
+ Otherwise, `dptr' points to a memory block obtained from `malloc',
+ which holds the key value. The caller is responsible for freeing
+ this memory block when no longer needed.
+
+ These functions were intended to visit the database in read-only
+algorithms, for instance, to validate the database or similar
+operations. The usual algorithm for sequential access is:
+
+ key = gdbm_firstkey (dbf);
+ while (key.dptr)
+ {
+ datum nextkey;
+
+ /* do something with the key */
+ ...
+
+ /* Obtain the next key */
+ nextkey = gdbm_nextkey (dbf, key);
+ /* Reclaim the memory used by the key */
+ free (key.dptr);
+ /* Use nextkey in the next iteration. */
+ key = nextkey;
+ }
+
+ Care should be taken when the `gdbm_delete' function is used in such
+a loop. File visiting is based on a "hash table". The `gdbm_delete'
+function re-arranges the hash table to make sure that any collisions in
+the table do not leave some item "un-findable". The original key order
+is _not_ guaranteed to remain unchanged in all instances. So it is
+possible that some key will not be visited if a loop like the following
+is executed:
+
+ key = gdbm_firstkey (dbf);
+ while (key.dptr)
+ {
+ datum nextkey;
+ if (some condition)
+ {
+ gdbm_delete (dbf, key);
+ }
+ nextkey = gdbm_nextkey (dbf, key);
+ free (key.dptr);
+ key = nextkey;
+ }
+
+
+File: gdbm.info, Node: Reorganization, Next: Sync, Prev: Sequential, Up: Top
+
+11 Database reorganization.
+***************************
+
+The following function should be used very seldom.
+
+ -- gdbm interface: int gdbm_reorganize (GDBM_FILE DBF)
+ Reorganizes the database.
+
+ The parameter is:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ If you have had a lot of deletions and would like to shrink the space
+used by the `gdbm' file, this function will reorganize the database.
+This results, in particular, in shortening the length of a `gdbm' file
+by removing the space occupied by deleted records.
+
+ This reorganization requires creating a new file and inserting all
+the elements in the old file DBF into the new file. The new file is
+then renamed to the same name as the old file and DBF is updated to
+contain all the correct information about the new file. If an error is
+detected, the return value is negative. The value zero is returned
+after a successful reorganization.
+
+
+File: gdbm.info, Node: Sync, Next: Flat files, Prev: Reorganization, Up: Top
+
+12 Database Synchronization
+***************************
+
+Unless your database was opened with the `GDBM_SYNC' flag, `gdbm' does
+not wait for writes to be flushed to the disk before continuing. This
+allows for faster writing of databases at the risk of having a
+corrupted database if the application terminates in an abnormal
+fashion. The following function allows the programmer to make sure the
+disk version of the database has been completely updated with all
+changes to the current time.
+
+ -- gdbm interface: void gdbm_sync (GDBM_FILE DBF)
+ Synchronizes the changes in DBF with its disk file. The parameter
+ is a pointer returned by `gdbm_open'.
+
+ This function would usually be called after a complete set of
+ changes have been made to the database and before some long
+ waiting time. The `gdbm_close' function automatically calls the
+ equivalent of `gdbm_sync' so no call is needed if the database is
+ to be closed immediately after the set of changes have been made.
+
+
+File: gdbm.info, Node: Flat files, Next: Errors, Prev: Sync, Up: Top
+
+13 Export and Import
+********************
+
+`Gdbm' databases can be converted into so-called "flat format" files.
+Such files cannot be used for searching, their sole purpose is to keep
+the data from the database for restoring it when the need arrives.
+There are two flat file formats, which differ in the way they represent
+the data and in the amount of meta-information stored. Both formats
+can be used, for example, to migrate between the different versions of
+`gdbm' databases. Generally speaking, flat files are safe to send over
+the network, and can be used to recreate the database on another
+machine. The recreated database is guaranteed to be a byte-to-byte
+equivalent of the database from which the flat file was created. This
+does not necessarily mean, however, that this file can be used in the
+same way as the original one. For example, if the original database
+contained non-ASCII data (e.g. C structures, integers etc.), the
+recreated database can be of any use only if the target machine has the
+same integer size and byte ordering as the source one and if its C
+compiler uses the same packing conventions as the one which generated C
+which populated the original database. In general, such binary
+databases are not portable between machines, unless you follow some
+stringent rules on what data is written to them and how it is
+interpreted.
+
+ The GDBM version 1.11 supports two flat file formats. The "binary"
+flat file format was first implemented in GDBM version 1.9.1. This
+format stores only key/data pairs, it does not keep information about
+the database file itself. As its name implies, files in this format
+are binary files.
+
+ The "ascii" flat file format encodes all data in base64 and stores
+not only key/data pairs, but also the original database file metadata,
+such as file name, mode and ownership. Files in this format can be
+sent without additional encapsulation over transmission channels that
+normally allow only ASCII data, such as, e.g. SMTP. Due to additional
+metadata they allow for restoring an exact copy of the database,
+including file ownership and privileges, which is especially important
+if the database in question contained some security-related data.
+
+ We call a process of creating a flat file from a database
+"exporting" or "dumping" this database. The reverse process, creating
+the database from a flat file is called "importing" or "loading" the
+database.
+
+ -- gdbm interface: int gdbm_dump (GDBM_FILE DBF, const char *FILENAME,
+ int FORMAT, int OPEN_FLAGS, int MODE)
+ Dumps the database file to the named file in requested format.
+ Arguments are:
+
+ DBF
+ A pointer to the source database, returned by a prior call to
+ `gdbm_open'.
+
+ FILENAME
+ Name of the dump file.
+
+ FORMAT
+ Output file format. Allowed values are:
+ `GDBM_DUMP_FMT_BINARY' to create a binary dump and
+ `GDBM_DUMP_FMT_ASCII' to create an ASCII dump file.
+
+ OPEN_FLAGS
+ How to create the output file. If FLAG is `GDBM_WRCREAT' the
+ file will be created if it does not exist. If it does exist,
+ the `gdbm_dump' will fail.
+
+ If FLAG is `GDBM_NEWDB', the function will create a new
+ output file, replacing it if it already exists.
+
+ MODE
+ The permissions to use when creating the output file. See
+ *note open a file: (open(2))open, for a detailed discussion.
+
+ -- gdbm interface: int gdbm_load (GDBM_FILE *PDBF, const char
+ *FILENAME, int FLAG, int META_MASK, unsigned long *ERRLINE)
+ Loads data from the dump file FILENAME into the database pointed
+ to by PDBF. The latter can point to `NULL', in which case the
+ function will try to create a new database. If it succeeds, the
+ function will return, in the memory location pointed to by PDBF, a
+ pointer to the newly created database. If the dump file carries no
+ information about the original database file name, the function
+ will set `gdbm_errno' to `GDBM_NO_DBNAME' and return `-1',
+ indicating failure.
+
+ The FLAG has the same meaning as the FLAG argument to the
+ `gdbm_store' function (*note Store::).
+
+ The META_MASK argument can be used to disable restoring certain
+ bits of file's meta-data from the information in the input dump
+ file. It is a binary OR of zero or more of the following:
+
+ GDBM_META_MASK_MODE
+ Do not restore file mode.
+
+ GDBM_META_MASK_OWNER
+ Do not restore file owner.
+
+ The function returns 0 upon successful completion or -1 on fatal
+ errors and 1 on mild (non-fatal) errors.
+
+ If a fatal error occurs, `gdbm_errno' will be set to one of the
+ following values:
+
+ GDBM_FILE_OPEN_ERROR
+ Input file (FILENAME) cannot be opened. The `errno' variable
+ can be used to get more detail about the failure.
+
+ GDBM_MALLOC_ERROR
+ Not enough memory to load data.
+
+ GDBM_FILE_READ_ERROR
+ Reading from FILENAME failed. The `errno' variable can be
+ used to get more detail about the failure.
+
+ GDBM_ILLEGAL_DATA
+ Input contained some illegal data.
+
+ GDBM_ITEM_NOT_FOUND
+ This error can occur only when the input file is in ASCII
+ format. It indicates that the data part of the record about
+ to be read lacked length specification. Application
+ developers are advised to treat this error equally as
+ `GDBM_ILLEGAL_DATA'.
+
+ Mild errors mean that the function was able to successfully load
+ and restore the data, but was unable to change database file
+ metadata afterward. The table below lists possible values for
+ `gdbm_errno' in this case. To get more detail, inspect the system
+ `errno' variable.
+
+ GDBM_ERR_FILE_OWNER
+ The function was unable to restore database file owner.
+
+ GDBM_ERR_FILE_MODE
+ The function was unable to restore database file mode
+ (permission bits).
+
+ If an error occurs while loading data from an input file in ASCII
+ format, the number of line in which the error occurred will be
+ stored in the location pointed to by the ERRLINE parameter, unless
+ it is `NULL'.
+
+ If the line information is not available or applicable, ERRLINE
+ will be set to `0'.
+
+ -- gdbm interface: int gdbm_dump_to_file (GDBM_FILE DBF, FILE *FP, int
+ FORMAT)
+ This is an alternative entry point to `gdbm_dump' (which see).
+ Arguments are:
+
+ DBF
+ A pointer to the source database, returned by a call to
+ `gdbm_open'.
+
+ FP
+ File to write the data to.
+
+ FORMAT
+ Format of the dump file. See the FORMAT argument to the
+ `gdbm_dump' function.
+
+ -- gdbm interface: int gdbm_load_from_file (GDBM_FILE *PDBF, FILE *FP,
+ int REPLACE, int META_MASK, unsigned long *LINE)
+ This is an alternative entry point to `gdbm_dump'. It writes the
+ output to FP which must be a file open for writing. The rest of
+ arguments is the same as for `gdbm_load' (excepting of course
+ FLAG, which is not needed in this case).
+
+ -- gdbm interface: int gdbm_export (GDBM_FILE DBF, const char
+ *EXPORTFILE, int FLAG, int MODE)
+ This function is retained for compatibility with GDBM 1.10 and
+ earlier. It dumps the database to a file in binary dump format and
+ is entirely equivalent to
+
+ gdbm_dump(DBF, EXPORTFILE, GDBM_DUMP_FMT_BINARY,
+ FLAG, MODE)
+
+
+ -- gdbm interface: int gdbm_export_to_file (GDBM_FILE DBF, FILE *FP)
+ This is an alternative entry point to `gdbm_export'. This
+ function writes to file FP a binary dump of the database DBF.
+
+ -- gdbm interface: int gdbm_import (GDBM_FILE DBF, const char
+ *IMPORTFILE, int FLAG)
+ This function is retained for compatibility with GDBM 1.10 and
+ earlier. It loads the file IMPORTFILE, which must be a binary
+ flat file, into the database DBF and is equivalent to the
+ following construct:
+
+ DBF = gdbm_open (IMPORTFILE, 0,
+ FLAG == GDBM_REPLACE ?
+ GDBM_WRCREAT : GDBM_NEWDB,
+ 0600, NULL);
+ gdbm_load (&DBF, EXPORTFILE, 0, FLAG, NULL)
+
+ -- gdbm interface: int gdbm_import_from_file (GDBM_FILE DBF, FILE *FP,
+ int FLAG)
+ An alternative entry point to `gdbm_import'. Reads the binary
+ dump from the file FP and stores the key/value pairs to DBF.
+ *Note Store::, for a description of FLAG.
+
+ This function is equivalent to:
+
+ DBF = gdbm_open (IMPORTFILE, 0,
+ FLAG == GDBM_REPLACE ?
+ GDBM_WRCREAT : GDBM_NEWDB,
+ 0600, NULL);
+ gdbm_load_from_file (DBF, FP, FLAG, 0, NULL);
+
+
+File: gdbm.info, Node: Errors, Next: Options, Prev: Flat files, Up: Top
+
+14 Error strings.
+*****************
+
+To convert a `gdbm' error code into English text, use this routine:
+
+ -- gdbm interface: const char * gdbm_strerror (gdbm_error ERRNO)
+ Converts ERRNO (which is an integer value) into a human-readable
+ descriptive text. Returns a pointer to a static string. The
+ caller must not alter or free the returned pointer.
+
+ The ERRNO argument is usually the value of the global variable
+ `gdbm_errno'. *Note gdbm_errno: Variables.
+
+
+File: gdbm.info, Node: Options, Next: Locking, Prev: Errors, Up: Top
+
+15 Setting options
+******************
+
+`Gdbm' supports the ability to set certain options on an already open
+database.
+
+ -- gdbm interface: int gdbm_setopt (GDBM_FILE DBF, int OPTION, void
+ *VALUE, int SIZE)
+ Sets an option on the database or returns the value of an option.
+
+ The parameters are:
+
+ DBF
+ The pointer returned by `gdbm_open'.
+
+ OPTION
+ The option to be set or retrieved.
+
+ VALUE
+ A pointer to the value to which OPTION will be set or where to
+ place the option value (depending on the option).
+
+ SIZE
+ The length of the data pointed to by VALUE.
+
+ The valid options are:
+
+GDBM_SETCACHESIZE
+GDBM_CACHESIZE
+ Set the size of the internal bucket cache. This option may only be
+ set once on each GDBM_FILE descriptor, and is set automatically to
+ 100 upon the first access to the database. The VALUE should point
+ to a `size_t' holding the desired cache size.
+
+ The `GDBM_CACHESIZE' option is provided for compatibility with
+ earlier versions.
+
+GDBM_GETCACHESIZE
+ Return the size of the internal bucket cache. The VALUE should
+ point to a `size_t' variable, where the size will be stored.
+
+GDBM_GETFLAGS
+ Return the flags describing the state of the database. The VALUE
+ should point to a `int' variable where to store the flags. The
+ return is the same as the flags used when opening the database
+ (*note gdbm_open: Open.), except that it reflects the current
+ state (which may have been altered by another calls to
+ `gdbm_setopt'.
+
+GDBM_FASTMODE
+ Enable or disable the "fast writes mode", i.e. writes without
+ subsequent synchronization. The VALUE should point to an integer:
+ `TRUE' to enable fast mode, and `FALSE' to disable it.
+
+ This option is retained for compatibility with previous versions of
+ `gdbm'. Its effect is the reverse of `GDBM_SETSYNCMODE' (see
+ below).
+
+GDBM_SETSYNCMODE
+GDBM_SYNCMODE
+ Turn on or off file system synchronization operations. This
+ setting defaults to off. The VALUE should point to an integer:
+ `TRUE' to turn synchronization on, and `FALSE' to turn it off.
+
+ Note, that this option is a reverse of `GDBM_FASTMODE', i.e.
+ calling `GDBM_SETSYNCMODE' with `TRUE' has the same effect as
+ calling `GDBM_FASTMODE' with `FALSE'.
+
+ The `GDBM_SYNCMODE' option is provided for compatibility with
+ earlier versions.
+
+GDBM_GETSYNCMODE
+ Return the current synchronization status. The VALUE should point
+ to an `int' where the status will be stored.
+
+GDBM_SETCENTFREE
+GDBM_CENTFREE
+ _NOTICE: This feature is still under study._
+
+ Set central free block pool to either on or off. The default is
+ off, which is how previous versions of `gdbm' handled free blocks.
+ If set, this option causes all subsequent free blocks to be placed
+ in the _global_ pool, allowing (in theory) more file space to be
+ reused more quickly. The VALUE should point to an integer: `TRUE'
+ to turn central block pool on, and `FALSE' to turn it off.
+
+ The `GDBM_CENTFREE' option is provided for compatibility with
+ earlier versions.
+
+GDBM_SETCOALESCEBLKS
+GDBM_COALESCEBLKS
+ _NOTICE: This feature is still under study._
+
+ Set free block merging to either on or off. The default is off,
+ which is how previous versions of `gdbm' handled free blocks. If
+ set, this option causes adjacent free blocks to be merged. This
+ can become a CPU expensive process with time, though, especially if
+ used in conjunction with GDBM_CENTFREE. The VALUE should point to
+ an integer: `TRUE' to turn free block merging on, and `FALSE' to
+ turn it off.
+
+GDBM_GETCOALESCEBLKS
+ Return the current status of free block merging. The VALUE should
+ point to an `int' where the status will be stored.
+
+GDBM_SETMAXMAPSIZE
+ Sets maximum size of a memory mapped region. The VALUE should
+ point to a value of type `size_t', `unsigned long' or `unsigned'.
+ The actual value is rounded to the nearest page boundary (the page
+ size is obtained from `sysconf(_SC_PAGESIZE)').
+
+GDBM_GETMAXMAPSIZE
+ Return the maximum size of a memory mapped region. The VALUE
+ should point to a value of type `size_t' where to return the data.
+
+GDBM_SETMMAP
+ Enable or disable memory mapping mode. The VALUE should point to
+ an integer: `TRUE' to enable memory mapping or `FALSE' to disable
+ it.
+
+GDBM_GETMMAP
+ Check whether memory mapping is enabled. The VALUE should point
+ to an integer where to return the status.
+
+GDBM_GETDBNAME
+ Return the name of the database disk file. The VALUE should point
+ to a variable of type `char**'. A pointer to the newly allocated
+ copy of the file name will be placed there. The caller is
+ responsible for freeing this memory when no longer needed. For
+ example:
+
+ char *name;
+
+ if (gdbm_setopt (dbf, GDBM_GETDBNAME, &name, sizeof (name)))
+ {
+ fprintf (stderr, "gdbm_setopt failed: %s\n",
+ gdbm_strerror (gdbm_errno));
+ }
+ else
+ {
+ printf ("database name: %s\n", name);
+ free (name);
+ }
+
+
+ The return value will be `-1' upon failure, or `0' upon success.
+The global variable `gdbm_errno' will be set upon failure.
+
+ For instance, to set a database to use a cache of 10, after opening
+it with `gdbm_open', but prior to accessing it in any way, the following
+code could be used:
+
+ int value = 10;
+ ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int));
+
+
+File: gdbm.info, Node: Locking, Next: Error codes, Prev: Options, Up: Top
+
+16 File Locking.
+****************
+
+With locking disabled (if `gdbm_open' was called with `GDBM_NOLOCK'),
+the user may want to perform their own file locking on the database file
+in order to prevent multiple writers operating on the same file
+simultaneously.
+
+ In order to support this, the `gdbm_fdesc' routine is provided.
+
+ -- gdbm interface: int gdbm_fdesc (GDBM_FILE DBF)
+ Returns the file descriptor of the database DBF. This value can
+ be used as an argument to `flock', `lockf' or similar calls.
+
+
+File: gdbm.info, Node: Variables, Next: Compatibility, Prev: Error codes, Up: Top
+
+17 Useful global variables.
+***************************
+
+The following global variables and constants are available:
+
+ -- Variable: gdbm_error gdbm_errno
+ This variable contains error code from the last failed `gdbm'
+ call. *Note Error codes::, for a list of available error codes and
+ their descriptions.
+
+ Use `gdbm_strerror' (*note Errors::) to convert it to a
+ descriptive text.
+
+ -- Variable: const char * gdbm_errlist[]
+ This variable is an array of error descriptions, which is used by
+ `gdbm_strerror' to convert error codes to human-readable text
+ (*note Errors::). You can access it directly, if you wish so. It
+ contains `_GDBM_MAX_ERRNO + 1' elements and can be directly
+ indexed by the error code to obtain a corresponding descriptive
+ text.
+
+ -- Constant: _GDBM_MIN_ERRNO
+ The minimum error code used by `gdbm'.
+
+ -- Constant: _GDBM_MAX_ERRNO
+ The maximum error code used by `gdbm'.
+
+ -- Variable: const char * gdbm_version
+ A string containing the version information.
+
+ -- Variable: int const gdbm_version_number[3]
+ This variable contains the `gdbm' version numbers:
+
+ Index Meaning
+ ---------------------------------------------------------------
+ 0 Major number
+ 1 Minor number
+ 2 Patchlevel number
+
+ Additionally, the following constants are defined in the `gdbm.h'
+ file:
+
+ GDBM_VERSION_MAJOR
+ Major number.
+
+ GDBM_VERSION_MINOR
+ Minor number.
+
+ GDBM_VERSION_PATCH
+ Patchlevel number.
+
+ These can be used to verify whether the header file matches the
+ library.
+
+ To compare two split-out version numbers, use the following function:
+
+ -- gdbm interface: int gdbm_version_cmp (int const A[3], int const
+ B[3])
+ Compare two version numbers. Return `-1' if A is less than B, `1'
+ if A is greater than B and `0' if they are equal.
+
+ Comparison is done from left to right, so that:
+
+ a = { 1, 8, 3 };
+ b = { 1, 8, 3 };
+ gdbm_version_cmp (a, b) => 0
+
+ a = { 1, 8, 3 };
+ b = { 1, 8, 2 };
+ gdbm_version_cmp (a, b) => 1
+
+ a = { 1, 8, 3 };
+ b = { 1, 9. 0 };
+ gdbm_version_cmp (a, b) => -1
+
+
+File: gdbm.info, Node: Error codes, Next: Variables, Prev: Locking, Up: Top
+
+18 Error codes
+**************
+
+This chapter summarizes error codes which can be set by the functions
+in `gdbm' library.
+
+GDBM_NO_ERROR
+ No error occurred.
+
+GDBM_MALLOC_ERROR
+ Memory allocation failed. Not enough memory.
+
+GDBM_BLOCK_SIZE_ERROR
+ This error is set by the `gdbm_open' function (*note Open::), if
+ the value of its BLOCK_SIZE argument is incorrect.
+
+GDBM_FILE_OPEN_ERROR
+ The library was not able to open a disk file. This can be set by
+ `gdbm_open' (*note Open::), `gdbm_export' and `gdbm_import'
+ functions (*note Flat files::).
+
+ Inspect the value of the system `errno' variable to get more
+ detailed diagnostics.
+
+GDBM_FILE_WRITE_ERROR
+ Writing to a disk file failed. This can be set by `gdbm_open'
+ (*note Open::), `gdbm_export' and `gdbm_import' functions.
+
+ Inspect the value of the system `errno' variable to get more
+ detailed diagnostics.
+
+GDBM_FILE_SEEK_ERROR
+ Positioning in a disk file failed. This can be set by `gdbm_open'
+ (*note Open::) function.
+
+ Inspect the value of the system `errno' variable to get a more
+ detailed diagnostics.
+
+GDBM_FILE_READ_ERROR
+ Reading from a disk file failed. This can be set by `gdbm_open'
+ (*note Open::), `gdbm_export' and `gdbm_import' functions.
+
+ Inspect the value of the system `errno' variable to get a more
+ detailed diagnostics.
+
+GDBM_BAD_MAGIC_NUMBER
+ The file given as argument to `gdbm_open' function is not a valid
+ `gdbm' file: it has a wrong magic number.
+
+GDBM_EMPTY_DATABASE
+ The file given as argument to `gdbm_open' function is not a valid
+ `gdbm' file: it has zero length.
+
+GDBM_CANT_BE_READER
+ This error code is set by the `gdbm_open' function if it is not
+ able to lock file when called in `GDBM_READER' mode (*note
+ GDBM_READER: Open.).
+
+GDBM_CANT_BE_WRITER
+ This error code is set by the `gdbm_open' function if it is not
+ able to lock file when called in writer mode (*note Open::).
+
+GDBM_READER_CANT_DELETE
+ Set by the `gdbm_delete' (*note Delete::) if it attempted to
+ operate on a database that is open in read-only mode (*note
+ GDBM_READER: Open.).
+
+GDBM_READER_CANT_STORE
+ Set by the `gdbm_store' (*note Store::) if it attempted to operate
+ on a database that is open in read-only mode (*note GDBM_READER:
+ Open.).
+
+GDBM_READER_CANT_REORGANIZE
+ Set by the `gdbm_reorganize' (*note Reorganization::) if it
+ attempted to operate on a database that is open in read-only mode
+ (*note GDBM_READER: Open.).
+
+GDBM_UNKNOWN_UPDATE
+ Currently unused. Reserved for future uses.
+
+GDBM_ITEM_NOT_FOUND
+ Requested item was not found. This error is set by `gdbm_delete'
+ (*note Delete::) and `gdbm_fetch' (*note Fetch::) when the
+ requested KEY value is not found in the database.
+
+GDBM_REORGANIZE_FAILED
+ The `gdbm_reorganize' function is not able to create a temporary
+ database. *Note Reorganization::.
+
+GDBM_CANNOT_REPLACE
+ Cannot replace existing item. This error is set by the
+ `gdbm_store' if the requested KEY value is found in the database
+ and the FLAG parameter is not `GDBM_REPLACE'. *Note Store::, for
+ a detailed discussion.
+
+GDBM_ILLEGAL_DATA
+ Either KEY or CONTENT parameter was wrong in a call to to
+ `gdbm_store' (*note Store::).
+
+GDBM_OPT_ALREADY_SET
+ Requested option can be set only once and was already set. This
+ error is returned by the `gdbm_setopt' function. *Note
+ GDBM_CACHESIZE: Options.
+
+GDBM_OPT_ILLEGAL
+ The OPTION argument is not valid or the VALUE argument points to
+ an invalid value in a call to `gdbm_setopt' function. *Note
+ Options::.
+
+GDBM_BYTE_SWAPPED
+ The `gdbm_open' function (*note Open::) attempts to open a
+ database which is created on a machine with different byte
+ ordering.
+
+GDBM_BAD_FILE_OFFSET
+ The `gdbm_open' function (*note Open::) sets this error code if
+ the file it tries to open has a wrong magic number.
+
+GDBM_BAD_OPEN_FLAGS
+ Set by the `gdbm_export' function if supplied an invalid FLAGS
+ argument. *Note Flat files::.
+
+GDBM_FILE_STAT_ERROR
+ Getting information about a disk file failed. The system `errno'
+ will give more details about the error.
+
+ This error can be set by the following functions: `gdbm_open',
+ `gdbm_reorganize'.
+
+GDBM_FILE_EOF
+ End of file was encountered where more data was expected to be
+ present. This error can occur when fetching data from the database
+ and usually means that the database is truncated or otherwise
+ corrupted.
+
+ This error can be set by any GDBM function that does I/O. Some of
+ these functions are: `gdbm_delete', `gdbm_exists', `gdbm_fetch',
+ `gdbm_export', `gdbm_import', `gdbm_reorganize', `gdbm_firstkey',
+ `gdbm_nextkey', `gdbm_store'.
+
+GDBM_NO_DBNAME
+ Output database name is not specified. This error code is set by
+ `gdbm_load' (*note gdbm_load: gdbm_load function.) if the first
+ argument points to `NULL' and the input file does not specify the
+ database name.
+
+GDBM_ERR_FILE_OWNER
+ This error code is set by `gdbm_load' if it is unable to restore
+ database file owner. It is a mild error condition, meaning that
+ the data have been restored successfully, only changing the target
+ file owner failed. Inspect the system `errno' variable to get a
+ more detailed diagnostics.
+
+GDBM_ERR_FILE_MODE
+ This error code is set by `gdbm_load' if it is unable to restore
+ database file mode. It is a mild error condition, meaning that
+ the data have been restored successfully, only changing the target
+ file owner failed. Inspect the system `errno' variable to get a
+ more detailed diagnostics.
+
+
+
+File: gdbm.info, Node: Compatibility, Next: gdbmtool, Prev: Variables, Up: Top
+
+19 Compatibility with standard `dbm' and `ndbm'.
+************************************************
+
+`Gdbm' includes a compatibility layer, which provides traditional
+`ndbm' and older `dbm' functions. The layer is compiled and installed
+if the `--enable-libgdbm-compat' option is used when configuring the
+package.
+
+ The compatibility layer consists of two header files: `ndbm.h' and
+`dbm.h' and the `libgdbm_compat' library.
+
+ Older programs using `ndbm' or `dbm' interfaces can use
+`libgdbm_compat' without any changes. To link a program with the
+compatibility library, add the following two options to the `cc'
+invocation: `-lgdbm -lgdbm_compat'. The `-L' option may also be
+required, depending on where `gdbm' is installed, e.g.:
+
+ cc ... -L/usr/local/lib -lgdbm -lgdbm_compat
+
+ Databases created and manipulated by the compatibility interfaces
+consist of two different files: `FILE.dir' and `FILE.pag'. This is
+required by the POSIX specification and corresponds to the traditional
+usage. Note, however, that despite the similarity of the naming
+convention, actual data stored in these files has not the same format as
+in the databases created by other `dbm' or `ndbm' libraries. In other
+words, you cannot access a standard UNIX `dbm' file with GNU `dbm'!
+
+ GNU `dbm' files are not `sparse'. You can copy them with the usual
+`cp' command and they will not expand in the copying process.
+
+* Menu:
+
+* ndbm:: NDBM interface functions.
+* dbm:: DBM interface functions.
+
+
+File: gdbm.info, Node: ndbm, Next: dbm, Up: Compatibility
+
+19.1 NDBM interface functions.
+==============================
+
+The functions below implement the POSIX `ndbm' interface:
+
+ -- ndbm: DBM * dbm_open (char *FILE, int FLAGS, int MODE)
+ Opens a database. The FILE argument is the full name of the
+ database file to be opened. The function opens two files:
+ `FILE.pag' and `FILE.dir'. The FLAGS and MODE arguments have the
+ same meaning as the second and third arguments of `open' (*note
+ open a file: (open(2))open.), except that a database opened for
+ write-only access opens the files for read and write access and
+ the behavior of the `O_APPEND' flag is unspecified.
+
+ The function returns a pointer to the `DBM' structure describing
+ the database. This pointer is used to refer to this database in
+ all operations described below.
+
+ Any error detected will cause a return value of `NULL' and an
+ appropriate value will be stored in `gdbm_errno' (*note
+ Variables::).
+
+ -- ndbm: void dbm_close (DBM *DBF)
+ Closes the database. The DBF argument must be a pointer returned
+ by an earlier call to `dbm_open'.
+
+ -- ndbm: datum dbm_fetch (DBM *DBF, datum KEY)
+ Reads a record from the database with the matching key. The KEY
+ argument supplies the key that is being looked for.
+
+ If no matching record is found, the `dptr' member of the returned
+ datum is `NULL'. Otherwise, the `dptr' member of the returned
+ datum points to the memory managed by the compatibility library.
+ The application should never free it.
+
+ -- ndbm: int dbm_store (DBM *DBF, datum KEY, datum CONTENT, int MODE)
+ Writes a key/value pair to the database. The argument DBF is a
+ pointer to the `DBM' structure returned from a call to `dbm_open'.
+ The KEY and CONTENT provide the values for the record key and
+ content. The MODE argument controls the behavior of `dbm_store'
+ in case a matching record already exists in the database. It can
+ have one of the following two values:
+
+ `DBM_REPLACE'
+ Replace existing record with the new one.
+
+ `DBM_INSERT'
+ The existing record is left unchanged, and the function
+ returns `1'.
+
+ If no matching record exists in the database, new record will be
+ inserted no matter what the value of the MODE is.
+
+ -- ndbm: int dbm_delete (DBM *DBF, datum KEY)
+ Deletes the record with the matching key from the database. If the
+ function succeeds, `0' is returned. Otherwise, if no matching
+ record is found or if an error occurs, `-1' is returned.
+
+ -- ndbm: datum dbm_firstkey (DBM *DBF)
+ Initializes iteration over the keys from the database and returns
+ the first key. Note, that the word `first' does not imply any
+ specific ordering of the keys.
+
+ If there are no records in the database, the `dptr' member of the
+ returned datum is `NULL'. Otherwise, the `dptr' member of the
+ returned datum points to the memory managed by the compatibility
+ library. The application should never free it.
+
+ -- ndbm: datum dbm_nextkey (DBM *DBF)
+ Continues the iteration started by `dbm_firstkey'. Returns the
+ next key in the database. If the iteration covered all keys in the
+ database, the `dptr' member of the returned datum is `NULL'.
+ Otherwise, the `dptr' member of the returned datum points to the
+ memory managed by the compatibility library. The application
+ should never free it.
+
+ The usual way of iterating over all the records in the database is:
+
+ for (key = dbm_firstkey (dbf);
+ key.ptr;
+ key = dbm_nextkey (dbf))
+ {
+ /* do something with the key */
+ }
+
+ The loop above should not try to delete any records from the
+ database, otherwise the iteration is not guaranteed to cover all
+ the keys. *Note Sequential::, for a detailed discussion of this.
+
+ -- ndbm: int dbm_error (DBM *DBF)
+ Returns the error condition of the database: `0' if no errors
+ occurred so far while manipulating the database, and a non-zero
+ value otherwise.
+
+ -- ndbm: void dbm_clearerr (DBM *DBF)
+ Clears the error condition of the database.
+
+ -- ndbm: int dbm_dirfno (DBM *DBF)
+ Returns the file descriptor of the `dir' file of the database. It
+ is guaranteed to be different from the descriptor returned by the
+ `dbm_pagfno' function (see below).
+
+ The application can lock this descriptor to serialize accesses to
+ the database.
+
+ -- ndbm: int dbm_pagfno (DBM *DBF)
+ Returns the file descriptor of the `pag' file of the database.
+ See also `dbm_dirfno'.
+
+ -- ndbm: int dbm_rdonly (DBM *DBF)
+ Returns `1' if the database DBF is open in a read-only mode and
+ `0' otherwise.
+
+
+File: gdbm.info, Node: dbm, Prev: ndbm, Up: Compatibility
+
+19.2 DBM interface functions.
+=============================
+
+The functions below are provided for compatibility with the old UNIX
+`DBM' interface. Only one database at a time can be manipulated using
+them.
+
+ -- dbm: int dbminit (char *FILE)
+ Opens a database. The FILE argument is the full name of the
+ database file to be opened. The function opens two files:
+ `FILE.pag' and `FILE.dir'. If any of them does not exist, the
+ function fails. It never attempts to create the files.
+
+ The database is opened in the read-write mode, if its disk
+ permissions permit.
+
+ The application must ensure that the functions described below in
+ this section are called only after a successful call to `dbminit'.
+
+ -- dbm: int dbmclose (void)
+ Closes the database opened by an earlier call to `dbminit'.
+
+ -- dbm: datum fetch (datum KEY)
+ Reads a record from the database with the matching key. The KEY
+ argument supplies the key that is being looked for.
+
+ If no matching record is found, the `dptr' member of the returned
+ datum is `NULL'. Otherwise, the `dptr' member of the returned
+ datum points to the memory managed by the compatibility library.
+ The application should never free it.
+
+ -- dbm: int store (datum KEY, datum CONTENT)
+ Stores the key/value pair in the database. If a record with the
+ matching key already exists, its content will be replaced with the
+ new one.
+
+ Returns `0' on success and `-1' on error.
+
+ -- dbm: int delete (datum KEY)
+ Deletes a record with the matching key.
+
+ If the function succeeds, `0' is returned. Otherwise, if no
+ matching record is found or if an error occurs, `-1' is returned.
+
+ -- dbm: datum firstkey (void)
+ Initializes iteration over the keys from the database and returns
+ the first key. Note, that the word `first' does not imply any
+ specific ordering of the keys.
+
+ If there are no records in the database, the `dptr' member of the
+ returned datum is `NULL'. Otherwise, the `dptr' member of the
+ returned datum points to the memory managed by the compatibility
+ library. The application should never free it.
+
+ -- dbm: datum nextkey (datum KEY)
+ Continues the iteration started by a call to `firstkey'. Returns
+ the next key in the database. If the iteration covered all keys
+ in the database, the `dptr' member of the returned datum is `NULL'.
+ Otherwise, the `dptr' member of the returned datum points to the
+ memory managed by the compatibility library. The application
+ should never free it.
+
+
+File: gdbm.info, Node: gdbmtool, Next: gdbm_dump, Prev: Compatibility, Up: Top
+
+20 Examine and modify a GDBM database.
+**************************************
+
+The `gdbmtool' utility allows you to view and modify an existing GDBM
+database or to create a new one.
+
+ When invoked without arguments, it tries to open a database file
+called `junk.gdbm', located in the current working directory. You can
+change this default by supplying the name of the database to use as an
+argument to the program, e.g.:
+
+ $ gdbmtool file.db
+
+ The database will be opened in read-write mode, unless the `-r'
+(`--read-only') option is specified, in which case it will be opened
+only for reading.
+
+ If the database does not exist, `gdbmtool' will create it. There is
+a special option `-n' (`--newdb', which instructs the utility to create
+a new database. If it is used and if the database already exists, it
+will be deleted, so use it sparingly.
+
+* Menu:
+
+* invocation::
+* shell::
+
+
+File: gdbm.info, Node: invocation, Next: shell, Up: gdbmtool
+
+20.1 gdbmtool invocation
+========================
+
+The following table summarizes all `gdbmtool' command line options:
+
+`-b SIZE'
+`--block-size=SIZE'
+ Set block size.
+
+`-c SIZE'
+`--cache-size=SIZE'
+ Set cache size.
+
+`-f FILE'
+
+`--file FILE'
+ Read commands from FILE, instead of the standard input.
+
+`-h'
+`--help'
+ Print a concise help summary.
+
+`-N'
+`--norc'
+ Don't read startup files (*note startup files::).
+
+`-n'
+`--newdb'
+ Create the database.
+
+`-l'
+`--no-lock'
+ Disable file locking.
+
+`-m'
+`--no-mmap'
+ Disable mmap.
+
+`-q'
+`--quiet'
+ Don't print the usual welcome banner at startup. This is the same
+ as setting the variable `quiet' in the startup file. *Note
+ quiet::.
+
+`-r'
+`--read-only'
+ Open the database in read-only mode.
+
+`-s'
+`--synchronize'
+ Synchronize to the disk after each write.
+
+`-V'
+`--version'
+ Print program version and licensing information and exit.
+
+`--usage'
+ Print a terse invocation syntax summary along with a list of
+ available command line options.
+
+
+File: gdbm.info, Node: shell, Prev: invocation, Up: gdbmtool
+
+20.2 gdbmtool interactive mode
+==============================
+
+After successful startup, `gdbmtool' starts a loop, in which it reads
+commands from the standard input, executes them and prints the results
+on the standard output. If the standard input is attached to a
+console, `gdbmtool' runs in interactive mode, which is indicated by its
+"prompt":
+
+ gdbmtool> _
+
+ The utility finishes when it reads the `quit' command (see below) or
+detects end-of-file on its standard input, whichever occurs first.
+
+ A `gdbmtool' command consists of a "command verb", optionally
+followed by "arguments", separated by any amount of white space. A
+command verb can be entered either in full or in an abbreviated form,
+as long as that abbreviation does not match any other verb. For
+example, `co' can be used instead of `count' and `ca' instead of
+`cache'.
+
+ Any sequence of non-whitespace characters appearing after the command
+verb forms an argument. If the argument contains whitespace or
+unprintable characters it must be enclosed in double quotes. Within
+double quotes the usual "escape sequences" are understood, as shown in
+the table below:
+
+Sequence Replaced with
+\a Audible bell character (ASCII 7)
+\b Backspace character (ASCII 8)
+\f Form-feed character (ASCII 12)
+\n Newline character (ASCII 10)
+\r Carriage return character (ASCII 13)
+\t Horizontal tabulation character
+ (ASCII 9)
+\v Vertical tabulation character
+ (ASCII 11)
+\\ Single slash
+\" Double quote
+
+Table 20.1: Backslash escapes
+
+ In addition, a backslash immediately followed by the end-of-line
+character effectively removes that character, allowing to split long
+arguments over several input lines.
+
+ Command parameters may be optional or mandatory. If the number of
+actual arguments is less than the number of mandatory parameters,
+`gdbmtool' will prompt you to supply missing arguments. For example,
+the `store' command takes two mandatory parameters, so if you invoked
+it with no arguments, you would be prompted twice to supply the
+necessary data, as shown in example below:
+
+ gdbmtool> store
+ key? three
+ data? 3
+
+ However, such prompting is possible only in interactive mode. In
+non-interactive mode (e.g. when running a script), all arguments must
+be supplied with each command, otherwise `gdbmtool' will report an
+error and exit immediately.
+
+* Menu:
+
+* variables:: shell variables.
+* commands:: shell commands.
+* definitions:: how to define structured data.
+* startup files::
+
+
+File: gdbm.info, Node: variables, Next: commands, Up: shell
+
+20.2.1 Shell Variables
+----------------------
+
+A number of `gdbmtool' parameters is kept in its internal variables.
+
+ -- gdbmtool variable: bool confirm
+ Whether to ask for confirmation before certain destructive
+ operations, such as truncating the existing database.
+
+ Default is `true'.
+
+ -- gdbmtool variable: string ps1
+ Primary prompt string. Its value can contain "conversion
+ specifiers", consisting of the `%' character followed by another
+ character. These specifiers are expanded in the resulting prompt
+ as follows:
+
+ Sequence Expansion
+ ---------------------------------------------------------------
+ %f name of the current database file
+ %p program invocation name
+ %P package name (`GDBM')
+ %v program version
+ %_ single space character
+ %% %
+
+ The default value is `%p>%_', i.e. the program name, followed by a
+ "greater than" sign, followed by a single space.
+
+ -- gdbmtool variable: string ps2
+ Secondary prompt. See `ps1' for a description of its value. This
+ prompt is displayed before reading the second and subsequent lines
+ of a multi-line command.
+
+ The default value is `%_>%_'.
+
+ -- gdbmtool variable: string delim1
+ A string used to delimit fields of a structured datum on output
+ (*note definitions::).
+
+ Default is `,' (a comma). This variable cannot be unset.
+
+ -- gdbmtool variable: string delim2
+ A string used to delimit array items when printing a structured
+ datum (*note definitions::).
+
+ Default is `,' (a comma). This variable cannot be unset.
+
+ -- gdbmtool variable: string pager
+ The name and command line of the pager program to pipe output to.
+ This program is used in interactive mode when the estimated number
+ of output lines is greater then the number of lines on your screen.
+
+ The default value is inherited from the environment variable
+ `PAGER'. Unsetting this variable disables paging.
+
+ -- gdbmtool variable: bool quiet
+ Whether to display a welcome banner at startup. This variable
+ should be set in a startup script file (*note startup files::).
+ *Note -q option::.
+
+ The following variables control how the database is opened:
+
+ -- gdbmtool variable: numeric blocksize
+ Sets the block size. *Note block_size: Open. Unset by default.
+
+ -- gdbmtool variable: numeric cachesize
+ Sets the cache size. *Note GDBM_SETCACHESIZE: Options. By
+ default this variable is not set.
+
+ -- gdbmtool variable: string open
+ Open mode. The following values are allowed:
+
+ newdb
+ Truncate the database if it exists or create a new one. Open
+ it in read-write mode.
+
+ Technically, this sets the `GDBM_NEWDB' flag in call to
+ `gdbm_open'. *Note GDBM_NEWDB: Open.
+
+ wrcreat
+ rw
+ Open the database in read-write mode. Create it if it does
+ not exist. This is the default.
+
+ Technically speaking, it sets the `GDBM_WRCREAT' flag in call
+ to `gdbm_open'. *Note GDBM_WRCREAT: Open.
+
+ reader
+ readonly
+ Open the database in read-only mode. Signal an error if it
+ does not exist.
+
+ This sets the `GDBM_READER' flag (*note GDBM_READER: Open.).
+
+ Attempting to set any other value or to unset this variable
+ produces an error.
+
+ -- gdbmtool variable: number filemode
+ File mode (in octal) for creating new database files and database
+ dumps.
+
+ -- gdbmtool variable: bool lock
+ Lock the database. This is the default.
+
+ Setting this variable to false or unsetting it results in passing
+ `GDBM_NOLOCK' flag to `gdbm_open' (*note GDBM_NOLOCK: Open.).
+
+ -- gdbmtool variable: bool mmap
+ Use memory mapping. This is the default.
+
+ Setting this variable to false or unsetting it results in passing
+ `GDBM_NOMMAP' flag to `gdbm_open' (*note GDBM_NOMMAP: Open.).
+
+ -- gdbmtool variable: bool sync
+ Flush all database writes on disk immediately. Default is false.
+ *Note GDBM_SYNC: Open.
+
+ The following commands are used to list or modify the variables:
+
+ -- command verb: set [ASSIGNMENTS]
+ When used without arguments, lists all variables and their values.
+ Unset variables are shown after a comment sign (`#'). For string
+ and numeric variables, values are shown after an equals sign. For
+ boolean variables, only the variable name is displayed if the
+ variable is `true'. If it is `false', its name is prefixed with
+ `no'.
+
+ For example:
+
+ ps1="%p>%_"
+ ps2="%_>%_"
+ delim1=","
+ delim2=","
+ confirm
+ # cachesize is unset
+ # blocksize is unset
+ open="wrcreat"
+ lock
+ mmap
+ nosync
+ pager="less"
+ # quiet is unset
+
+ If used with arguments, the `set' command alters the specified
+ variables. In this case, arguments are variable assignments in the
+ form `NAME=VALUE'. For boolean variables, the VALUE is
+ interpreted as follows: if it is numeric, `0' stands for `false',
+ any non-zero value stands for `true'. Otherwise, the values `on',
+ `true', and `yes' denote `true', and `off', `false', `no' stand for
+ `false'. Alternatively, only the name of a boolean variable can be
+ supplied to set it to `true', and its name prefixed with `no' can
+ be used to set it to false. For example, the following command
+ sets the `delim2' variable to `;' and the `confirm' variable to
+ `false':
+
+ set delim2=";" noconfirm
+
+ -- command verb: unset VARIABLES
+ Unsets the listed variables. The effect of unsetting depends on
+ the variable. Unless explicitly described in the discussion of the
+ variables above, unsetting a boolean variable is equivalent to
+ setting it to `false'. Unsetting a string variable is equivalent
+ to assigning it an empty string.
+
+
+File: gdbm.info, Node: commands, Next: definitions, Prev: variables, Up: shell
+
+20.2.2 Gdbmtool Commands
+------------------------
+
+ -- command verb: avail
+ Print the "avail list".
+
+ -- command verb: bucket NUM
+ Print the bucket number NUM and set it as the current one.
+
+ -- command verb: cache
+ Print the bucket cache.
+
+ -- command verb: close
+ Close the currently open database.
+
+ -- command verb: count
+ Print the number of entries in the database.
+
+ -- command verb: current
+ Print the current bucket.
+
+ -- command verb: delete KEY
+ Delete record with the given KEY
+
+ -- command verb: dir
+ Print hash directory.
+
+ -- command verb: export FILE-NAME [truncate] [binary|ascii]
+ Export the database to the flat file FILE-NAME. *Note Flat
+ files::, for a description of the flat file format and its
+ purposes. This command will not overwrite an existing file,
+ unless the `truncate' parameter is also given. Another optional
+ argument determines the type of the dump (*note Flat files::). By
+ default, ASCII dump is created.
+
+ The global variable `filemode' specifies the permissions to use
+ for the created output file.
+
+ See also *note gdbmexport::.
+
+ -- command verb: fetch KEY
+ Fetch and display the record with the given KEY.
+
+ -- command verb: first
+ Fetch and display the first record in the database. Subsequent
+ records can be fetched using the `next' command (see below).
+ *Note Sequential::, for more information on sequential access.
+
+ -- command verb: hash KEY
+ Compute and display the hash value for the given KEY.
+
+ -- command verb: header
+ Print file header.
+
+ -- command verb: help
+ -- command verb: ?
+ Print a concise command summary, showing each command verb with
+ its parameters and a short description of what it does. Optional
+ arguments are enclosed in square brackets.
+
+ -- command verb: import FILE-NAME [replace] [nometa]
+ Import data from a flat dump file FILE-NAME (*note Flat files::).
+ If the word `replace' is given as an argument, any records with
+ the same keys as the already existing ones will replace them. The
+ word `nometa' turns off restoring meta-information from the dump
+ file.
+
+ -- command verb: list
+ List the contents of the database.
+
+ -- command verb: next [KEY]
+ Sequential access: fetch and display the next record. If the KEY
+ is given, the record following the one with this key will be
+ fetched.
+
+ See also `first', above.
+
+ *Note Sequential::, for more information on sequential access.
+
+ -- command verb: open FILENAME
+ Open the database file FILENAME. If successful, any previously
+ open database is closed. Otherwise, if the operation fails, the
+ currently opened database remains unchanged.
+
+ This command takes additional information from the following
+ variables:
+
+ `open'
+ The database access mode. *Note The OPEN variable: openvar,
+ for a list of its values.
+
+ `lock'
+ Whether or not to lock the database. Default is `on'.
+
+ `mmap'
+ Use the memory mapping. Default is `on'.
+
+ `sync'
+ Synchronize after each write. Default is `off'.
+
+ `filemode'
+ Specifies the permissions to use in case a new file is
+ created.
+
+ *Note open parameters::, for a detailed description of these
+ variables.
+
+ -- command verb: quit
+ Close the database and quit the utility.
+
+ -- command verb: reorganize
+ Reorganize the database (*note Reorganization::).
+
+ -- command verb: source FILENAME
+ Read `gdbmtool' commands from the file FILENAME.
+
+ -- command verb: status
+ Print current program status. The following example shows the
+ information displayed:
+
+ Database file: junk.gdbm
+ Database is open
+ define key string
+ define content string
+
+ The two `define' strings show the defined formats for key and
+ content data. *Note definitions::, for a detailed discussion of
+ their meaning.
+
+ -- command verb: store KEY DATA
+ Store the DATA with KEY in the database. If KEY already exists,
+ its data will be replaced.
+
+ -- command verb: version
+ Print the version of `gdbm'.
+
+
+File: gdbm.info, Node: definitions, Next: startup files, Prev: commands, Up: shell
+
+20.2.3 Data Definitions
+-----------------------
+
+GDBM databases are able to keep data of any type, both in the key and
+in the content part of a record. Quite often these data are
+structured, i.e. they consist of several fields of various types.
+`Gdbmtool' provides a mechanism for handling such kind of records.
+
+ The `define' command defines a record structure. The general syntax
+is:
+
+ define WHAT DEFINITION
+
+where WHAT is `key' to defining the structure of key data and `content'
+to define the structure of the content records.
+
+ The DEFINITION can be of two distinct formats. In the simplest case
+it is a single data type. For example,
+
+ define content int
+
+defines content records consisting of a single integer field.
+Supported data types are:
+
+char
+ Single byte (signed).
+
+short
+ Signed short integer.
+
+ushort
+ Unsigned short integer.
+
+int
+ Signed integer.
+
+unsigned
+uint
+ Unsigned integer.
+
+long
+ Signed long integer.
+
+ulong
+ Unsigned long integer.
+
+llong
+ Signed long long integer.
+
+ullong
+ Unsigned long long integer.
+
+float
+ A floating point number.
+
+double
+ Double-precision floating point number.
+
+string
+ Array of bytes.
+
+stringz
+ Null-terminated string, trailing null being part of the string.
+
+ All numeric data types (integer as well as floating point) have the
+same respective widths as in C language on the host where the database
+file resides.
+
+ The `string' and `stringz' are special. Both define a string of
+bytes, similar to `char x[]' in C. The former defines an array of
+bytes, the latter - a null-terminated string. This makes a difference,
+in particular, when the string is the only part of datum. Consider the
+following two definitions:
+
+ 1. `define key string'
+
+ 2. `define key stringz'
+
+Now, suppose we want to store the string "ab" in the key. Using the
+definition (1), the `dptr' member of GDBM `datum' will contain two
+bytes: `a', and `b'. Consequently, the `dsize' member will have the
+value 2. Using the definition (2), the `dptr' member will contain
+three bytes: `a', `b', and ASCII 0. The `dsize' member will have the
+value 3.
+
+ The definition (1) is the default for both key and content.
+
+ The second form of the `define' statement is similar to the C
+`struct' statement and allows for defining structural data. In this
+form, the DEFINITION part is a comma-separated list of data types and
+variables enclosed in curly braces. In contrast to the rest of `gdbm'
+commands, this command is inherently multiline and is terminated with
+the closing curly brace. For example:
+
+ define content {
+ int status,
+ pad 8,
+ char id[3],
+ string name
+ }
+
+This defines a structure consisting of three members: an integer
+`status', an array of 8 bytes `id', and a null-terminated string
+`name'. Notice the `pad' statement: it allows to introduce padding
+between structure members. Another useful statement is `offset': it
+specifies that the member following it begins at the given offset in
+the structure. Assuming the size of `int' is 8 bytes, the above
+definition can also be written as
+
+ define content {
+ int status,
+ offset 16,
+ char id[3],
+ string name
+ }
+
+ _NOTE_: The `string' type can reasonably be used only if it is the
+last or the only member of the data structure. That's because it
+provides no information about the number of elements in the array, so
+it is interpreted to contain all bytes up to the end of the datum.
+
+ When displaying the structured data, `gdbmtool' precedes each value
+with the corresponding field name and delimits parts of the structure
+with the string defined in the `delim1' variable (*note variables::).
+Array elements are delimited using the string from `delim2'. For
+example:
+
+ gdbmtool> fetch foo
+ status=2,id={ a, u, x },name="quux"
+
+ To supply a structured datum as an argument to a `gdbmtool' command,
+use the same notation, but without field names, e.g.:
+
+ gdbmtool> hash { 2, {a,u,x}, "quux" }
+ hash value = 13089969.
+
+
+File: gdbm.info, Node: startup files, Prev: definitions, Up: shell
+
+20.2.4 Startup Files
+--------------------
+
+Upon startup `gdbmtool' looks for a file named `.gdbmtoolrc' first in
+the current working directory and, if not found, in the home directory
+of the user who started the command.
+
+ If found, this file is read and interpreted as a list of `gdbmtool'
+commands. This allows you to customize the program behavior.
+
+ Following is an example startup file which disables the welcome
+banner, sets command line prompt to contain the name of the database
+file in parentheses and defines the structure of the database content
+records:
+
+ set quiet
+ set ps1="(%f) "
+ define key stringz
+ define content {
+ int time,
+ pad 4,
+ int status
+ }
+
+
+File: gdbm.info, Node: gdbm_dump, Next: gdbm_load, Prev: gdbmtool, Up: Top
+
+21 The `gdbm_dump' utility
+**************************
+
+The `gdbm_dump' utility creates a flat file dump of a GDBM database
+(*note Flat files::). It takes one mandatory argument: the name of the
+source database file. The second argument, if given, specifies the
+name of the output file. If not given, `gdbm_dump' will produce the
+dump on the standard output.
+
+ For example, the following invocation creates a dump of the database
+`file.db' in the file `file.dump':
+
+ $ gdbm_dump file.db file.dump
+
+ By default the utility creates dumps in ASCII format (*note ASCII:
+Flat files.). Another format can be requested using the `--format'
+(`-H') option.
+
+ The `gdbm_dump' utility understands the following command line
+options:
+
+`-H FMT'
+`--format=FMT'
+ Select output format. Valid values for FMT are: `binary' or `0'
+ to select binary dump format, and `ascii' or `1' to select ASCII
+ format.
+
+`-h'
+`--help'
+ Print a concise help summary.
+
+`-V'
+`--version'
+ Print program version and licensing information and exit.
+
+`--usage'
+ Print a terse invocation syntax summary along with a list of
+ available command line options.
+
+
+File: gdbm.info, Node: gdbm_load, Next: gdbmexport, Prev: gdbm_dump, Up: Top
+
+22 The `gdbm_load' utility
+**************************
+
+The `gdbm_load' utility restores a GDBM database from a flat file. The
+utility requires at least one argument: the name of the input flat
+file. If it is `-', the standard input will be read. The format of
+the input file is detected automatically.
+
+ By default the utility attempts to restore the database under its
+original name, as stored in the input file. It will fail to do so if
+the input is in binary format. In that case, the name of the database
+must be given as the second argument.
+
+ In general, if two arguments are given the second one is treated as
+the name of the database to create, overriding the file name specified
+in the flat file.
+
+ The utility understands the following command line arguments:
+
+`-b NUM'
+`--block-size=NUM'
+ Sets block size. *Note block_size: Open.
+
+`-c NUM'
+`--cache-size=NUM'
+ Sets cache size. *Note GDBM_SETCACHESIZE: Options.
+
+`-M'
+`--mmap'
+ Use memory mapping.
+
+`-m MODE'
+
+`--mode=MODE'
+ Sets the file mode. The argument is the desired file mode in
+ octal.
+
+`-n'
+`--no-meta'
+ Do not restore file meta-data (ownership and mode) from the flat
+ file.
+
+`-r'
+`--replace'
+ Replace existing keys.
+
+`-u USER[:GROUP]'
+`--user=USER[:GROUP]'
+ Set file owner. The USER can be either a valid user name or UID.
+ Similarly, the GROUP is either a valid group name or GID. If
+ GROUP is not given, the main group of USER is used.
+
+ User and group parts can be separated by a dot, instead of the
+ colon.
+
+`-h'
+`--help'
+ Print a concise help summary.
+
+`-V'
+`--version'
+ Print program version and licensing information and exit.
+
+`--usage'
+ Print a terse invocation syntax summary along with a list of
+ available command line options.
+
+
+File: gdbm.info, Node: gdbmexport, Next: Exit codes, Prev: gdbm_load, Up: Top
+
+23 Export a database into a portable format.
+********************************************
+
+The `gdbmexport' utility converts the database of an older GDBM version
+into a binary flat format.
+
+ The utility takes two mandatory arguments: the name of the database
+file to convert and the output file name, e.g.:
+
+ $ gdbmexport junk.gdbm junk.flat
+
+ In addition the following two options are understood:
+
+`-h'
+ Display short usage summary and exit.
+
+`-v'
+ Display program version and licensing information, and exit.
+
+
+File: gdbm.info, Node: Exit codes, Next: Bugs, Prev: gdbmexport, Up: Top
+
+24 Exit codes
+*************
+
+All GDBM utilities return uniform exit codes. These are summarized in
+the table below:
+
+Code Meaning
+--------------------------------------------------------------------------
+0 Successful termination.
+1 A fatal error occurred.
+2 Program was unable to restore file ownership or
+ mode.
+3 Command line usage error.
+
+
+File: gdbm.info, Node: Bugs, Next: Resources, Prev: Exit codes, Up: Top
+
+25 Problems and bugs.
+*********************
+
+If you have problems with GNU `dbm' or think you've found a bug, please
+report it. Before reporting a bug, make sure you've actually found a
+real bug. Carefully reread the documentation and see if it really says
+you can do what you're trying to do. If it's not clear whether you
+should be able to do something or not, report that too; it's a bug in
+the documentation!
+
+ Before reporting a bug or trying to fix it yourself, try to isolate
+it to the smallest possible input file that reproduces the problem.
+Then send us the input file and the exact results `gdbm' gave you. Also
+say what you expected to occur; this will help us decide whether the
+problem was really in the documentation.
+
+ Once you've got a precise problem, send e-mail to <bug-gdbm@gnu.org>.
+
+ Please include the version number of GNU `dbm' you are using. You
+can get this information by printing the variable `gdbm_version' (*note
+Variables::).
+
+ Non-bug suggestions are always welcome as well. If you have
+questions about things that are unclear in the documentation or are
+just obscure features, please report them too.
+
+ You may contact the authors and maintainers by e-mail:
+ <phil@cs.wwu.edu>, <downsj@downsj.com>, <gray@gnu.org.ua>
+
+
+File: gdbm.info, Node: Resources, Next: GNU Free Documentation License, Prev: Bugs, Up: Top
+
+26 Additional resources
+***********************
+
+For the latest updates and pointers to additional resources, visit
+`http://www.gnu.org/software/gdbm'.
+
+ In particular, a copy of `gdbm' documentation in various formats is
+available online at `http://www.gnu.org/software/gdbm/manual.html'.
+
+ Latest versions of `gdbm' can be downloaded from anonymous FTP:
+`ftp://ftp.gnu.org/gnu/gdbm', or via HTTP from
+`http://ftp.gnu.org/gnu/gdbm', or from any GNU mirror worldwide. See
+`http://www.gnu.org/order/ftp.html', for a list of mirrors.
+
+ To track `gdbm' development, visit
+`http://puszcza.gnu.org.ua/projects/gdbm'.
+
+
+File: gdbm.info, Node: GNU Free Documentation License, Next: Index, Prev: Resources, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008, 2011 Free Software
+ Foundation, Inc.
+ `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, receipt of a copy of some or all of
+ the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation. If the Document specifies that a proxy
+ can decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: gdbm.info, Node: Index, Prev: GNU Free Documentation License, Up: Top
+
+Index
+*****
+
+
+* Menu:
+
+* --newdb, gdbmtool option: gdbmtool. (line 20)
+* --read-only, gdbmtool option: gdbmtool. (line 16)
+* -n, gdbmtool option: gdbmtool. (line 20)
+* -r, gdbmtool option: gdbmtool. (line 16)
+* .gdbmtoolrc: startup files. (line 6)
+* ?: commands. (line 59)
+* _GDBM_MAX_ERRNO: Variables. (line 28)
+* _GDBM_MIN_ERRNO: Variables. (line 25)
+* avail: commands. (line 7)
+* blocksize: variables. (line 67)
+* bucket: commands. (line 10)
+* cache: commands. (line 13)
+* cachesize: variables. (line 70)
+* close: commands. (line 16)
+* close-on-exec: Open. (line 48)
+* closing database: Close. (line 6)
+* command line options, gdbmtool: invocation. (line 6)
+* compatibility layer: Compatibility. (line 6)
+* confirm: variables. (line 9)
+* count: commands. (line 19)
+* creating a database, gdbmtool: gdbmtool. (line 20)
+* current: commands. (line 22)
+* database options: Options. (line 6)
+* database reorganization: Reorganization. (line 6)
+* database synchronization: Sync. (line 6)
+* database, closing: Close. (line 6)
+* database, opening or creating: Open. (line 6)
+* DBM functions: dbm. (line 6)
+* dbm.h: Compatibility. (line 11)
+* dbm_clearerr: ndbm. (line 98)
+* dbm_close: ndbm. (line 26)
+* dbm_delete: ndbm. (line 57)
+* dbm_dirfno: ndbm. (line 101)
+* dbm_error: ndbm. (line 93)
+* dbm_fetch: ndbm. (line 30)
+* dbm_firstkey: ndbm. (line 62)
+* DBM_INSERT: ndbm. (line 49)
+* dbm_nextkey: ndbm. (line 72)
+* dbm_open: ndbm. (line 9)
+* dbm_pagfno: ndbm. (line 109)
+* dbm_rdonly: ndbm. (line 113)
+* DBM_REPLACE: ndbm. (line 46)
+* dbm_store: ndbm. (line 39)
+* dbmclose: dbm. (line 23)
+* dbminit: dbm. (line 11)
+* default database, gdbmtool: gdbmtool. (line 9)
+* delete <1>: commands. (line 25)
+* delete: dbm. (line 42)
+* deleting records: Delete. (line 6)
+* deletion in iteration loops: Sequential. (line 56)
+* delim1: variables. (line 40)
+* delim2: variables. (line 46)
+* dir: commands. (line 28)
+* dir file: Compatibility. (line 22)
+* error codes: Error codes. (line 6)
+* error strings: Errors. (line 6)
+* exit code: Exit codes. (line 6)
+* export <1>: commands. (line 31)
+* export: Flat files. (line 6)
+* fetch <1>: commands. (line 44)
+* fetch: dbm. (line 26)
+* fetching records: Fetch. (line 6)
+* filemode: variables. (line 102)
+* first: commands. (line 47)
+* firstkey: dbm. (line 48)
+* Flat file format: Flat files. (line 6)
+* GDBM_BAD_FILE_OFFSET: Error codes. (line 117)
+* GDBM_BAD_MAGIC_NUMBER: Error codes. (line 48)
+* GDBM_BAD_OPEN_FLAGS: Error codes. (line 121)
+* GDBM_BLOCK_SIZE_ERROR: Error codes. (line 15)
+* GDBM_BYTE_SWAPPED: Error codes. (line 112)
+* GDBM_CACHESIZE: Options. (line 30)
+* GDBM_CANNOT_REPLACE: Error codes. (line 92)
+* GDBM_CANT_BE_READER: Error codes. (line 56)
+* GDBM_CANT_BE_WRITER: Error codes. (line 61)
+* GDBM_CENTFREE: Options. (line 78)
+* GDBM_CLOEXEC: Open. (line 48)
+* gdbm_close: Close. (line 10)
+* GDBM_COALESCEBLKS: Options. (line 92)
+* gdbm_count: Count. (line 7)
+* gdbm_delete: Delete. (line 9)
+* gdbm_delete and sequential access: Sequential. (line 56)
+* gdbm_dump <1>: gdbm_dump. (line 6)
+* gdbm_dump: Flat files. (line 49)
+* gdbm_dump_to_file: Flat files. (line 150)
+* GDBM_EMPTY_DATABASE: Error codes. (line 52)
+* GDBM_ERR_FILE_MODE <1>: Error codes. (line 156)
+* GDBM_ERR_FILE_MODE: Flat files. (line 136)
+* GDBM_ERR_FILE_OWNER <1>: Error codes. (line 149)
+* GDBM_ERR_FILE_OWNER: Flat files. (line 133)
+* gdbm_errlist: Variables. (line 17)
+* gdbm_errno: Variables. (line 9)
+* gdbm_exists: Fetch. (line 37)
+* gdbm_export: Flat files. (line 173)
+* gdbm_export_to_file: Flat files. (line 182)
+* GDBM_FASTMODE: Options. (line 52)
+* gdbm_fdesc: Locking. (line 14)
+* gdbm_fetch: Fetch. (line 7)
+* GDBM_FILE_EOF: Error codes. (line 132)
+* GDBM_FILE_OPEN_ERROR: Error codes. (line 19)
+* GDBM_FILE_READ_ERROR: Error codes. (line 41)
+* GDBM_FILE_SEEK_ERROR: Error codes. (line 34)
+* GDBM_FILE_STAT_ERROR: Error codes. (line 125)
+* GDBM_FILE_WRITE_ERROR: Error codes. (line 27)
+* gdbm_firstkey: Sequential. (line 14)
+* GDBM_GETCACHESIZE: Options. (line 40)
+* GDBM_GETCOALESCEBLKS: Options. (line 104)
+* GDBM_GETDBNAME: Options. (line 127)
+* GDBM_GETFLAGS: Options. (line 44)
+* GDBM_GETMAXMAPSIZE: Options. (line 114)
+* GDBM_GETMMAP: Options. (line 123)
+* GDBM_GETSYNCMODE: Options. (line 74)
+* GDBM_ILLEGAL_DATA: Error codes. (line 98)
+* gdbm_import: Flat files. (line 187)
+* gdbm_import_from_file: Flat files. (line 200)
+* GDBM_INSERT: Store. (line 23)
+* GDBM_ITEM_NOT_FOUND: Error codes. (line 83)
+* gdbm_load <1>: gdbm_load. (line 6)
+* gdbm_load: Flat files. (line 78)
+* gdbm_load_from_file: Flat files. (line 166)
+* GDBM_MALLOC_ERROR: Error codes. (line 12)
+* GDBM_NEWDB: Open. (line 28)
+* gdbm_nextkey: Sequential. (line 24)
+* GDBM_NO_DBNAME: Error codes. (line 143)
+* GDBM_NO_ERROR: Error codes. (line 9)
+* GDBM_NOLOCK <1>: Locking. (line 6)
+* GDBM_NOLOCK: Open. (line 40)
+* GDBM_NOMMAP: Open. (line 40)
+* gdbm_open: Open. (line 9)
+* GDBM_OPT_ALREADY_SET: Error codes. (line 102)
+* GDBM_OPT_ILLEGAL: Error codes. (line 107)
+* GDBM_READER: Open. (line 28)
+* GDBM_READER_CANT_DELETE: Error codes. (line 65)
+* GDBM_READER_CANT_REORGANIZE: Error codes. (line 75)
+* GDBM_READER_CANT_STORE: Error codes. (line 70)
+* gdbm_reorganize: Reorganization. (line 9)
+* GDBM_REORGANIZE_FAILED: Error codes. (line 88)
+* GDBM_REPLACE: Store. (line 23)
+* GDBM_SETCACHESIZE: Options. (line 30)
+* GDBM_SETCENTFREE: Options. (line 78)
+* GDBM_SETCOALESCEBLKS: Options. (line 92)
+* GDBM_SETMAXMAPSIZE: Options. (line 108)
+* GDBM_SETMMAP: Options. (line 118)
+* gdbm_setopt: Options. (line 11)
+* GDBM_SETSYNCMODE: Options. (line 61)
+* gdbm_store: Store. (line 8)
+* gdbm_strerror: Errors. (line 9)
+* gdbm_sync: Sync. (line 15)
+* GDBM_SYNC <1>: Sync. (line 6)
+* GDBM_SYNC: Open. (line 40)
+* GDBM_SYNCMODE: Options. (line 61)
+* GDBM_UNKNOWN_UPDATE: Error codes. (line 80)
+* gdbm_version: Variables. (line 31)
+* gdbm_version_cmp: Variables. (line 61)
+* GDBM_VERSION_MAJOR: Variables. (line 45)
+* GDBM_VERSION_MINOR: Variables. (line 48)
+* gdbm_version_number: Variables. (line 34)
+* GDBM_VERSION_PATCH: Variables. (line 51)
+* GDBM_WRCREAT: Open. (line 28)
+* GDBM_WRITER: Open. (line 28)
+* gdbmexport: gdbmexport. (line 6)
+* gdbmtool: gdbmtool. (line 6)
+* hash: commands. (line 52)
+* header: commands. (line 55)
+* help: commands. (line 58)
+* import <1>: commands. (line 64)
+* import: Flat files. (line 6)
+* init file, gdbmtool: startup files. (line 6)
+* interactive mode, gdbmtool: shell. (line 6)
+* iterating over records: Sequential. (line 6)
+* iteration and gdbm_delete: Sequential. (line 56)
+* iteration loop: Sequential. (line 36)
+* iteration loop, using NDBM: ndbm. (line 79)
+* junk.gdbm: gdbmtool. (line 9)
+* libgdbm_compat: Compatibility. (line 11)
+* list: commands. (line 71)
+* lock: variables. (line 106)
+* locking: Locking. (line 6)
+* looking up records: Fetch. (line 6)
+* mmap: variables. (line 112)
+* NDBM functions: ndbm. (line 6)
+* ndbm.h: Compatibility. (line 11)
+* next: commands. (line 74)
+* nextkey: dbm. (line 58)
+* number of records: Count. (line 6)
+* open <1>: commands. (line 83)
+* open: variables. (line 74)
+* opening the database: Open. (line 6)
+* options, database: Options. (line 6)
+* pag file: Compatibility. (line 22)
+* pager: variables. (line 52)
+* ps1: variables. (line 15)
+* ps2: variables. (line 33)
+* quiet: variables. (line 60)
+* quit: commands. (line 111)
+* read-only mode, gdbmtool: gdbmtool. (line 16)
+* record, deleting: Delete. (line 6)
+* record, fetching: Fetch. (line 6)
+* records, iterating over: Sequential. (line 6)
+* records, storing: Store. (line 6)
+* records, testing existence: Fetch. (line 34)
+* reorganization, database: Reorganization. (line 6)
+* reorganize: commands. (line 114)
+* sequential access: Sequential. (line 6)
+* sequential access, using NDBM: ndbm. (line 79)
+* set: variables. (line 124)
+* source: commands. (line 117)
+* startup file, gdbmtool: startup files. (line 6)
+* status: commands. (line 120)
+* store <1>: commands. (line 133)
+* store: dbm. (line 35)
+* storing records: Store. (line 6)
+* sync: variables. (line 118)
+* synchronization, database: Sync. (line 6)
+* unset: variables. (line 162)
+* variables, gdbmtool: variables. (line 6)
+* version: commands. (line 137)
+* version number: Variables. (line 30)
+
+
+
+Tag Table:
+Node: Top905
+Node: Copying3070
+Node: Intro4853
+Node: List6273
+Node: Open7574
+Node: Close10888
+Node: Count11342
+Node: Store11748
+Node: Fetch13724
+Node: Delete14946
+Node: Sequential15712
+Node: Reorganization18705
+Node: Sync19714
+Node: Flat files20804
+Ref: gdbm_load function24322
+Node: Errors29758
+Node: Options30322
+Node: Locking36056
+Node: Variables36652
+Node: Error codes39083
+Node: Compatibility44928
+Node: ndbm46506
+Node: dbm51344
+Node: gdbmtool54004
+Node: invocation54983
+Ref: -q option55605
+Node: shell56098
+Ref: backslash-interpretation57312
+Node: variables58897
+Ref: quiet61106
+Ref: open parameters61302
+Ref: openvar61624
+Ref: filemode62484
+Node: commands65062
+Ref: gdbmtool export65717
+Ref: gdbmtool import66972
+Node: definitions69328
+Node: startup files73533
+Node: gdbm_dump74335
+Node: gdbm_load75576
+Node: gdbmexport77456
+Node: Exit codes78070
+Node: Bugs78619
+Node: Resources79971
+Node: GNU Free Documentation License80690
+Node: Index105862
+
+End Tag Table
diff --git a/doc/gdbm.texinfo b/doc/gdbm.texinfo
new file mode 100644
index 0000000..4f05796
--- /dev/null
+++ b/doc/gdbm.texinfo
@@ -0,0 +1,2567 @@
+\input texinfo @c -*- Texinfo -*-
+@comment $Id: gdbm.texinfo,v 1.34 2013/12/25 09:31:59 gray Exp $
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename gdbm.info
+@include version.texi
+@settitle GDBM manual
+
+@ifinfo
+@dircategory Programming & development tools
+@direntry
+* GDBM: (gdbm). The GNU database manager.
+* gdbm_dump: gdbm_dump(gdbm). Dump the GDBM database into a flat file.
+* gdbm_load: gdbm_load(gdbm). Load the database from a flat file.
+@end direntry
+@end ifinfo
+
+@c @setchapternewpage odd
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@c Use @kwindex for keywords
+@defcodeindex kw
+@syncodeindex kw cp
+@c Use @flindex for files
+@defcodeindex fl
+@syncodeindex fl cp
+@c Use @prindex for programs
+@defcodeindex pr
+@syncodeindex pr cp
+
+@c Merge all indices into a single one
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex tp cp
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+Published by the Free Software Foundation,
+51 Franklin Street, Fifth Floor
+Boston, MA 02110-1301, USA
+
+Copyright @copyright{} 1989-1999, 2007-2011 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover, and no Back-Cover texts.
+A copy of the license is included in the section entitled ``GNU Free
+Documentation License.''
+@end copying
+
+@titlepage
+@sp 6
+@center @titlefont{GNU dbm}
+@sp 2
+@center A Database Manager
+@sp 2
+@center by Philip A. Nelson, Jason Downs and Sergey Poznyakoff
+@sp 4
+@center Manual by Pierre Gaumond, Philip A. Nelson, Jason Downs
+@center and Sergey Poznyakoff
+@sp 1
+@center Edition @value{EDITION}
+@sp 1
+@center for GNU @code{dbm}, Version @value{VERSION}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnothtml
+@page
+@summarycontents
+@page
+@end ifnothtml
+@contents
+
+@ifnottex
+@node Top
+@top The GNU database manager.
+
+GNU @code{dbm} is a library of functions implementing a hashed database
+on a disk file. This manual documents GNU @code{dbm} Version @value{VERSION}
+(@code{gdbm}). The software was originally written by Philip A.@:
+Nelson. This document was originally written by Pierre Gaumond from
+texts written by Phil.
+@end ifnottex
+
+@menu
+Introduction:
+
+* Copying:: Your rights.
+* Intro:: Introduction to GNU dbm.
+* List:: List of functions.
+
+Functions:
+
+* Open:: Opening the database.
+* Close:: Closing the database.
+* Count:: Counting records in the database.
+* Store:: Inserting and replacing records in the database.
+* Fetch:: Searching records in the database.
+* Delete:: Removing records from the database.
+* Sequential:: Sequential access to records.
+* Reorganization:: Database reorganization.
+* Sync:: Insure all writes to disk have competed.
+* Flat files:: Export and import to Flat file format.
+* Errors:: Convert internal error codes into English.
+* Options:: Setting internal options.
+* Locking:: File locking.
+
+* Error codes:: Error codes returned by @code{gdbm} calls.
+* Variables:: Two useful variables.
+* Compatibility:: Compatibility with UNIX dbm and ndbm.
+
+Programs
+
+* gdbmtool:: Examine and modify a GDBM database.
+* gdbm_dump:: Dump the database into a flat file.
+* gdbm_load:: Load the database from a flat file.
+* gdbmexport:: Export a database into a portable format.
+* Exit codes:: Exit codes returned by GDBM utilities.
+
+Other topics:
+
+* Bugs:: Problems and bugs.
+* Resources:: Additional resources,
+
+* GNU Free Documentation License:: Document license.
+* Index:: Index
+@end menu
+
+@node Copying
+@chapter Copying Conditions.
+This library is @dfn{free}; this means that everyone is free to use
+it and free to redistribute it on a free basis. GNU @code{dbm} (@code{gdbm})
+is not in the public domain; it is copyrighted and there
+are restrictions on its distribution, but these restrictions are
+designed to permit everything that a good cooperating citizen would want
+to do. What is not allowed is to try to prevent others from further
+sharing any version of @code{gdbm} that they might get from
+you.@refill
+
+ Specifically, we want to make sure that you have the right to give
+away copies @code{gdbm}, that you receive
+source code or else can get it if you want it, that you can change these
+functions or use pieces of them in new free programs, and that you know
+you can do these things.@refill
+
+ To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies @code{gdbm}, you must give the recipients all
+the rights that you have. You must make sure that they, too, receive or
+can get the source code. And you must tell them their rights.@refill
+
+ Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for anything in the @code{gdbm} distribution.
+If these functions are modified by someone else and passed on, we want
+their recipients to know that what they have is not what we distributed,
+so that any problems introduced by others will not reflect on our
+reputation.@refill
+
+@code{Gdbm} is currently distributed under the terms of the GNU General
+Public License, Version 3. (@emph{NOT} under the GNU General Library
+Public License.) A copy the GNU General Public License is included with
+the distribution of @code{gdbm}.
+
+@node Intro
+@chapter Introduction to GNU @code{dbm}.
+
+GNU @code{dbm} (@code{gdbm}) is a library of database functions that use
+extensible hashing and works similar to the standard UNIX @code{dbm}
+functions. These routines are provided to a programmer needing to
+create and manipulate a hashed database. (@code{gdbm} is @emph{NOT} a
+complete database package for an end user.)
+
+The basic use of @code{gdbm} is to store key/data pairs in a data file.
+Each key must be unique and each key is paired with only one data item.
+The keys can not be directly accessed in sorted order. The basic unit
+of data in @code{gdbm} is the structure:
+
+@example
+ typedef struct @{
+ char *dptr;
+ int dsize;
+ @} datum;
+@end example
+
+This structure allows for arbitrary sized keys and data items.
+
+The key/data pairs are stored in a @code{gdbm} disk file, called a
+@code{gdbm} database. An application must open a @code{gdbm} database
+to be able manipulate the keys and data contained in the database.
+@code{gdbm} allows an application to have multiple databases open at the
+same time. When an application opens a @code{gdbm} database, it is
+designated as a @code{reader} or a @code{writer}. A @code{gdbm}
+database can be opened by at most one writer at a time. However, many readers
+may open the database simultaneously. Readers and writers can not
+open the @code{gdbm} database at the same time.
+
+@node List
+@chapter List of functions.
+
+The following is a quick list of the functions contained in the @code{gdbm}
+library. The include file @code{gdbm.h}, that can be included by the user,
+contains a definition of these functions.
+
+@example
+#include <gdbm.h>
+
+GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func);
+void gdbm_close(dbf);
+int gdbm_store(dbf, key, content, flag);
+datum gdbm_fetch(dbf, key);
+int gdbm_delete(dbf, key);
+datum gdbm_firstkey(dbf);
+datum gdbm_nextkey(dbf, key);
+int gdbm_reorganize(dbf);
+void gdbm_sync(dbf);
+int gdbm_exists(dbf, key);
+char *gdbm_strerror(errno);
+int gdbm_setopt(dbf, option, value, size);
+int gdbm_fdesc(dbf);
+int gdbm_export (GDBM_FILE, const char *, int, int);
+int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp);
+int gdbm_import (GDBM_FILE, const char *, int);
+int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag);
+int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount);
+int gdbm_version_cmp (int const a[], int const b[]);
+@end example
+
+The @code{gdbm.h} include file is often in the @file{/usr/local/include}
+directory. (The actual location of @code{gdbm.h} depends on your local
+installation of @code{gdbm}.)
+
+@node Open
+@chapter Opening the database.
+
+@cindex opening the database
+@cindex database, opening or creating
+@deftypefn {gdbm interface} GDBM_FILE gdbm_open (const char *@var{name}, int @var{block_size}, @
+ int @var{flags}, int @var{mode}, void (*fatal_func)(const char *))
+Initializes @code{gdbm} system. If the file has a size of zero bytes, a file
+initialization procedure is performed, setting up the initial structure in the
+file.
+
+The arguments are:
+
+@table @var
+@item name
+The name of the file (the complete name, @code{gdbm} does not append any
+characters to this name).
+@item block_size
+It is used during initialization to determine the size of various
+constructs. It is the size of a single transfer from disk to
+memory. This parameter is ignored if the file has been previously
+initialized. The minimum size is 512. If the value is less than 512,
+the file system block size is used, otherwise the value of
+@var{block_size} is used.
+@item flags
+@kwindex GDBM_READER
+@kwindex GDBM_WRITER
+@kwindex GDBM_WRCREAT
+@kwindex GDBM_NEWDB
+If @code{flags} is set to @samp{GDBM_READER}, the user wants to just read the
+database and any call to @code{gdbm_store} or @code{gdbm_delete} will fail.
+Many readers can access the database at the same time. If @code{flags} is
+set to @samp{GDBM_WRITER}, the user wants both read and write access
+to the database and requires exclusive access. If @code{flags} is set
+to @samp{GDBM_WRCREAT}, the user wants both read and write access to
+the database and wants it created if it does not already exist. If
+@code{flags} is set to @samp{GDBM_NEWDB}, the user want a new database
+created, regardless of whether one existed, and wants read and write
+access to the new database.
+
+@kwindex GDBM_SYNC
+@kwindex GDBM_NOLOCK
+@kwindex GDBM_NOMMAP
+The following may also be logically or'd into the database flags:
+@samp{GDBM_SYNC}, which causes all database operations to be
+synchronized to the disk, @samp{GDBM_NOLOCK}, which prevents the library
+from performing any locking on the database file, and @samp{GDBM_NOMMAP},
+which disables the memory mapping mechanism. The option @samp{GDBM_FAST} is
+now obsolete, since @code{gdbm} defaults to no-sync mode.
+
+@kwindex GDBM_CLOEXEC
+@cindex close-on-exec
+If the host @samp{open} call
+@ifhtml
+(@uref{http://www.manpagez.com/man/2/open, open(2)})
+@end ifhtml
+@ifnothtml
+(@pxref{open,,,open(2),open(2) man page})
+@end ifnothtml
+supports the @samp{O_CLOEXEC} flag, the @samp{GDBM_CLOEXEC} can be
+or'd into the flags, to enable the close-on-exec flag for the
+database file descriptor.
+@item mode
+File mode (see
+@ifhtml
+@uref{http://www.manpagez.com/man/2/chmod},
+@end ifhtml
+@ifnothtml
+@ref{chmod,,change permissions of a file,chmod(2),
+chmod(2) man page},
+@end ifnothtml
+and
+@ifhtml
+@uref{http://www.manpagez.com/man/2/open}),
+@end ifhtml
+@ifnothtml
+@pxref{open,,open a file,open(2), open(2) man page}),
+@end ifnothtml
+which is used if the file is created).
+@item fatal_func
+A function for @code{gdbm} to call if it detects a fatal error. The only
+parameter of this function is a string. If the value of @samp{NULL} is
+provided, @code{gdbm} will use a default function.
+@end table
+
+The return value, is the pointer needed by all other functions to
+access that @code{gdbm} file. If the return is the @samp{NULL} pointer,
+@code{gdbm_open} was not successful. The errors can be found in
+@code{gdbm_errno} variable (@pxref{Variables, gdbm_errno}). Available
+error codes are discussed in @ref{Error codes}.
+
+In all of the following calls, the parameter @var{dbf} refers to the pointer
+returned from @code{gdbm_open}.
+@end deftypefn
+
+@node Close
+@chapter Closing the database.
+@cindex closing database
+@cindex database, closing
+
+It is important that every file opened is also closed. This is needed to
+update the reader/writer count on the file:
+
+@deftypefn {gdbm interface} void gdbm_close (GDBM_FILE @var{dbf})
+This function closes the @code{gdbm} file and frees all memory
+associated with it. The parameter is:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@end table
+@end deftypefn
+
+@node Count
+@chapter Number of Records
+@cindex number of records
+@deftypefn {gdbm interface} int gdbm_count (GDBM_FILE @var{dbf}, @
+ gdbm_count_t *@var{pcount})
+Counts number of records in the database @var{dbf}. On success,
+stores it in the memory location pointed to by @var{pcount} and return
+0. On error, sets @code{gdbm_errno} (if relevant, also @code{errno})
+and returns -1.
+@end deftypefn
+
+@node Store
+@chapter Inserting and replacing records in the database.
+@cindex storing records
+@cindex records, storing
+
+@deftypefn {gdbm interface} int gdbm_store (GDBM_FILE @var{dbf}, datum @var{key}, @
+ datum @var{content}, int @var{flag})
+The function @code{gdbm_store} inserts or replaces records in the database.
+
+The parameters are:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@item key
+The search key.
+@item content
+The data to be associated with the key.
+@item flag
+@kwindex GDBM_REPLACE
+@kwindex GDBM_INSERT
+Defines the action to take when the key is already in the database. The value
+@samp{GDBM_REPLACE} (defined in @file{gdbm.h}) asks that the old data
+be replaced by the new @var{content}. The value @samp{GDBM_INSERT}
+asks that an error be returned and no action taken if the @var{key}
+already exists.
+@end table
+
+This function can return the following values:
+
+@table @asis
+@item -1
+The item was not stored in the database because the caller was not an
+official writer or either @var{key} or @var{content} have a
+@samp{NULL} @samp{dptr} field.
+
+Both @var{key} and @var{content} must have the @samp{dptr} field be a
+non-@samp{NULL} value. Since a @samp{NULL} @samp{dptr} field is used by
+other functions to indicate an error, it cannot be valid data.
+@item +1
+The item was not stored because the argument @var{flag} was
+@samp{GDBM_INSERT} and the @var{key} was already in the database.
+@item 0
+No error. The value of @var{content} is keyed by @var{key}. The file
+on disk is updated to reflect the structure of the new database before
+returning from this function.
+@end table
+@end deftypefn
+
+If you store data for a @var{key} that is already in the data base,
+@code{gdbm} replaces the old data with the new data if called with
+@samp{GDBM_REPLACE}. You do not get two data items for the same
+@code{key} and you do not get an error from @code{gdbm_store}.
+
+The size in @code{gdbm} is not restricted like @code{dbm} or @code{ndbm}. Your
+data can be as large as you want.
+
+@node Fetch
+@chapter Searching for records in the database.
+@cindex fetching records
+@cindex looking up records
+@cindex record, fetching
+
+@deftypefn {gdbm interface} datum gdbm_fetch (GDBM_FILE @var{dbf}, datum @var{key})
+Looks up a given @var{key} and returns the information associated with it.
+The @samp{dptr} field in the structure that is returned points to a
+memory block allocated by @code{malloc}. It is the caller's
+responsibility to free it when no longer needed.
+
+If the @samp{dptr} is @samp{NULL}, no data was found.
+
+The parameters are:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@item key
+The search key.
+@end table
+@end deftypefn
+
+An example of using this function:
+
+@example
+content = gdbm_fetch (dbf, key);
+if (content.dptr == NULL)
+ @{
+ fprintf(stderr, "key not found\n");
+ @}
+else
+ @{
+ /* do something with content.dptr */
+ @}
+@end example
+
+@cindex records, testing existence
+You may also search for a particular key without retrieving it:
+
+@deftypefn {gdbm interface} int gdbm_exists (GDBM_FILE @var{dbf}, datum @var{key})
+Returns @samp{true} (@samp{1}) if the @var{key} exists in @var{dbf}
+and @samp{false} (@samp{0}) otherwise.
+
+The parameters are:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@item key
+The search key.
+@end table
+@end deftypefn
+
+@node Delete
+@chapter Removing records from the database.
+@cindex deleting records
+@cindex record, deleting
+
+To remove some data from the database, use the @code{gdbm_delete}
+function.
+
+@deftypefn {gdbm interface} int gdbm_delete (GDBM_FILE @var{dbf}, datum @var{key})
+Deletes the data associated with the given @var{key}, if it exists in
+the database @var{dbf}. The file on disk is updated to reflect the
+structure of the new database before returning from this function.
+
+The parameters are:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@item datum key
+The search key.
+@end table
+
+The function returns @samp{-1} if the item is not present or the
+requester is a reader. The return of @samp{0} marks a successful delete.
+@end deftypefn
+
+@node Sequential
+@chapter Sequential access to records.
+@cindex sequential access
+@cindex iterating over records
+@cindex records, iterating over
+
+The next two functions allow for accessing all items in the database. This
+access is not @code{key} sequential, but it is guaranteed to visit every
+@code{key} in the database once. The order has to do with the hash values.
+@code{gdbm_firstkey} starts the visit of all keys in the database.
+@code{gdbm_nextkey} finds and reads the next entry in the hash structure for
+@code{dbf}.
+
+@deftypefn {gdbm interface} datum gdbm_firstkey (GDBM_FILE @var{dbf})
+Initiate sequential access to the database @var{dbf}. The returned
+value is the first key accessed in the database. If the @samp{dptr}
+field in the returned datum is @samp{NULL}, the database contains no
+data.
+
+Otherwise, @samp{dptr} points to a memory block obtained from
+@code{malloc}, which holds the key value. The caller is responsible
+for freeing this memory block when no longer needed.
+@end deftypefn
+
+@deftypefn {gdbm interface} datum gdbm_nextkey (GDBM_FILE @var{dbf}, datum @var{prev})
+This function continues the iteration over the keys in @var{dbf},
+initiated by @code{gdbm_firstkey}. The parameter @var{prev} holds the
+value returned from a previous call to @code{gdbm_nextkey} or
+@code{gdbm_firstkey}.
+
+The function returns next key from the database. If the @samp{dptr}
+field in the returned datum is @samp{NULL}, all keys in the database
+has been visited.
+
+Otherwise, @samp{dptr} points to a memory block obtained from
+@code{malloc}, which holds the key value. The caller is responsible
+for freeing this memory block when no longer needed.
+@end deftypefn
+
+@cindex iteration loop
+These functions were intended to visit the database in read-only algorithms,
+for instance, to validate the database or similar operations. The
+usual algorithm for sequential access is:
+
+@example
+@group
+ key = gdbm_firstkey (dbf);
+ while (key.dptr)
+ @{
+ datum nextkey;
+
+ /* do something with the key */
+ ...
+
+ /* Obtain the next key */
+ nextkey = gdbm_nextkey (dbf, key);
+ /* Reclaim the memory used by the key */
+ free (key.dptr);
+ /* Use nextkey in the next iteration. */
+ key = nextkey;
+ @}
+@end group
+@end example
+
+@cindex iteration and @code{gdbm_delete}
+@cindex deletion in iteration loops
+@cindex @code{gdbm_delete} and sequential access
+Care should be taken when the @code{gdbm_delete} function is used in
+such a loop. File visiting is based on a @dfn{hash table}. The
+@code{gdbm_delete} function re-arranges the hash table to make sure
+that any collisions in the table do not leave some item
+@dfn{un-findable}. The original key order is @emph{not} guaranteed to
+remain unchanged in all instances. So it is possible that some key
+will not be visited if a loop like the following is executed:
+
+@example
+@group
+ key = gdbm_firstkey (dbf);
+ while (key.dptr)
+ @{
+ datum nextkey;
+ if (some condition)
+ @{
+ gdbm_delete (dbf, key);
+ @}
+ nextkey = gdbm_nextkey (dbf, key);
+ free (key.dptr);
+ key = nextkey;
+ @}
+@end group
+@end example
+
+@node Reorganization
+@chapter Database reorganization.
+@cindex database reorganization
+@cindex reorganization, database
+
+The following function should be used very seldom.
+
+@deftypefn {gdbm interface} int gdbm_reorganize (GDBM_FILE @var{dbf})
+Reorganizes the database.
+
+The parameter is:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@end table
+@end deftypefn
+
+If you have had a lot of deletions and would like to shrink the space
+used by the @code{gdbm} file, this function will reorganize the database.
+This results, in particular, in shortening the length of a @code{gdbm}
+file by removing the space occupied by deleted records.
+
+This reorganization requires creating a new file and inserting all the elements
+in the old file @var{dbf} into the new file. The new file is then renamed to
+the same name as the old file and @var{dbf} is updated to contain all the
+correct information about the new file. If an error is detected, the return
+value is negative. The value zero is returned after a successful
+reorganization.
+
+@node Sync
+@chapter Database Synchronization
+@cindex database synchronization
+@cindex synchronization, database
+
+@kwindex GDBM_SYNC
+Unless your database was opened with the @samp{GDBM_SYNC} flag,
+@code{gdbm} does not wait for writes to be flushed to the disk before
+continuing. This allows for faster writing of databases at the risk
+of having a corrupted database if the application terminates in an
+abnormal fashion. The following function allows the programmer to
+make sure the disk version of the database has been completely updated
+with all changes to the current time.
+
+@deftypefn {gdbm interface} void gdbm_sync (GDBM_FILE @var{dbf})
+Synchronizes the changes in @var{dbf} with its disk file. The
+parameter is a pointer returned by @code{gdbm_open}.
+
+This function would usually be called after a complete set of changes
+have been made to the database and before some long waiting time.
+The @code{gdbm_close} function automatically calls the equivalent of
+@code{gdbm_sync} so no call is needed if the database is to be closed
+immediately after the set of changes have been made.
+@end deftypefn
+
+@node Flat files
+@chapter Export and Import
+@cindex Flat file format
+@cindex export
+@cindex import
+@code{Gdbm} databases can be converted into so-called @dfn{flat
+format} files. Such files cannot be used for searching, their sole
+purpose is to keep the data from the database for restoring it when
+the need arrives. There are two flat file formats, which differ in
+the way they represent the data and in the amount of meta-information
+stored. Both formats can be used, for example, to migrate between
+the different versions of @code{gdbm} databases. Generally speaking,
+flat files are safe to send over the network, and can be used to
+recreate the database on another machine. The recreated database is
+guaranteed to be a byte-to-byte equivalent of the database from which
+the flat file was created. This does not necessarily mean, however,
+that this file can be used in the same way as the original one. For
+example, if the original database contained non-@acronym{ASCII} data
+(e.g.@: @acronym{C} structures, integers etc.), the recreated database
+can be of any use only if the target machine has the same integer
+size and byte ordering as the source one and if its @acronym{C}
+compiler uses the same packing conventions as the one which generated
+@acronym{C} which populated the original database. In general, such
+binary databases are not portable between machines, unless you follow
+some stringent rules on what data is written to them and how it is
+interpreted.
+
+The GDBM version @value{VERSION} supports two flat file formats. The
+@dfn{binary} flat file format was first implemented in GDBM version
+1.9.1. This format stores only key/data pairs, it does not keep
+information about the database file itself. As its name implies,
+files in this format are binary files.
+
+The @dfn{ascii} flat file format encodes all data in base64 and stores
+not only key/data pairs, but also the original database file metadata,
+such as file name, mode and ownership. Files in this format can be
+sent without additional encapsulation over transmission channels that
+normally allow only ASCII data, such as, e.g.@: SMTP. Due to additional
+metadata they allow for restoring an exact copy of the database,
+including file ownership and privileges, which is especially important
+if the database in question contained some security-related data.
+
+We call a process of creating a flat file from a database
+@dfn{exporting} or @dfn{dumping} this database. The reverse process,
+creating the database from a flat file is called @dfn{importing} or
+@dfn{loading} the database.
+
+@deftypefn {gdbm interface} int gdbm_dump (GDBM_FILE @var{dbf}, @
+ const char *@var{filename}, int @var{format}, @
+ int @var{open_flags}, int @var{mode})
+Dumps the database file to the named file in requested format.
+Arguments are:
+
+@table @var
+@item dbf
+A pointer to the source database, returned by a prior call to
+@code{gdbm_open}.
+
+@item filename
+Name of the dump file.
+
+@item format
+Output file format. Allowed values are: @samp{GDBM_DUMP_FMT_BINARY} to
+create a binary dump and @samp{GDBM_DUMP_FMT_ASCII} to create an ASCII
+dump file.
+
+@item open_flags
+How to create the output file. If @var{flag} is @samp{GDBM_WRCREAT}
+the file will be created if it does not exist. If it does exist,
+the @code{gdbm_dump} will fail.
+
+If @var{flag} is @samp{GDBM_NEWDB}, the function will create a new
+output file, replacing it if it already exists.
+
+@item mode
+The permissions to use when creating the output file.
+See @ifhtml
+@uref{http://www.manpagez.com/man/2/open},
+@end ifhtml
+@ifnothtml
+@ref{open,,open a file,open(2), open(2) man page},
+@end ifnothtml
+for a detailed discussion.
+@end table
+@end deftypefn
+
+@anchor{gdbm_load function}
+@deftypefn {gdbm interface} int gdbm_load (GDBM_FILE *@var{pdbf}, @
+ const char *@var{filename}, int @var{flag}, @
+ int @var{meta_mask}, @
+ unsigned long *@var{errline})
+Loads data from the dump file @var{filename} into the database pointed
+to by @var{pdbf}. The latter can point to @samp{NULL}, in which case
+the function will try to create a new database. If it succeeds, the
+function will return, in the memory location pointed to by @var{pdbf},
+a pointer to the newly created database. If the dump file carries no
+information about the original database file name, the function will
+set @code{gdbm_errno} to @samp{GDBM_NO_DBNAME} and return
+@samp{-1}, indicating failure.
+
+The @var{flag} has the same meaning as the @var{flag} argument
+to the @code{gdbm_store} function (@pxref{Store}).
+
+The @var{meta_mask} argument can be used to disable restoring certain
+bits of file's meta-data from the information in the input dump file.
+It is a binary OR of zero or more of the following:
+
+@table @asis
+@item GDBM_META_MASK_MODE
+Do not restore file mode.
+
+@item GDBM_META_MASK_OWNER
+Do not restore file owner.
+@end table
+
+The function returns 0 upon successful completion or -1 on fatal
+errors and 1 on mild (non-fatal) errors.
+
+If a fatal error occurs, @code{gdbm_errno} will be set to one of the
+following values:
+
+@table @asis
+@item GDBM_FILE_OPEN_ERROR
+Input file (@var{filename}) cannot be opened. The @code{errno}
+variable can be used to get more detail about the failure.
+
+@item GDBM_MALLOC_ERROR
+Not enough memory to load data.
+
+@item GDBM_FILE_READ_ERROR
+Reading from @var{filename} failed. The @code{errno} variable can be
+used to get more detail about the failure.
+
+@item GDBM_ILLEGAL_DATA
+Input contained some illegal data.
+
+@item GDBM_ITEM_NOT_FOUND
+This error can occur only when the input file is in ASCII format. It
+indicates that the data part of the record about to be read lacked
+length specification. Application developers are advised to treat
+this error equally as @samp{GDBM_ILLEGAL_DATA}.
+@end table
+
+Mild errors mean that the function was able to successfully load and
+restore the data, but was unable to change database file metadata
+afterward. The table below lists possible values for @code{gdbm_errno}
+in this case. To get more detail, inspect the system @code{errno} variable.
+
+@table @asis
+@kwindex GDBM_ERR_FILE_OWNER
+@item GDBM_ERR_FILE_OWNER
+The function was unable to restore database file owner.
+
+@kwindex GDBM_ERR_FILE_MODE
+@item GDBM_ERR_FILE_MODE
+The function was unable to restore database file mode (permission bits).
+@end table
+
+If an error occurs while loading data from an input file in ASCII
+format, the number of line in which the error occurred will be stored
+in the location pointed to by the @var{errline} parameter, unless it
+is @samp{NULL}.
+
+If the line information is not available or applicable, @var{errline}
+will be set to @samp{0}.
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_dump_to_file (GDBM_FILE @var{dbf}, @
+ FILE *@var{fp}, int @var{format})
+This is an alternative entry point to @code{gdbm_dump} (which see).
+Arguments are:
+
+@table @var
+@item dbf
+A pointer to the source database, returned by a call to
+@code{gdbm_open}.
+
+@item fp
+File to write the data to.
+
+@item format
+Format of the dump file. See the @var{format} argument to the
+@code{gdbm_dump} function.
+@end table
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_load_from_file (GDBM_FILE *@var{pdbf}, @
+ FILE *@var{fp}, int @var{replace}, int @var{meta_mask}, @
+ unsigned long *@var{line})
+This is an alternative entry point to @code{gdbm_dump}. It writes the
+output to @var{fp} which must be a file open for writing. The rest of
+arguments is the same as for @code{gdbm_load} (excepting of course
+@var{flag}, which is not needed in this case).
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_export (GDBM_FILE @var{dbf}, @
+ const char *@var{exportfile}, int @var{flag}, int @var{mode})
+This function is retained for compatibility with GDBM 1.10 and
+earlier. It dumps the database to a file in binary dump format and
+is entirely equivalent to
+
+@example
+gdbm_dump(@var{dbf}, @var{exportfile}, GDBM_DUMP_FMT_BINARY,
+ @var{flag}, @var{mode})
+@end example
+
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_export_to_file (GDBM_FILE @var{dbf}, FILE *@var{fp})
+This is an alternative entry point to @code{gdbm_export}. This
+function writes to file @var{fp} a binary dump of the database @var{dbf}.
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_import (GDBM_FILE @var{dbf}, @
+ const char *@var{importfile}, int @var{flag})
+This function is retained for compatibility with GDBM 1.10 and
+earlier. It loads the file @var{importfile}, which must be a binary
+flat file, into the database @var{dbf} and is equivalent to the
+following construct:
+
+@example
+@var{dbf} = gdbm_open (@var{importfile}, 0,
+ @var{flag} == GDBM_REPLACE ?
+ GDBM_WRCREAT : GDBM_NEWDB,
+ 0600, NULL);
+gdbm_load (&@var{dbf}, @var{exportfile}, 0, @var{flag}, NULL)
+@end example
+@end deftypefn
+
+@deftypefn {gdbm interface} int gdbm_import_from_file (GDBM_FILE @var{dbf}, @
+ FILE *@var{fp}, int @var{flag})
+An alternative entry point to @code{gdbm_import}. Reads the binary
+dump from the file @var{fp} and stores the key/value pairs to
+@var{dbf}. @xref{Store}, for a description of @var{flag}.
+
+This function is equivalent to:
+
+@example
+@var{dbf} = gdbm_open (@var{importfile}, 0,
+ @var{flag} == GDBM_REPLACE ?
+ GDBM_WRCREAT : GDBM_NEWDB,
+ 0600, NULL);
+gdbm_load_from_file (@var{dbf}, @var{fp}, @var{flag}, 0, NULL);
+@end example
+@end deftypefn
+
+@node Errors
+@chapter Error strings.
+@cindex error strings
+
+To convert a @code{gdbm} error code into English text, use this
+routine:
+
+@deftypefn {gdbm interface} {const char *} gdbm_strerror (gdbm_error @var{errno})
+Converts @var{errno} (which is an integer value) into a human-readable
+descriptive text. Returns a pointer to a static string. The caller
+must not alter or free the returned pointer.
+
+The @var{errno} argument is usually the value of the global variable
+@code{gdbm_errno}. @xref{Variables, gdbm_errno}.
+@end deftypefn
+
+@node Options
+@chapter Setting options
+@cindex database options
+@cindex options, database
+
+@code{Gdbm} supports the ability to set certain options on an already
+open database.
+
+@deftypefn {gdbm interface} int gdbm_setopt (GDBM_FILE @var{dbf}, int @var{option}, @
+ void *@var{value}, int @var{size})
+Sets an option on the database or returns the value of an option.
+
+The parameters are:
+
+@table @var
+@item dbf
+The pointer returned by @code{gdbm_open}.
+@item option
+The option to be set or retrieved.
+@item value
+A pointer to the value to which @var{option} will be set or where to
+place the option value (depending on the option).
+@item size
+The length of the data pointed to by @var{value}.
+@end table
+@end deftypefn
+
+The valid options are:
+
+@table @asis
+@kwindex GDBM_CACHESIZE
+@kwindex GDBM_SETCACHESIZE
+@item GDBM_SETCACHESIZE
+@itemx GDBM_CACHESIZE
+Set the size of the internal bucket cache. This option may only be
+set once on each GDBM_FILE descriptor, and is set automatically to 100
+upon the first access to the database. The @var{value} should point
+to a @code{size_t} holding the desired cache size.
+
+The @samp{GDBM_CACHESIZE} option is provided for compatibility with
+earlier versions.
+
+@kwindex GDBM_GETCACHESIZE
+@item GDBM_GETCACHESIZE
+Return the size of the internal bucket cache. The @var{value} should
+point to a @code{size_t} variable, where the size will be stored.
+
+@kwindex GDBM_GETFLAGS
+@item GDBM_GETFLAGS
+Return the flags describing the state of the database. The @var{value} should
+point to a @code{int} variable where to store the flags. The return
+is the same as the flags used when opening the database (@pxref{Open,
+gdbm_open}), except that it reflects the current state (which may have
+been altered by another calls to @code{gdbm_setopt}.
+
+@kwindex GDBM_FASTMODE
+@item GDBM_FASTMODE
+Enable or disable the @dfn{fast writes mode}, i.e.@: writes without
+subsequent synchronization. The @var{value} should point
+to an integer: @samp{TRUE} to enable fast mode, and @samp{FALSE} to
+disable it.
+
+This option is retained for compatibility with previous versions of
+@code{gdbm}. Its effect is the reverse of @code{GDBM_SETSYNCMODE}
+(see below).
+
+@kwindex GDBM_SETSYNCMODE
+@kwindex GDBM_SYNCMODE
+@item GDBM_SETSYNCMODE
+@itemx GDBM_SYNCMODE
+Turn on or off file system synchronization operations. This
+setting defaults to off. The @var{value} should point
+to an integer: @samp{TRUE} to turn synchronization on, and @samp{FALSE} to
+turn it off.
+
+Note, that this option is a reverse of @code{GDBM_FASTMODE},
+i.e.@: calling @code{GDBM_SETSYNCMODE} with @samp{TRUE} has the same effect
+as calling @code{GDBM_FASTMODE} with @samp{FALSE}.
+
+The @samp{GDBM_SYNCMODE} option is provided for compatibility with
+earlier versions.
+
+@kwindex GDBM_GETSYNCMODE
+@item GDBM_GETSYNCMODE
+Return the current synchronization status. The @var{value} should
+point to an @code{int} where the status will be stored.
+
+@kwindex GDBM_SETCENTFREE
+@kwindex GDBM_CENTFREE
+@item GDBM_SETCENTFREE
+@itemx GDBM_CENTFREE
+@emph{NOTICE: This feature is still under study.}
+
+Set central free block pool to either on or off. The default is off,
+which is how previous versions of @code{gdbm} handled free blocks. If
+set, this option causes all subsequent free blocks to be placed in the
+@emph{global} pool, allowing (in theory) more file space to be reused
+more quickly. The @var{value} should point to an integer: @samp{TRUE} to
+turn central block pool on, and @samp{FALSE} to turn it off.
+
+The @samp{GDBM_CENTFREE} option is provided for compatibility with
+earlier versions.
+
+@kwindex GDBM_SETCOALESCEBLKS
+@kwindex GDBM_COALESCEBLKS
+@item GDBM_SETCOALESCEBLKS
+@itemx GDBM_COALESCEBLKS
+@emph{NOTICE: This feature is still under study.}
+
+Set free block merging to either on or off. The default is off, which
+is how previous versions of @code{gdbm} handled free blocks. If set,
+this option causes adjacent free blocks to be merged. This can become
+a @acronym{CPU} expensive process with time, though, especially if
+used in conjunction with GDBM_CENTFREE. The @var{value} should point
+to an integer: @samp{TRUE} to turn free block merging on, and @samp{FALSE} to
+turn it off.
+
+@kwindex GDBM_GETCOALESCEBLKS
+@item GDBM_GETCOALESCEBLKS
+Return the current status of free block merging. The @var{value} should
+point to an @code{int} where the status will be stored.
+
+@kwindex GDBM_SETMAXMAPSIZE
+@item GDBM_SETMAXMAPSIZE
+Sets maximum size of a memory mapped region. The @var{value} should
+point to a value of type @code{size_t}, @code{unsigned long} or
+@code{unsigned}. The actual value is rounded to the nearest page
+boundary (the page size is obtained from
+@code{sysconf(_SC_PAGESIZE)}).
+
+@kwindex GDBM_GETMAXMAPSIZE
+@item GDBM_GETMAXMAPSIZE
+Return the maximum size of a memory mapped region. The @var{value} should
+point to a value of type @code{size_t} where to return the data.
+
+@kwindex GDBM_SETMMAP
+@item GDBM_SETMMAP
+Enable or disable memory mapping mode. The @var{value} should point
+to an integer: @samp{TRUE} to enable memory mapping or @samp{FALSE} to
+disable it.
+
+@kwindex GDBM_GETMMAP
+@item GDBM_GETMMAP
+Check whether memory mapping is enabled. The @var{value} should point
+to an integer where to return the status.
+
+@kwindex GDBM_GETDBNAME
+@item GDBM_GETDBNAME
+Return the name of the database disk file. The @var{value} should
+point to a variable of type @code{char**}. A pointer to the newly
+allocated copy of the file name will be placed there. The caller is
+responsible for freeing this memory when no longer needed. For
+example:
+
+@example
+char *name;
+
+if (gdbm_setopt (dbf, GDBM_GETDBNAME, &name, sizeof (name)))
+ @{
+ fprintf (stderr, "gdbm_setopt failed: %s\n",
+ gdbm_strerror (gdbm_errno));
+ @}
+else
+ @{
+ printf ("database name: %s\n", name);
+ free (name);
+ @}
+@end example
+
+@end table
+
+The return value will be @samp{-1} upon failure, or @samp{0} upon
+success. The global variable @code{gdbm_errno} will be set upon failure.
+
+For instance, to set a database to use a cache of 10, after opening it
+with @code{gdbm_open}, but prior to accessing it in any way, the following
+code could be used:
+
+@example
+@group
+int value = 10;
+ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int));
+@end group
+@end example
+
+@node Locking
+@chapter File Locking.
+@cindex locking
+
+@kwindex GDBM_NOLOCK
+With locking disabled (if @code{gdbm_open} was called with @samp{GDBM_NOLOCK}),
+the user may want to perform their own file locking on the database file
+in order to prevent multiple writers operating on the same file
+simultaneously.
+
+In order to support this, the @code{gdbm_fdesc} routine is provided.
+
+@deftypefn {gdbm interface} int gdbm_fdesc (GDBM_FILE @var{dbf})
+Returns the file descriptor of the database @var{dbf}. This value
+can be used as an argument to @code{flock}, @code{lockf} or similar
+calls.
+@end deftypefn
+
+@node Variables
+@chapter Useful global variables.
+
+The following global variables and constants are available:
+
+@deftypevar gdbm_error gdbm_errno
+This variable contains error code from the last failed @code{gdbm}
+call. @xref{Error codes}, for a list of available error codes and
+their descriptions.
+
+Use @code{gdbm_strerror} (@pxref{Errors}) to convert it to a
+descriptive text.
+@end deftypevar
+
+@deftypevar {const char *} gdbm_errlist[]
+This variable is an array of error descriptions, which is used by
+@code{gdbm_strerror} to convert error codes to human-readable text
+(@pxref{Errors}). You can access it directly, if you wish so. It
+contains @code{_GDBM_MAX_ERRNO + 1} elements and can be directly
+indexed by the error code to obtain a corresponding descriptive
+text.
+@end deftypevar
+
+@defvr {Constant} _GDBM_MIN_ERRNO
+The minimum error code used by @code{gdbm}.
+@end defvr
+
+@defvr {Constant} _GDBM_MAX_ERRNO
+The maximum error code used by @code{gdbm}.
+@end defvr
+
+@cindex version number
+@deftypevar {const char *} gdbm_version
+A string containing the version information.
+@end deftypevar
+
+@deftypevar {int const} gdbm_version_number[3]
+This variable contains the @code{gdbm} version numbers:
+
+@multitable @columnfractions 0.4 0.5
+@headitem Index @tab Meaning
+@item 0 @tab Major number
+@item 1 @tab Minor number
+@item 2 @tab Patchlevel number
+@end multitable
+
+Additionally, the following constants are defined in the @file{gdbm.h}
+file:
+
+@table @asis
+@kwindex GDBM_VERSION_MAJOR
+@item GDBM_VERSION_MAJOR
+Major number.
+
+@kwindex GDBM_VERSION_MINOR
+@item GDBM_VERSION_MINOR
+Minor number.
+
+@kwindex GDBM_VERSION_PATCH
+@item GDBM_VERSION_PATCH
+Patchlevel number.
+@end table
+
+These can be used to verify whether the header file matches the library.
+@end deftypevar
+
+To compare two split-out version numbers, use the following function:
+
+@deftypefn {gdbm interface} int gdbm_version_cmp (int const @var{a}[3], @
+ int const @var{b}[3])
+Compare two version numbers. Return @samp{-1} if @var{a} is less than
+@var{b}, @samp{1} if @var{a} is greater than @var{b} and @samp{0} if
+they are equal.
+
+Comparison is done from left to right, so that:
+
+@example
+a = @{ 1, 8, 3 @};
+b = @{ 1, 8, 3 @};
+gdbm_version_cmp (a, b) @result{} 0
+
+a = @{ 1, 8, 3 @};
+b = @{ 1, 8, 2 @};
+gdbm_version_cmp (a, b) @result{} 1
+
+a = @{ 1, 8, 3 @};
+b = @{ 1, 9. 0 @};
+gdbm_version_cmp (a, b) @result{} -1
+@end example
+@end deftypefn
+
+@node Error codes
+@chapter Error codes
+@cindex error codes
+
+This chapter summarizes error codes which can be set by the
+functions in @code{gdbm} library.
+
+@table @asis
+@kwindex GDBM_NO_ERROR
+@item GDBM_NO_ERROR
+No error occurred.
+
+@kwindex GDBM_MALLOC_ERROR
+@item GDBM_MALLOC_ERROR
+Memory allocation failed. Not enough memory.
+
+@kwindex GDBM_BLOCK_SIZE_ERROR
+@item GDBM_BLOCK_SIZE_ERROR
+This error is set by the @code{gdbm_open} function (@pxref{Open}), if
+the value of its @var{block_size} argument is incorrect.
+
+@kwindex GDBM_FILE_OPEN_ERROR
+@item GDBM_FILE_OPEN_ERROR
+The library was not able to open a disk file. This can be set by
+@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and
+@code{gdbm_import} functions (@pxref{Flat files}).
+
+Inspect the value of the system @code{errno} variable to get more
+detailed diagnostics.
+
+@kwindex GDBM_FILE_WRITE_ERROR
+@item GDBM_FILE_WRITE_ERROR
+Writing to a disk file failed. This can be set by
+@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and
+@code{gdbm_import} functions.
+
+Inspect the value of the system @code{errno} variable to get more
+detailed diagnostics.
+
+@kwindex GDBM_FILE_SEEK_ERROR
+@item GDBM_FILE_SEEK_ERROR
+Positioning in a disk file failed. This can be set by
+@code{gdbm_open} (@pxref{Open}) function.
+
+Inspect the value of the system @code{errno} variable to get a more
+detailed diagnostics.
+
+@kwindex GDBM_FILE_READ_ERROR
+@item GDBM_FILE_READ_ERROR
+Reading from a disk file failed. This can be set by
+@code{gdbm_open} (@pxref{Open}), @code{gdbm_export} and
+@code{gdbm_import} functions.
+
+Inspect the value of the system @code{errno} variable to get a more
+detailed diagnostics.
+
+@kwindex GDBM_BAD_MAGIC_NUMBER
+@item GDBM_BAD_MAGIC_NUMBER
+The file given as argument to @code{gdbm_open} function is not a valid
+@code{gdbm} file: it has a wrong magic number.
+
+@kwindex GDBM_EMPTY_DATABASE
+@item GDBM_EMPTY_DATABASE
+The file given as argument to @code{gdbm_open} function is not a valid
+@code{gdbm} file: it has zero length.
+
+@kwindex GDBM_CANT_BE_READER
+@item GDBM_CANT_BE_READER
+This error code is set by the @code{gdbm_open} function if it is not
+able to lock file when called in @samp{GDBM_READER} mode (@pxref{Open,
+GDBM_READER}).
+
+@kwindex GDBM_CANT_BE_WRITER
+@item GDBM_CANT_BE_WRITER
+This error code is set by the @code{gdbm_open} function if it is not
+able to lock file when called in writer mode (@pxref{Open}).
+
+@kwindex GDBM_READER_CANT_DELETE
+@item GDBM_READER_CANT_DELETE
+Set by the @code{gdbm_delete} (@pxref{Delete}) if it attempted to
+operate on a database that is open in read-only mode (@pxref{Open,
+GDBM_READER}).
+
+@kwindex GDBM_READER_CANT_STORE
+@item GDBM_READER_CANT_STORE
+Set by the @code{gdbm_store} (@pxref{Store}) if it attempted to
+operate on a database that is open in read-only mode (@pxref{Open,
+GDBM_READER}).
+
+@kwindex GDBM_READER_CANT_REORGANIZE
+@item GDBM_READER_CANT_REORGANIZE
+Set by the @code{gdbm_reorganize} (@pxref{Reorganization}) if it attempted to
+operate on a database that is open in read-only mode (@pxref{Open,
+GDBM_READER}).
+
+@kwindex GDBM_UNKNOWN_UPDATE
+@item GDBM_UNKNOWN_UPDATE
+Currently unused. Reserved for future uses.
+
+@kwindex GDBM_ITEM_NOT_FOUND
+@item GDBM_ITEM_NOT_FOUND
+Requested item was not found. This error is set by @code{gdbm_delete}
+(@pxref{Delete}) and @code{gdbm_fetch} (@pxref{Fetch}) when the requested
+@var{key} value is not found in the database.
+
+@kwindex GDBM_REORGANIZE_FAILED
+@item GDBM_REORGANIZE_FAILED
+The @code{gdbm_reorganize} function is not
+able to create a temporary database. @xref{Reorganization}.
+
+@kwindex GDBM_CANNOT_REPLACE
+@item GDBM_CANNOT_REPLACE
+Cannot replace existing item. This error is set by the
+@code{gdbm_store} if the requested @var{key} value is found in the
+database and the @var{flag} parameter is not @samp{GDBM_REPLACE}.
+@xref{Store}, for a detailed discussion.
+
+@kwindex GDBM_ILLEGAL_DATA
+@item GDBM_ILLEGAL_DATA
+Either @var{key} or @var{content} parameter was wrong in a call to
+to @code{gdbm_store} (@pxref{Store}).
+
+@kwindex GDBM_OPT_ALREADY_SET
+@item GDBM_OPT_ALREADY_SET
+Requested option can be set only once and was already set. This error
+is returned by the @code{gdbm_setopt} function. @xref{Options,
+GDBM_CACHESIZE}.
+
+@kwindex GDBM_OPT_ILLEGAL
+@item GDBM_OPT_ILLEGAL
+The @var{option} argument is not valid or the @var{value} argument
+points to an invalid value in a call to @code{gdbm_setopt} function.
+@xref{Options}.
+
+@kwindex GDBM_BYTE_SWAPPED
+@item GDBM_BYTE_SWAPPED
+The @code{gdbm_open} function (@pxref{Open}) attempts to open a
+database which is created on a machine with different byte ordering.
+
+@kwindex GDBM_BAD_FILE_OFFSET
+@item GDBM_BAD_FILE_OFFSET
+The @code{gdbm_open} function (@pxref{Open}) sets this error code if
+the file it tries to open has a wrong magic number.
+
+@kwindex GDBM_BAD_OPEN_FLAGS
+@item GDBM_BAD_OPEN_FLAGS
+Set by the @code{gdbm_export} function if supplied an invalid
+@var{flags} argument. @xref{Flat files}.
+
+@kwindex GDBM_FILE_STAT_ERROR
+@item GDBM_FILE_STAT_ERROR
+Getting information about a disk file failed. The system @code{errno}
+will give more details about the error.
+
+This error can be set by the following functions: @code{gdbm_open},
+@code{gdbm_reorganize}.
+
+@kwindex GDBM_FILE_EOF
+@item GDBM_FILE_EOF
+End of file was encountered where more data was expected to be
+present. This error can occur when fetching data from the database
+and usually means that the database is truncated or otherwise corrupted.
+
+This error can be set by any GDBM function that does I/O. Some of
+these functions are: @code{gdbm_delete}, @code{gdbm_exists},
+@code{gdbm_fetch}, @code{gdbm_export}, @code{gdbm_import},
+@code{gdbm_reorganize}, @code{gdbm_firstkey}, @code{gdbm_nextkey},
+@code{gdbm_store}.
+
+@kwindex GDBM_NO_DBNAME
+@item GDBM_NO_DBNAME
+Output database name is not specified. This error code is set by
+@code{gdbm_load} (@pxref{gdbm_load function,,gdbm_load}) if the first
+argument points to @samp{NULL} and the input file does not specify the
+database name.
+
+@kwindex GDBM_ERR_FILE_OWNER
+@item GDBM_ERR_FILE_OWNER
+This error code is set by @code{gdbm_load} if it is unable to restore
+database file owner. It is a mild error condition, meaning that the
+data have been restored successfully, only changing the target file
+owner failed. Inspect the system @code{errno} variable to get a more
+detailed diagnostics.
+
+@kwindex GDBM_ERR_FILE_MODE
+@item GDBM_ERR_FILE_MODE
+This error code is set by @code{gdbm_load} if it is unable to restore
+database file mode. It is a mild error condition, meaning that the data
+have been restored successfully, only changing the target file owner
+failed. Inspect the system @code{errno} variable to get a more
+detailed diagnostics.
+
+@end table
+
+@node Compatibility
+@chapter Compatibility with standard @code{dbm} and @code{ndbm}.
+
+@cindex compatibility layer
+@code{Gdbm} includes a compatibility layer, which provides traditional
+@samp{ndbm} and older @samp{dbm} functions. The layer is compiled and
+installed if the @option{--enable-libgdbm-compat} option is used when
+configuring the package.
+
+@findex ndbm.h
+@findex dbm.h
+@findex libgdbm_compat
+The compatibility layer consists of two header files: @file{ndbm.h}
+and @file{dbm.h} and the @file{libgdbm_compat} library.
+
+Older programs using @code{ndbm} or @code{dbm} interfaces can
+use @file{libgdbm_compat} without any changes. To link a program with
+the compatibility library, add the following two options to the
+@command{cc} invocation: @option{-lgdbm -lgdbm_compat}. The @option{-L}
+option may also be required, depending on where @code{gdbm} is
+installed, e.g.:
+
+@example
+cc ... -L/usr/local/lib -lgdbm -lgdbm_compat
+@end example
+
+@cindex @samp{dir} file
+@cindex @samp{pag} file
+Databases created and manipulated by the compatibility interfaces
+consist of two different files: @file{@var{file}.dir} and
+@file{@var{file}.pag}. This is required by the @acronym{POSIX}
+specification and corresponds to the traditional usage. Note,
+however, that despite the similarity of the naming convention,
+actual data stored in these files has not the same format as
+in the databases created by other @code{dbm} or @code{ndbm}
+libraries. In other words, you cannot access a standard UNIX
+@code{dbm} file with GNU @code{dbm}!
+
+GNU @code{dbm} files are not @code{sparse}. You can copy them with
+the usual @code{cp} command and they will not expand in the copying
+process.
+
+@menu
+* ndbm:: NDBM interface functions.
+* dbm:: DBM interface functions.
+@end menu
+
+@node ndbm
+@section NDBM interface functions.
+@cindex NDBM functions
+
+The functions below implement the @acronym{POSIX} @samp{ndbm} interface:
+
+@deftypefn {ndbm} {DBM *} dbm_open (char *@var{file}, int @var{flags}, int @var{mode})
+Opens a database. The @var{file} argument is the full name of the
+database file to be opened. The function opens two files:
+@file{@var{file}.pag} and @file{@var{file}.dir}. The @var{flags} and
+@var{mode} arguments have the same meaning as the second and third
+arguments of
+@ifhtml
+@uref{http://www.manpagez.com/man/2/open,,open(2)},
+@end ifhtml
+@ifnothtml
+@code{open} (@pxref{open,,open a file,open(2), open(2) man page}),
+@end ifnothtml
+except that a database opened for write-only access opens the files
+for read and write access and the behavior of the @code{O_APPEND} flag is
+unspecified.
+
+The function returns a pointer to the @code{DBM} structure describing
+the database. This pointer is used to refer to this database in all
+operations described below.
+
+Any error detected will cause a return value of @samp{NULL} and an
+appropriate value will be stored in @code{gdbm_errno}
+(@pxref{Variables}).
+@end deftypefn
+
+@deftypefn {ndbm} void dbm_close (DBM *@var{dbf})
+Closes the database. The @var{dbf} argument must be a pointer
+returned by an earlier call to @code{dbm_open}.
+@end deftypefn
+
+@deftypefn {ndbm} datum dbm_fetch (DBM *@var{dbf}, datum @var{key})
+Reads a record from the database with the matching key. The @var{key}
+argument supplies the key that is being looked for.
+
+If no matching record is found, the @code{dptr} member of the returned
+datum is @samp{NULL}. Otherwise, the @code{dptr} member of the
+returned datum points to the memory managed by the compatibility
+library. The application should never free it.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_store (DBM *@var{dbf}, datum @var{key}, @
+ datum @var{content}, int @var{mode})
+Writes a key/value pair to the database. The argument @var{dbf} is a
+pointer to the @code{DBM} structure returned from a call to
+@code{dbm_open}. The @var{key} and @var{content} provide the values
+for the record key and content. The @var{mode} argument controls
+the behavior of @code{dbm_store} in case a matching record already
+exists in the database. It can have one of the following two values:
+
+@table @code
+@kwindex DBM_REPLACE
+@item DBM_REPLACE
+Replace existing record with the new one.
+
+@kwindex DBM_INSERT
+@item DBM_INSERT
+The existing record is left unchanged, and the function returns
+@samp{1}.
+@end table
+
+If no matching record exists in the database, new record will be
+inserted no matter what the value of the @var{mode} is.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_delete (DBM *@var{dbf}, datum @var{key})
+Deletes the record with the matching key from the database. If the
+function succeeds, @samp{0} is returned. Otherwise, if no matching
+record is found or if an error occurs, @samp{-1} is returned.
+@end deftypefn
+
+@deftypefn {ndbm} datum dbm_firstkey (DBM *@var{dbf})
+Initializes iteration over the keys from the database and returns
+the first key. Note, that the word @samp{first} does not imply any
+specific ordering of the keys.
+
+If there are no records in the database, the @code{dptr} member of the
+returned datum is @samp{NULL}. Otherwise, the @code{dptr} member of
+the returned datum points to the memory managed by the compatibility
+library. The application should never free it.
+@end deftypefn
+
+@deftypefn {ndbm} datum dbm_nextkey (DBM *@var{dbf})
+Continues the iteration started by @code{dbm_firstkey}. Returns the
+next key in the database. If the iteration covered all keys in the
+database, the @code{dptr} member of the returned datum is @samp{NULL}.
+Otherwise, the @code{dptr} member of the returned datum points to the
+memory managed by the compatibility library. The application should
+never free it.
+
+@cindex sequential access, using @samp{NDBM}
+@cindex iteration loop, using @samp{NDBM}
+The usual way of iterating over all the records in the database is:
+
+@example
+for (key = dbm_firstkey (dbf);
+ key.ptr;
+ key = dbm_nextkey (dbf))
+ @{
+ /* do something with the key */
+ @}
+@end example
+
+The loop above should not try to delete any records from the database,
+otherwise the iteration is not guaranteed to cover all the keys.
+@xref{Sequential}, for a detailed discussion of this.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_error (DBM *@var{dbf})
+Returns the error condition of the database: @samp{0} if no errors
+occurred so far while manipulating the database, and a non-zero value
+otherwise.
+@end deftypefn
+
+@deftypefn {ndbm} void dbm_clearerr (DBM *@var{dbf})
+Clears the error condition of the database.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_dirfno (DBM *@var{dbf})
+Returns the file descriptor of the @samp{dir} file of the database.
+It is guaranteed to be different from the descriptor returned by
+the @code{dbm_pagfno} function (see below).
+
+The application can lock this descriptor to serialize accesses to the
+database.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_pagfno (DBM *@var{dbf})
+Returns the file descriptor of the @samp{pag} file of the database.
+See also @code{dbm_dirfno}.
+@end deftypefn
+
+@deftypefn {ndbm} int dbm_rdonly (DBM *@var{dbf})
+Returns @samp{1} if the database @var{dbf} is open in a read-only mode
+and @samp{0} otherwise.
+@end deftypefn
+
+@node dbm
+@section DBM interface functions.
+@cindex DBM functions
+
+The functions below are provided for compatibility with the old
+UNIX @samp{DBM} interface. Only one database at a time can be
+manipulated using them.
+
+@deftypefn {dbm} int dbminit (char *@var{file})
+Opens a database. The @var{file} argument is the full name of the
+database file to be opened. The function opens two files:
+@file{@var{file}.pag} and @file{@var{file}.dir}. If any of
+them does not exist, the function fails. It never attempts to create
+the files.
+
+The database is opened in the read-write mode, if its disk permissions
+permit.
+
+The application must ensure that the functions described below in
+this section are called only after a successful call to @code{dbminit}.
+@end deftypefn
+
+@deftypefn {dbm} int dbmclose (void)
+Closes the database opened by an earlier call to @code{dbminit}.
+@end deftypefn
+
+@deftypefn {dbm} datum fetch (datum @var{key})
+Reads a record from the database with the matching key. The @var{key}
+argument supplies the key that is being looked for.
+
+If no matching record is found, the @code{dptr} member of the returned
+datum is @samp{NULL}. Otherwise, the @code{dptr} member of the
+returned datum points to the memory managed by the compatibility
+library. The application should never free it.
+@end deftypefn
+
+@deftypefn {dbm} int store (datum @var{key}, datum @var{content})
+Stores the key/value pair in the database. If a record with the
+matching key already exists, its content will be replaced with the new
+one.
+
+Returns @samp{0} on success and @samp{-1} on error.
+@end deftypefn
+
+@deftypefn {dbm} int delete (datum @var{key})
+Deletes a record with the matching key.
+
+If the function succeeds, @samp{0} is returned. Otherwise, if no
+matching record is found or if an error occurs, @samp{-1} is
+returned.
+@end deftypefn
+
+@deftypefn {dbm} datum firstkey (void)
+Initializes iteration over the keys from the database and returns
+the first key. Note, that the word @samp{first} does not imply any
+specific ordering of the keys.
+
+If there are no records in the database, the @code{dptr} member of the
+returned datum is @samp{NULL}. Otherwise, the @code{dptr} member of
+the returned datum points to the memory managed by the compatibility
+library. The application should never free it.
+@end deftypefn
+
+@deftypefn {dbm} datum nextkey (datum @var{key})
+Continues the iteration started by a call to @code{firstkey}. Returns
+the next key in the database. If the iteration covered all keys in the
+database, the @code{dptr} member of the returned datum is @samp{NULL}.
+Otherwise, the @code{dptr} member of the returned datum points to the
+memory managed by the compatibility library. The application should
+never free it.
+@end deftypefn
+
+@node gdbmtool
+@chapter Examine and modify a GDBM database.
+@prindex gdbmtool
+
+The @command{gdbmtool} utility allows you to view and modify an
+existing @acronym{GDBM} database or to create a new one.
+
+@cindex default database, @command{gdbmtool}
+@flindex junk.gdbm
+When invoked without arguments, it tries to open a database file called
+@file{junk.gdbm}, located in the current working directory. You can
+change this default by supplying the name of the database to use as
+an argument to the program, e.g.:
+
+@example
+$ gdbmtool file.db
+@end example
+
+@cindex read-only mode, @command{gdbmtool}
+@cindex @option{-r}, @command{gdbmtool} option
+@cindex @option{--read-only}, @command{gdbmtool} option
+The database will be opened in read-write mode, unless the
+@option{-r} (@option{--read-only}) option is specified, in which case
+it will be opened only for reading.
+
+@cindex creating a database, @command{gdbmtool}
+@cindex @option{-n}, @command{gdbmtool} option
+@cindex @option{--newdb}, @command{gdbmtool} option
+If the database does not exist, @command{gdbmtool} will create it.
+There is a special option @option{-n} (@option{--newdb}, which
+instructs the utility to create a new database. If it is used and if
+the database already exists, it will be deleted, so use it sparingly.
+
+@menu
+* invocation::
+* shell::
+@end menu
+
+@node invocation
+@section gdbmtool invocation
+@cindex command line options, @command{gdbmtool}
+
+The following table summarizes all @command{gdbmtool} command line
+options:
+
+@table @option
+@item -b @var{size}
+@itemx --block-size=@var{size}
+Set block size.
+@item -c @var{size}
+@itemx --cache-size=@var{size}
+Set cache size.
+@item -f @var{file}
+@item --file @var{file}
+Read commands from @var{file}, instead of the standard input.
+@item -h
+@itemx --help
+Print a concise help summary.
+@item -N
+@itemx --norc
+Don't read startup files (@pxref{startup files}).
+@item -n
+@itemx --newdb
+Create the database.
+@item -l
+@itemx --no-lock
+Disable file locking.
+@item -m
+@itemx --no-mmap
+Disable mmap.
+@anchor{-q option}
+@item -q
+@itemx --quiet
+Don't print the usual welcome banner at startup. This is the same as
+setting the variable @samp{quiet} in the startup file. @xref{quiet}.
+@item -r
+@itemx --read-only
+Open the database in read-only mode.
+@item -s
+@itemx --synchronize
+Synchronize to the disk after each write.
+@item -V
+@itemx --version
+Print program version and licensing information and exit.
+@item --usage
+Print a terse invocation syntax summary along with a list of available
+command line options.
+@end table
+
+@node shell
+@section gdbmtool interactive mode
+@cindex interactive mode, @command{gdbmtool}
+
+After successful startup, @command{gdbmtool} starts a loop, in which
+it reads commands from the standard input, executes them and prints
+the results on the standard output. If the standard input is attached
+to a console, @command{gdbmtool} runs in interactive mode, which is
+indicated by its @dfn{prompt}:
+
+@example
+gdbmtool> _
+@end example
+
+The utility finishes when it reads the @samp{quit} command (see below) or
+detects end-of-file on its standard input, whichever occurs first.
+
+A @command{gdbmtool} command consists of a @dfn{command verb},
+optionally followed by @dfn{arguments}, separated by any
+amount of white space. A command verb can be entered either in full
+or in an abbreviated form, as long as that abbreviation does not match
+any other verb. For example, @samp{co} can be used instead of
+@samp{count} and @samp{ca} instead of @samp{cache}.
+
+Any sequence of non-whitespace characters appearing after the command
+verb forms an argument. If the argument contains whitespace or
+unprintable characters it must be enclosed in double quotes. Within
+double quotes the usual @dfn{escape sequences} are understood, as
+shown in the table below:
+
+@float Table, backslash-interpretation
+@caption{Backslash escapes}
+@multitable @columnfractions 0.30 .5
+@item Sequence @tab Replaced with
+@item \a @tab Audible bell character (@acronym{ASCII} 7)
+@item \b @tab Backspace character (@acronym{ASCII} 8)
+@item \f @tab Form-feed character (@acronym{ASCII} 12)
+@item \n @tab Newline character (@acronym{ASCII} 10)
+@item \r @tab Carriage return character (@acronym{ASCII} 13)
+@item \t @tab Horizontal tabulation character (@acronym{ASCII} 9)
+@item \v @tab Vertical tabulation character (@acronym{ASCII} 11)
+@item \\ @tab Single slash
+@item \" @tab Double quote
+@end multitable
+@end float
+
+In addition, a backslash immediately followed by the end-of-line
+character effectively removes that character, allowing to split long
+arguments over several input lines.
+
+Command parameters may be optional or mandatory. If the number of
+actual arguments is less than the number of mandatory parameters,
+@command{gdbmtool} will prompt you to supply missing arguments. For
+example, the @samp{store} command takes two mandatory parameters, so
+if you invoked it with no arguments, you would be prompted twice to
+supply the necessary data, as shown in example below:
+
+@example
+gdbmtool> @kbd{store}
+key? @kbd{three}
+data? @kbd{3}
+@end example
+
+However, such prompting is possible only in interactive mode. In
+non-interactive mode (e.g.@: when running a script), all arguments must
+be supplied with each command, otherwise @command{gdbmtool} will report an
+error and exit immediately.
+
+@menu
+* variables:: shell variables.
+* commands:: shell commands.
+* definitions:: how to define structured data.
+* startup files::
+@end menu
+
+@node variables
+@subsection Shell Variables
+@cindex variables, gdbmtool
+A number of @command{gdbmtool} parameters is kept in its internal
+variables.
+
+@deftypevr {gdbmtool variable} bool confirm
+Whether to ask for confirmation before certain destructive operations,
+such as truncating the existing database.
+
+Default is @samp{true}.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} string ps1
+Primary prompt string. Its value can contain @dfn{conversion
+specifiers}, consisting of the @samp{%} character followed by another
+character. These specifiers are expanded in the resulting prompt as
+follows:
+
+@multitable @columnfractions 0.4 0.5
+@headitem Sequence @tab Expansion
+@item %f @tab name of the current database file
+@item %p @tab program invocation name
+@item %P @tab package name (@samp{GDBM})
+@item %v @tab program version
+@item %_ @tab single space character
+@item %% @tab %
+@end multitable
+
+The default value is @samp{%p>%_}, i.e. the program name, followed by
+a ``greater than'' sign, followed by a single space.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} string ps2
+Secondary prompt. See @samp{ps1} for a description of its value.
+This prompt is displayed before reading the second and subsequent
+lines of a multi-line command.
+
+The default value is @samp{%_>%_}.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} string delim1
+A string used to delimit fields of a structured datum on output
+(@pxref{definitions}).
+
+Default is @samp{,} (a comma). This variable cannot be unset.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} string delim2
+A string used to delimit array items when printing a structured datum
+(@pxref{definitions}).
+
+Default is @samp{,} (a comma). This variable cannot be unset.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} string pager
+The name and command line of the pager program to pipe output to.
+This program is used in interactive mode when the estimated number of
+output lines is greater then the number of lines on your screen.
+
+The default value is inherited from the environment variable
+@env{PAGER}. Unsetting this variable disables paging.
+@end deftypevr
+
+@anchor{quiet}
+@deftypevr {gdbmtool variable} bool quiet
+Whether to display a welcome banner at startup. This variable should
+be set in a startup script file (@pxref{startup files}).
+@xref{-q option}.
+@end deftypevr
+
+@anchor{open parameters}
+The following variables control how the database is opened:
+
+@deftypevr {gdbmtool variable} numeric blocksize
+Sets the block size. @xref{Open, block_size}. Unset by default.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} numeric cachesize
+Sets the cache size. @xref{Options, GDBM_SETCACHESIZE}.
+By default this variable is not set.
+@end deftypevr
+
+@anchor{openvar}
+@deftypevr {gdbmtool variable} string open
+Open mode. The following values are allowed:
+
+@table @asis
+@item newdb
+Truncate the database if it exists or create a new one. Open it in
+read-write mode.
+
+Technically, this sets the @samp{GDBM_NEWDB} flag in call to @samp{gdbm_open}.
+@xref{Open, GDBM_NEWDB}.
+@item wrcreat
+@itemx rw
+Open the database in read-write mode. Create it if it does not
+exist. This is the default.
+
+Technically speaking, it sets the @samp{GDBM_WRCREAT} flag in call to
+@code{gdbm_open}. @xref{Open, GDBM_WRCREAT}.
+@item reader
+@itemx readonly
+Open the database in read-only mode. Signal an error if it does not
+exist.
+
+This sets the @samp{GDBM_READER} flag (@pxref{Open, GDBM_READER}).
+@end table
+
+Attempting to set any other value or to unset this variable produces
+an error.
+@end deftypevr
+
+@anchor{filemode}
+@deftypevr {gdbmtool variable} number filemode
+File mode (in octal) for creating new database files and database
+dumps.
+@end deftypevr
+
+@deftypevr {gdbmtool variable} bool lock
+Lock the database. This is the default.
+
+Setting this variable to false or unsetting it results in passing
+@samp{GDBM_NOLOCK} flag to @code{gdbm_open} (@pxref{Open, GDBM_NOLOCK}).
+@end deftypevr
+
+@deftypevr {gdbmtool variable} bool mmap
+Use memory mapping. This is the default.
+
+Setting this variable to false or unsetting it results in passing
+@samp{GDBM_NOMMAP} flag to @code{gdbm_open} (@pxref{Open, GDBM_NOMMAP}).
+@end deftypevr
+
+@deftypevr {gdbmtool variable} bool sync
+Flush all database writes on disk immediately. Default is false.
+@xref{Open, GDBM_SYNC}.
+@end deftypevr
+
+The following commands are used to list or modify the variables:
+
+@deffn {command verb} set [@var{assignments}]
+When used without arguments, lists all variables and their values.
+Unset variables are shown after a comment sign (@samp{#}). For string
+and numeric variables, values are shown after an equals sign. For
+boolean variables, only the variable name is displayed if the variable
+is @samp{true}. If it is @samp{false}, its name is prefixed with
+@samp{no}.
+
+For example:
+
+@example
+@group
+ps1="%p>%_"
+ps2="%_>%_"
+delim1=","
+delim2=","
+confirm
+# cachesize is unset
+# blocksize is unset
+open="wrcreat"
+lock
+mmap
+nosync
+pager="less"
+# quiet is unset
+@end group
+@end example
+
+If used with arguments, the @code{set} command alters the specified
+variables. In this case, arguments are variable assignments in the
+form @samp{@var{name}=@var{value}}. For boolean variables, the
+@var{value} is interpreted as follows: if it is numeric, @samp{0}
+stands for @samp{false}, any non-zero value stands for @samp{true}.
+Otherwise, the values @samp{on}, @samp{true}, and @samp{yes} denote
+@samp{true}, and @samp{off}, @samp{false}, @samp{no} stand for
+@samp{false}. Alternatively, only the name of a boolean variable can be
+supplied to set it to @samp{true}, and its name prefixed with
+@samp{no} can be used to set it to false. For example, the following
+command sets the @samp{delim2} variable to @samp{;} and the
+@samp{confirm} variable to @samp{false}:
+
+@example
+set delim2=";" noconfirm
+@end example
+@end deffn
+
+@deffn {command verb} unset @var{variables}
+Unsets the listed variables. The effect of unsetting depends on the
+variable. Unless explicitly described in the discussion of the
+variables above, unsetting a boolean variable is equivalent to setting it to
+@samp{false}. Unsetting a string variable is equivalent to assigning it
+an empty string.
+@end deffn
+
+@node commands
+@subsection Gdbmtool Commands
+
+@deffn {command verb} avail
+Print the @dfn{avail list}.
+@end deffn
+
+@deffn {command verb} bucket @var{num}
+Print the bucket number @var{num} and set it as the current one.
+@end deffn
+
+@deffn {command verb} cache
+Print the bucket cache.
+@end deffn
+
+@deffn {command verb} close
+Close the currently open database.
+@end deffn
+
+@deffn {command verb} count
+Print the number of entries in the database.
+@end deffn
+
+@deffn {command verb} current
+Print the current bucket.
+@end deffn
+
+@deffn {command verb} delete @var{key}
+Delete record with the given @var{key}
+@end deffn
+
+@deffn {command verb} dir
+Print hash directory.
+@end deffn
+
+@anchor{gdbmtool export}
+@deffn {command verb} export @var{file-name} [truncate] [binary|ascii]
+Export the database to the flat file @var{file-name}. @xref{Flat files},
+for a description of the flat file format and its purposes. This
+command will not overwrite an existing file, unless the
+@samp{truncate} parameter is also given. Another optional argument
+determines the type of the dump (@pxref{Flat files}). By default, ASCII
+dump is created.
+
+The global variable @code{filemode} specifies the permissions to use
+for the created output file.
+
+See also @ref{gdbmexport}.
+@end deffn
+
+@deffn {command verb} fetch @var{key}
+Fetch and display the record with the given @var{key}.
+@end deffn
+
+@deffn {command verb} first
+Fetch and display the first record in the database. Subsequent
+records can be fetched using the @code{next} command (see below).
+@xref{Sequential}, for more information on sequential access.
+@end deffn
+
+@deffn {command verb} hash @var{key}
+Compute and display the hash value for the given @var{key}.
+@end deffn
+
+@deffn {command verb} header
+Print file header.
+@end deffn
+
+@deffn {command verb} help
+@deffnx {command verb} ?
+Print a concise command summary, showing each command verb
+with its parameters and a short description of what it does. Optional
+arguments are enclosed in square brackets.
+@end deffn
+
+@anchor{gdbmtool import}
+@deffn {command verb} import @var{file-name} [replace] [nometa]
+Import data from a flat dump file @var{file-name}
+(@pxref{Flat files}). If the word @samp{replace} is given
+as an argument, any records with the same keys as the already
+existing ones will replace them. The word @samp{nometa} turns off
+restoring meta-information from the dump file.
+@end deffn
+
+@deffn {command verb} list
+List the contents of the database.
+@end deffn
+
+@deffn {command verb} next [@var{key}]
+Sequential access: fetch and display the next record. If the @var{key} is
+given, the record following the one with this key will be fetched.
+
+See also @code{first}, above.
+
+@xref{Sequential}, for more information on sequential access.
+@end deffn
+
+@deffn {command verb} open @var{filename}
+Open the database file @var{filename}. If successful, any previously
+open database is closed. Otherwise, if the operation fails, the
+currently opened database remains unchanged.
+
+This command takes additional information from the following
+variables:
+
+@table @samp
+@item open
+The database access mode. @xref{openvar,, The @var{open} variable},
+for a list of its values.
+@item lock
+Whether or not to lock the database. Default is @samp{on}.
+@item mmap
+Use the memory mapping. Default is @samp{on}.
+@item sync
+Synchronize after each write. Default is @samp{off}.
+@item filemode
+Specifies the permissions to use in case a new file is created.
+@end table
+
+@xref{open parameters}, for a detailed description of these variables.
+@end deffn
+
+@deffn {command verb} quit
+Close the database and quit the utility.
+@end deffn
+
+@deffn {command verb} reorganize
+Reorganize the database (@pxref{Reorganization}).
+@end deffn
+
+@deffn {command verb} source @var{filename}
+Read @command{gdbmtool} commands from the file @var{filename}.
+@end deffn
+
+@deffn {command verb} status
+Print current program status. The following example shows the
+information displayed:
+
+@example
+Database file: junk.gdbm
+Database is open
+define key string
+define content string
+@end example
+
+The two @samp{define} strings show the defined formats for key and
+content data. @xref{definitions}, for a detailed discussion of their
+meaning.
+@end deffn
+
+@deffn {command verb} store @var{key} @var{data}
+Store the @var{data} with @var{key} in the database. If @var{key}
+already exists, its data will be replaced.
+@end deffn
+
+@deffn {command verb} version
+Print the version of @command{gdbm}.
+@end deffn
+
+@node definitions
+@subsection Data Definitions
+GDBM databases are able to keep data of any type, both in the key and
+in the content part of a record. Quite often these data are
+structured, i.e. they consist of several fields of various types.
+@command{Gdbmtool} provides a mechanism for handling such kind of
+records.
+
+The @code{define} command defines a record structure. The general
+syntax is:
+
+@example
+define @var{what} @var{definition}
+@end example
+
+@noindent
+where @var{what} is @samp{key} to defining the structure of key data and
+@samp{content} to define the structure of the content records.
+
+The @var{definition} can be of two distinct formats. In the simplest
+case it is a single data type. For example,
+
+@example
+define content int
+@end example
+
+@noindent
+defines content records consisting of a single integer field.
+Supported data types are:
+
+@table @asis
+@item char
+Single byte (signed).
+@item short
+Signed short integer.
+@item ushort
+Unsigned short integer.
+@item int
+Signed integer.
+@item unsigned
+@itemx uint
+Unsigned integer.
+@item long
+Signed long integer.
+@item ulong
+Unsigned long integer.
+@item llong
+Signed long long integer.
+@item ullong
+Unsigned long long integer.
+@item float
+A floating point number.
+@item double
+Double-precision floating point number.
+@item string
+Array of bytes.
+@item stringz
+Null-terminated string, trailing null being part of the string.
+@end table
+
+All numeric data types (integer as well as floating point) have the
+same respective widths as in C language on the host where the database
+file resides.
+
+The @samp{string} and @samp{stringz} are special. Both define a
+string of bytes, similar to @samp{char x[]} in C. The former
+defines an array of bytes, the latter - a null-terminated string.
+This makes a difference, in particular, when the string is the only
+part of datum. Consider the following two definitions:
+
+@enumerate 1
+@item @code{define key string}
+@item @code{define key stringz}
+@end enumerate
+
+@noindent
+Now, suppose we want to store the string "ab" in the key. Using the
+definition (1), the @code{dptr} member of GDBM @code{datum} will
+contain two bytes: @samp{a}, and @samp{b}. Consequently, the
+@code{dsize} member will have the value 2. Using the definition (2),
+the @code{dptr} member will contain three bytes: @samp{a}, @samp{b},
+and ASCII 0. The @code{dsize} member will have the value 3.
+
+The definition (1) is the default for both key and content.
+
+The second form of the @code{define} statement is similar to the C
+@code{struct} statement and allows for defining structural data. In
+this form, the @var{definition} part is a comma-separated list of data
+types and variables enclosed in curly braces. In contrast to the
+rest of @command{gdbm} commands, this command is inherently
+multiline and is terminated with the closing curly brace. For
+example:
+
+@example
+define content @{
+ int status,
+ pad 8,
+ char id[3],
+ string name
+@}
+@end example
+
+@noindent
+This defines a structure consisting of three members: an integer
+@code{status}, an array of 8 bytes @code{id}, and a null-terminated
+string @code{name}. Notice the @code{pad} statement: it allows to
+introduce padding between structure members. Another useful statement
+is @code{offset}: it specifies that the member following it begins at
+the given offset in the structure. Assuming the size of @code{int} is
+8 bytes, the above definition can also be written as
+
+@example
+define content @{
+ int status,
+ offset 16,
+ char id[3],
+ string name
+@}
+@end example
+
+@emph{NOTE}: The @samp{string} type can reasonably be used only if it
+is the last or the only member of the data structure. That's because it
+provides no information about the number of elements in the array, so
+it is interpreted to contain all bytes up to the end of the datum.
+
+When displaying the structured data, @command{gdbmtool} precedes each
+value with the corresponding field name and delimits parts of the
+structure with the string defined in the @samp{delim1} variable
+(@pxref{variables}). Array elements are delimited using the string from
+@samp{delim2}. For example:
+
+@example
+gdbmtool> fetch foo
+status=2,id=@{ a, u, x @},name="quux"
+@end example
+
+To supply a structured datum as an argument to a @command{gdbmtool}
+command, use the same notation, but without field names, e.g.:
+
+@example
+gdbmtool> hash @{ 2, @{a,u,x@}, "quux" @}
+hash value = 13089969.
+@end example
+
+@node startup files
+@subsection Startup Files
+@cindex startup file, gdbmtool
+@cindex init file, gdbmtool
+@flindex .gdbmtoolrc
+Upon startup @command{gdbmtool} looks for a file named
+@samp{.gdbmtoolrc} first in the current working directory and, if not
+found, in the home directory of the user who started the command.
+
+If found, this file is read and interpreted as a list of
+@command{gdbmtool} commands. This allows you to customize the
+program behavior.
+
+Following is an example startup file which disables the welcome
+banner, sets command line prompt to contain the name of the database
+file in parentheses and defines the structure of the database content
+records:
+
+@example
+@group
+set quiet
+set ps1="(%f) "
+define key stringz
+define content @{
+ int time,
+ pad 4,
+ int status
+@}
+@end group
+@end example
+
+@node gdbm_dump
+@chapter The @command{gdbm_dump} utility
+@prindex gdbm_dump
+
+The @command{gdbm_dump} utility creates a flat file dump of a GDBM
+database (@pxref{Flat files}). It takes one mandatory argument: the
+name of the source database file. The second argument, if given,
+specifies the name of the output file. If not given,
+@command{gdbm_dump} will produce the dump on the standard output.
+
+For example, the following invocation creates a dump of the database
+@file{file.db} in the file @file{file.dump}:
+
+@example
+$ gdbm_dump file.db file.dump
+@end example
+
+By default the utility creates dumps in ASCII format (@pxref{Flat
+files,ASCII}). Another format can be requested using the
+@option{--format} (@option{-H}) option.
+
+The @command{gdbm_dump} utility understands the following command line
+options:
+
+@table @option
+@item -H @var{fmt}
+@itemx --format=@var{fmt}
+Select output format. Valid values for @var{fmt} are: @samp{binary}
+or @samp{0} to select binary dump format, and @samp{ascii} or @samp{1}
+to select ASCII format.
+
+@item -h
+@itemx --help
+Print a concise help summary.
+
+@item -V
+@itemx --version
+Print program version and licensing information and exit.
+
+@item --usage
+Print a terse invocation syntax summary along with a list of available
+command line options.
+@end table
+
+@node gdbm_load
+@chapter The @command{gdbm_load} utility
+@prindex gdbm_load
+
+The @command{gdbm_load} utility restores a GDBM database from a flat
+file. The utility requires at least one argument: the name of the
+input flat file. If it is @samp{-}, the standard input will be read.
+The format of the input file is detected automatically.
+
+By default the utility attempts to restore the database under its
+original name, as stored in the input file. It will fail to do so if
+the input is in binary format. In that case, the name of the database
+must be given as the second argument.
+
+In general, if two arguments are given the second one is treated as
+the name of the database to create, overriding the file name specified
+in the flat file.
+
+The utility understands the following command line arguments:
+
+@table @option
+
+@item -b @var{num}
+@itemx --block-size=@var{num}
+Sets block size. @xref{Open, block_size}.
+
+@item -c @var{num}
+@itemx --cache-size=@var{num}
+Sets cache size. @xref{Options, GDBM_SETCACHESIZE}.
+
+@item -M
+@itemx --mmap
+Use memory mapping.
+
+@item -m @var{mode}
+@item --mode=@var{mode}
+Sets the file mode. The argument is the desired file mode in octal.
+
+@item -n
+@itemx --no-meta
+Do not restore file meta-data (ownership and mode) from the flat file.
+
+@item -r
+@itemx --replace
+Replace existing keys.
+
+@item -u @var{user}[:@var{group}]
+@itemx --user=@var{user}[:@var{group}]
+Set file owner. The @var{user} can be either a valid user name or
+UID. Similarly, the @var{group} is either a valid group name or GID.
+If @var{group} is not given, the main group of @var{user} is used.
+
+User and group parts can be separated by a dot, instead of the colon.
+
+@item -h
+@itemx --help
+Print a concise help summary.
+
+@item -V
+@itemx --version
+Print program version and licensing information and exit.
+
+@item --usage
+Print a terse invocation syntax summary along with a list of available
+command line options.
+@end table
+
+@node gdbmexport
+@chapter Export a database into a portable format.
+@prindex gdbmexport
+
+The @command{gdbmexport} utility converts the database of an older
+GDBM version into a binary flat format.
+
+The utility takes two mandatory arguments: the name of the database
+file to convert and the output file name, e.g.:
+
+@example
+$ gdbmexport junk.gdbm junk.flat
+@end example
+
+In addition the following two options are understood:
+
+@table @option
+@item -h
+Display short usage summary and exit.
+
+@item -v
+Display program version and licensing information, and exit.
+@end table
+
+@node Exit codes
+@chapter Exit codes
+@cindex exit code
+
+All GDBM utilities return uniform exit codes. These are summarized in
+the table below:
+
+@multitable @columnfractions 0.3 0.7
+@headitem Code @tab Meaning
+@item 0 @tab Successful termination.
+@item 1 @tab A fatal error occurred.
+@item 2 @tab Program was unable to restore file ownership or mode.
+@item 3 @tab Command line usage error.
+@end multitable
+
+@node Bugs
+@chapter Problems and bugs.
+
+If you have problems with GNU @code{dbm} or think you've found a bug,
+please report it. Before reporting a bug, make sure you've actually
+found a real bug. Carefully reread the documentation and see if it
+really says you can do what you're trying to do. If it's not clear
+whether you should be able to do something or not, report that too; it's
+a bug in the documentation!
+
+Before reporting a bug or trying to fix it yourself, try to isolate it
+to the smallest possible input file that reproduces the problem. Then
+send us the input file and the exact results @code{gdbm} gave you. Also
+say what you expected to occur; this will help us decide whether the
+problem was really in the documentation.
+
+Once you've got a precise problem, send e-mail to
+@email{bug-gdbm@@gnu.org}.
+
+Please include the version number of GNU @code{dbm} you are using. You can get
+this information by printing the variable @code{gdbm_version}
+(@pxref{Variables}).
+
+Non-bug suggestions are always welcome as well. If you have questions
+about things that are unclear in the documentation or are just obscure
+features, please report them too.
+
+You may contact the authors and maintainers by e-mail:
+@example
+@email{phil@@cs.wwu.edu}, @email{downsj@@downsj.com}, @email{gray@@gnu.org.ua}
+@end example
+
+@node Resources
+@chapter Additional resources
+
+For the latest updates and pointers to additional resources, visit
+@uref{http://www.gnu.org/@/software/@/gdbm}.
+
+In particular, a copy of @code{gdbm} documentation in various formats
+is available online at @uref{http://www.gnu.org/@/software/@/gdbm/@/manual.html}.
+
+Latest versions of @code{gdbm} can be downloaded from anonymous FTP:
+@uref{ftp://ftp.gnu.org/@/gnu/@/gdbm}, or via HTTP from
+@uref{http://ftp.gnu.org/@/gnu/@/gdbm}, or from any
+@ifhtml
+@uref{http://www.gnu.org/order/ftp.html,,GNU mirror} worldwide.
+@end ifhtml
+@ifnothtml
+GNU mirror worldwide. See @uref{http://www.gnu.org/@/order/@/ftp.html},
+for a list of mirrors.
+@end ifnothtml
+
+To track @code{gdbm} development, visit
+@uref{http://puszcza.gnu.org.ua/@/projects/@/gdbm}.
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl.texi
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
diff --git a/doc/gdbm_dump.1 b/doc/gdbm_dump.1
new file mode 100644
index 0000000..bf68683
--- /dev/null
+++ b/doc/gdbm_dump.1
@@ -0,0 +1,88 @@
+.\" This file is part of GDBM.
+.\" Copyright (C) 2013 Free Software Foundation, Inc.
+.\"
+.\" GDBM is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 3, or (at your option)
+.\" any later version.
+.\"
+.\" GDBM is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+.TH GDBM_DUMP 1 "May 8, 2013" "GDBM" "GDBM User Reference"
+.SH NAME
+gdbm_dump \- dump a GDBM database to a file
+.SH SYNOPSIS
+\fBgdbm_dump\fR [\fB\-H \fIFMT\fR] [\fB\-\-format\fR=\fIFMT\fR] \fIDB_FILE\fR [\fIFILE\fR]
+.sp
+\fBgdbm_dump\fR [\fB\-Vh\fR] [\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR]
+.SH DESCRIPTION
+The
+.B gdbm_dump
+utility creates a dump of the specified
+.BR gdbm (3)
+database file. The name for the output dump file is supplied by the
+second argument (\fIFILE\fR). If not specified, the output goes to
+the standard error.
+.PP
+The created dump can be given as argument to the
+.BR gdbm_load (1)
+utility in order to re-create an exact copy of the \fIDB_FILE\fR.
+.SH OPTIONS
+.TP
+\fB\-H\fR, \fB\-\-format\fR=\fIFMT\fR
+Select dump format. The value \fBbinary\fR (or \fB0\fR) instructs
+.B gdbm_dump
+to produce a binary dump, compatible with earlier
+.B gdbm
+versions (up to version 1.9). The value \fBascii\fR (or \fB1\fR)
+instructs it to create an ASCII dump (this is the default). The
+latter is preferred because, apart from the actual data, it also
+contains meta-information which will allow
+.BR gdbm_load (1)
+to recreate an exact copy of the file.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Print a short usage summary.
+.TP
+\fB\-\-usage\fR
+Print a list of available options.
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+Print program version
+.SH "SEE ALSO"
+.BR gdbm_load (1),
+.BR gdbmtool (1),
+.BR gdbm (3).
+.PP
+For a detailed description of
+.B gdbm_dump
+and other
+.B gdbm
+utilities, refer to the \fBGDBM Manual\fR available in
+Texinfo format. To access it, run:
+
+ \fBinfo gdbm\fR
+
+.SH "REPORTING BUGS"
+Report bugs to <bug\-gdbm@gnu.org>.
+.SH COPYRIGHT
+Copyright \(co 2013 Free Software Foundation, Inc
+.br
+.na
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+.br
+.ad
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+.\" Local variables:
+.\" eval: (add-hook 'write-file-hooks 'time-stamp)
+.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \""
+.\" time-stamp-format: "%:B %:d, %:y"
+.\" time-stamp-end: "\""
+.\" time-stamp-line-limit: 20
+.\" end:
diff --git a/doc/gdbm_load.1 b/doc/gdbm_load.1
new file mode 100644
index 0000000..8b0e77c
--- /dev/null
+++ b/doc/gdbm_load.1
@@ -0,0 +1,108 @@
+.\" This file is part of GDBM. -*- nroff -*-
+.\" Copyright (C) 2011, 2013 Free Software Foundation, Inc.
+.\"
+.\" GDBM is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 3, or (at your option)
+.\" any later version.
+.\"
+.\" GDBM is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+.TH GDBM_LOAD 1 "December 25, 2013" "GDBM" "GDBM User Reference"
+.SH NAME
+gdbm_load \- re-create a GDBM database from a dump file.
+.SH SYNOPSIS
+\fBgdbm_load\fR [\fB\-Mnr\fR] [\fB\-b\fR \fINUM\fR] [\fB\-c\fR \fINUM]\
+ [\fB\-m\fR \fIMODE\fR]\
+ [\fB\-u\fR \fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR]]
+ [\fB\-\-block\-size\fR=\fINUM\fR] [\fB\-\-cache\-size\fR=\fINUM\fR]\
+ [\fB\-\-mmap\fR=\fINUM\fR]
+ [\fB\-\-mode\fR=\fIMODE\fR]\
+ [\fB\-\-no\-meta\fR] [\fB\-\-replace\fR]
+ [\fB\-\-user\fR=\fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR]]\
+ \fIFILE\fR [\fIDB_FILE\fR]
+
+.sp
+\fBgdbm_load\fR [\fB\-Vh\fR] [\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR]
+.SH DESCRIPTION
+Create a
+.B gdbm
+database file
+.I DB_FILE
+from the dump file
+.IR FILE .
+If the
+.I FILE
+argument is not supplied, output the created database to the standard error.
+.PP
+If the input file is in ASCII dump format, the mode and ownership of
+the created database are restored from the information in the dump.
+This can be overridden using the command line options (see below).
+.SH OPTIONS
+.TP
+\fB\-b\fR, \fB\-\-block\-size\fR=\fINUM\fR
+Sets block size.
+.TP
+\fB\-c\fR, \fB\-\-cache\-size\fR=\fINUM\fR
+Sets cache size.
+.TP
+\fB\-M\fR, \fB\-\-mmap\fR
+Use memory mapping.
+.TP
+\fB\-m\fR, \fB\-\-mode\fR=\fIMODE\fR
+Set database file mode (octal number).
+.TP
+\fB\-n\fR, \fB\-\-no\-meta\fR
+Do not attempt to restore database meta-data (mode and ownership).
+.TP
+\fB\-r\fR, \fB\-\-replace\fR
+If the database exists, replace records in it.
+.TP
+\fB\-u\fR, \fB\-\-user\fR=\fINAME\fR|\fIUID\fR[:\fINAME\fR|\fIGID\fR]
+Set file ownership.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Print a short usage summary.
+.TP
+\fB\-\-usage\fR
+Print a list of available options.
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+Print program version
+.SH "SEE ALSO"
+.BR gdbm_dump (1),
+.BR gdbmtool (1),
+.BR gdbm (3).
+.PP
+For a detailed description of
+.B gdbm_load
+and other
+.B gdbm
+utilities, refer to the \fBGDBM Manual\fR available in
+Texinfo format. To access it, run:
+
+ \fBinfo gdbm\fR
+
+.SH "REPORTING BUGS"
+Report bugs to <bug\-gdbm@gnu.org>.
+.SH COPYRIGHT
+Copyright \(co 2013 Free Software Foundation, Inc
+.br
+.na
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+.br
+.ad
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+.\" Local variables:
+.\" eval: (add-hook 'write-file-hooks 'time-stamp)
+.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \""
+.\" time-stamp-format: "%:B %:d, %:y"
+.\" time-stamp-end: "\""
+.\" time-stamp-line-limit: 20
+.\" end:
diff --git a/doc/gdbmtool.1 b/doc/gdbmtool.1
new file mode 100644
index 0000000..a04fbef
--- /dev/null
+++ b/doc/gdbmtool.1
@@ -0,0 +1,443 @@
+.\" This file is part of GDBM. -*- nroff -*-
+.\" Copyright (C) 2013 Free Software Foundation, Inc.
+.\"
+.\" GDBM is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 3, or (at your option)
+.\" any later version.
+.\"
+.\" GDBM is distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.\" GNU General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License
+.\" along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
+.TH GDBM_DUMP 1 "May 17, 2013" "GDBM" "GDBM User Reference"
+.SH NAME
+gdbmtool \- examine and modify a GDBM database
+.SH SYNOPSIS
+\fBgdbmtool\fR [\fB\-lmNnqrs\fR] [\fB\-b\fR \fISIZE\fR] [\fB\-c\fR \fISIZE\fR]\
+ [\fB\-f\fR \fIFILE\fR] [\fB\-\-block\-size\fR=\fISIZE\fR]
+ [\fB\-\-cache\-size\fR=\fISIZE\fR] [\fB\-\-file\fR \fIFILE\fR]\
+ [\fB\-\-newdb\fR] [\fB\-\-no\-lock\fR]
+ [\fB\-\-no\-mmap\fR] [\fB\-\-norc\fR]
+ [\fB\-\-quiet\fR] [\fB\-\-read\-only\fR] [\fB\-\-synchronize\fR]\
+ [\fIDBFILE\fR]
+.sp
+\fBgdbmtool\fR [\fB\-Vh\fR] ][\fB\-\-help\fR] [\fB\-\-usage\fR] [\fB\-\-version\fR]
+.SH DESCRIPTION
+The
+.B gdbmtool
+utility allows you to view and modify an existing GDBM database or to
+create a new one.
+.PP
+The \fIDBFILE\fR argument supplies the name of the database to open.
+If not supplied, the default name
+.B junk.gdbm
+is used instead.
+If the named database does not exist, it will be created. An existing
+database can be cleared (i.e. all records removed from it) using the
+\fB\-\-newdb\fR option (see below).
+.PP
+Unless the \fB\-N\fR (\fB\-\-norc\fR) option is given, after startup
+.B gdbmtool
+looks for file named
+.B .gdbmtoolrc
+first in the current working directory, and, if not found there, in
+the home directory of the user who started the program. If found,
+this file is read and interpreted as a list of
+.B gdbmtool
+commands.
+.PP
+Then
+.B gdbmtool
+starts a loop, in which it reads
+commands from the standard input, executes them and prints the results on the
+standard output. If the standard input is attached to a console,
+the program runs in interactive mode.
+.PP
+The program terminates when the
+.B quit
+command is given, or end-of-file is detected on its standard input.
+.PP
+A
+.B gdbmtool
+command consists of a command verb, optionally
+followed by one or more arguments, separated by any amount of white
+space. A command verb can be entered either in full or in an
+abbreviated form, as long as that abbreviation does not match any other
+verb.
+.PP
+Any sequence of non-whitespace characters appearing after the command
+verb forms an argument. If the argument contains whitespace or
+unprintable characters it must be enclosed in double quotes. Within
+double quotes the usual escape sequences are understood, as
+shown in the table below:
+.sp
+.nf
+.ta 8n 20n
+.ul
+ Escape Expansion
+ \\a Audible bell character (ASCII 7)
+ \\b Backspace character (ASCII 8)
+ \\f Form-feed character (ASCII 12)
+ \\n Newline character (ASCII 10)
+ \\r Carriage return character (ASCII 13)
+ \\t Horizontal tabulation character (ASCII 9)
+ \\v Vertical tabulation character (ASCII 11)
+ \\\\ Single slash
+ \" Double quote
+.fi
+.PP
+In addition, a backslash immediately followed by the end-of-line
+character effectively removes that character, allowing to split long
+arguments over several input lines.
+.SH OPTIONS
+.TP
+\fB\-b\fR, \fB\-\-block\-size\fR=\fISIZE\fR
+Set block size.
+.TP
+\fB\-c\fR, \fB\-\-cache\-size\fR=\fISIZE\fR
+Set cache size.
+.TP
+\fB\-f\fR, \fB\-\-file\fR=\fIFILE\fR
+Read commands from \fIFILE\fR, instead of from the standard input.
+.TP
+\fB\-l\fR, \fB\-\-no\-lock\fR
+Disable file locking.
+.TP
+\fB\-m\fR, \fB\-\-no\-mmap\fR
+Do not use
+.BR mmap (2).
+.TP
+\fB\-n\fR, \fB\-\-newdb\fR
+Create the database, truncating it if it already exists.
+.TP
+\fB\-q\fR, \fB\-\-quiet\fR
+Don't print initial banner.
+.TP
+\fB\-r\fR, \fB\-\-read\-only\fR
+Open database in read-only mode.
+.TP
+\fB\-s\fR, \fB\-\-synchronize\fR
+Synchronize to disk after each write.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Print a short usage summary.
+.TP
+\fB\-\-usage\fR
+Print a list of available options.
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+Print program version
+.SH SHELL COMMANDS
+.TP
+.BR avail
+Print the
+.BR "avail list" .
+.TP
+\fBbucket\fR \fINUM\fR
+Print the bucket number \fINUM\fR and set is as the current one.
+.TP
+.BR cache
+Print the bucket cache.
+.TP
+.B close
+Close the currently open database.
+.TP
+.BR count
+Print the number of entries in the database.
+.TP
+.BR current
+Print the current bucket.
+.TP
+\fBdelete\fR \fIKEY\fR
+Delete record with the given \fIKEY\fR.
+.TP
+.BR dir
+Print hash directory.
+.TP
+\fBexport\fR, \fBe\fR \fIFILE\-NAME\fR [\fBtruncate\fR] [\fBbinary\fR|\fBascii\fR]
+Export the database to the flat file \fIFILE\-NAME\fR. This is equivalent to
+.BR gdbm_dump (1).
+
+This command will not overwrite an existing file, unless the
+.B truncate
+parameter is also given. Another optional parameter determines the type of
+the dump (*note Flat files::). By default, ASCII dump will be created.
+.TP
+\fBfetch\fR \fIKEY\fR
+Fetch and display the record with the given \fIKEY\fR.
+.TP
+.BR first
+Fetch and display the first record in the database. Subsequent
+records can be fetched using the
+.B next
+command (see below).
+.TP
+\fBhash\fR \fIKEY\fR
+Compute and display the hash value for the given \fIKEY\fR.
+.TP
+.BR header
+Print file header.
+.TP
+.BR help " or " ?
+Print a concise command summary, showing each command letter and
+verb with its parameters and a short description of what it does.
+Optional arguments are enclosed in square brackets.
+.TP
+\fBimport\fR \fIFILE\-NAME\fR [\fBreplace\fR] [\fBnometa\fR]
+Import data from a flat dump file \fIFILE\-NAME\fR.
+If the
+.B replace
+argument is given, any records with the same keys as the already
+existing ones will replace them. The
+.B nometa
+argument turns off restoring meta-information from the dump file.
+.TP
+\fBlist\fR
+List the contents of the database.
+.TP
+\fBnext\fR [\fIKEY\fR]
+Sequential access: fetch and display the next record. If the \fIKEY\fR is
+given, the record following the one with this key will be fetched.
+.TP
+\fBopen\fR \fIFILE\fR
+Open the database file \fIFILE\fR. If successful, any previously
+open database is closed. Otherwise, if the operation fails, the
+currently opened database remains unchanged.
+
+This command takes additional information from the variables
+.BR open ,
+.BR lock ,
+.BR mmap ", and"
+.BR sync .
+See the section
+.BR VARIABLES ,
+for a detailed description of these.
+.TP
+.B quit
+Close the database and quit the utility.
+.TP
+.BR reorganize
+Reorganize the database.
+\fBset\fR [\fIVAR\fR=\fIVALUE\fR...]
+Without arguments, lists variables and their values. If arguments are
+specified, sets variables. Boolean variables can be set by specifying
+variable name, optionally prefixed with \fBno\fR, to set it to \fBfalse\fR.
+.TP
+\fBsource\fR \fIFILE\fR
+Read commands from the given \fIFILE\fR.
+.TP
+.BR status
+Print current program status.
+.TP
+\fBstore\fR \fIKEY\fR \fIDATA\fR
+Store the \fIDATA\fR with the given \fIKEY\fR in the database. If the
+\fIKEY\fR already exists, its data will be replaced.
+.TP
+\fBunset\fR \fIVARIABLE\fR...
+Unsets listed variables.
+.TP
+.BR version
+Print the version of
+.BR gdbm .
+.SH "DATA DEFINITIONS"
+The \fBdefine\fR statement provides a mechanism for defining key or
+content structures. It is similar to the \fBC\fR \fBstruct\fR
+declaration:
+.sp
+.nf
+.in +4
+\fBdefine\fR \fBkey\fR|\fBcontent\fR \fB{\fR \fIdefnlist\fR \fB}\fR
+.in
+.fi
+.PP
+The \fIdefnlist\fR is a comma-separated list of member declarations.
+Within \fIdefnlist\fR the newline character looses its special meaning
+as the command terminator, so each declaration can appear on a
+separate line and arbitrary number of comments can be inserted to
+document the definition.
+.PP
+Each declaration has one of the following formats
+.sp
+.nf
+.in +4
+\fItype\fR \fIname\fR
+\fItype\fR \fIname\fR \fB[\fIN\fB]\fR
+.in
+.fi
+.sp
+where \fItype\fR is a data type and \fIname\fR is the member name.
+The second format defines the member \fIname\fR as an array of \fIN\fR
+elements of \fItype\fR.
+.PP
+The supported types are:
+.sp
+.nf
+.ta 8n 20n
+.ul
+ type meaning
+ char single byte (signed)
+ short signed short integer
+ ushort unsigned short integer
+ int signed integer
+ unsigned unsigned integer
+ uint ditto
+ long signed long integer
+ ulong unsigned long integer
+ llong signed long long integer
+ ullong unsigned long long integer
+ float a floating point number
+ double double-precision floating point number
+ string array of characters (see the \fBNOTE\fR below)
+ stringz null-terminated string of characters
+.fi
+.PP
+The following alignment declarations can be used within \fIdefnlist\fR:
+.TP
+\fBoffset\fR \fIN\fR
+The next member begins at offset \fIN\fR.
+.TP
+\fBpad\fR \fIN\fR
+Add \fIN\fR bytes of padding to the previous member.
+.PP
+For example:
+.sp
+.nf
+.in +4
+\fBdefine content {
+ int status,
+ pad 8,
+ char id[3],
+ stringz name
+}\fR
+.fi
+.PP
+To define data consisting of a single data member, the following
+simplified construct can be used:
+.sp
+.nf
+.in +4
+\fBdefine\fR \fBkey\fR|\fBcontent\fR \fItype\fR
+.fi
+.PP
+where \fItype\fR is one of the types discussed above.
+.PP
+\fBNOTE\fR: The \fBstring\fR type can reasonably be used only if it is
+the last or the only member of the data structure. That's because it
+provides no information about the number of elements in the array, so
+it is interpreted to contain all bytes up to the end of the datum.
+.SH VARIABLES
+.TP
+.BR confirm ", boolean"
+Whether to ask for confirmation before certain destructive operations,
+such as truncating the existing database. Default is
+.BR true .
+.TP
+.BR ps1 ", string"
+Primary prompt string. Its value can contain \fIconversion
+specifiers\fR, consisting of the \fB%\fR character followed by another
+character. These specifiers are expanded in the resulting prompt as
+follows:
+.sp
+.nf
+.ta 8n 20n
+.ul
+ Sequence Expansion
+ \fB%f\fR name of the db file
+ \fB%p\fR program name
+ \fB%P\fR package name (\fBgdbm\fR)
+ \fB%_\fR horizontal space (\fBASCII\fR 32)
+ \fB%v\fR program version
+ \fB%%\fR \fB%\fR
+.fi
+.sp
+The default prompt is \fB%p>%_\fR.
+.TP
+.BR ps2 ", string"
+Secondary prompt. See
+.B ps1
+for a description of its value.
+This prompt is displayed before reading the second and subsequent
+lines of a multi-line command.
+
+The default value is \fB%_>%_\fR.
+.TP
+.BR delim1 ", string"
+A string used to delimit fields of a structured datum on output
+(see the section \fBDATA DEFINITIONS\fR).
+
+Default is \fB,\fR (a comma). This variable cannot be unset.
+.TP
+.BR delim2 ", string"
+A string used to delimit array items when printing a structured datum.
+
+Default is \fB,\fR (a comma). This variable cannot be unset.
+.TP
+.BR pager ", string"
+The name and command line of the pager program to pipe output to.
+This program is used in interactive mode when the estimated number of
+output lines is greater then the number of lines on your screen.
+
+The default value is inherited from the environment variable
+\fBPAGER\fR. Unsetting this variable disables paging.
+.TP
+.BR quiet ", boolean"
+Whether to display welcome banner at startup. This variable should
+be set in a startup script file.
+.PP
+The following variables control how the database is opened:
+.TP
+.BR cachesize ", numeric"
+Sets the cache size. By default this variable is not set.
+.TP
+.BR blocksize ", numeric"
+Sets the block size. Unset by default.
+.TP
+.BR open ", string"
+Open mode. The following values are allowed:
+.RS 7
+.TP
+.BR newdb
+Truncate the database if it exists or create a new one. Open it in
+read-write mode.
+.TP
+.BR wrcreat " or " rw
+Open the database in read-write mode. Create it if it does not
+exist. This is the default.
+.TP
+.BR reader " or " readonly
+Open the database in read-only mode. Signal an error if it does not
+exist.
+.RE
+.TP
+.BR lock ", boolean"
+Lock the database. This is the default.
+.TP
+.BR mmap ", boolean"
+Use memory mapping. This is the default.
+
+.SH "SEE ALSO"
+.BR gdbm_dump (1),
+.BR gdbm_load (1),
+.BR gdbm (3).
+.SH "REPORTING BUGS"
+Report bugs to <bug\-gdbm@gnu.org>.
+.SH COPYRIGHT
+Copyright \(co 2013 Free Software Foundation, Inc
+.br
+.na
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+.br
+.ad
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+.\" Local variables:
+.\" eval: (add-hook 'write-file-hooks 'time-stamp)
+.\" time-stamp-start: ".TH GDBM[A-Z_-]* 1 \""
+.\" time-stamp-format: "%:B %:d, %:y"
+.\" time-stamp-end: "\""
+.\" time-stamp-line-limit: 20
+.\" end:
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..39c7db9
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 25 December 2013
+@set UPDATED-MONTH December 2013
+@set EDITION 1.11
+@set VERSION 1.11
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..39c7db9
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 25 December 2013
+@set UPDATED-MONTH December 2013
+@set EDITION 1.11
+@set VERSION 1.11