summaryrefslogtreecommitdiff
path: root/tests
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 /tests
downloadgdbm-tarball-master.tar.gz
Imported from /home/lorry/working-area/delta_gdbm-tarball/gdbm-1.11.tar.gz.HEADgdbm-1.11master
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am135
-rw-r--r--tests/Makefile.in832
-rw-r--r--tests/atlocal.in24
-rw-r--r--tests/cloexec00.at25
-rw-r--r--tests/cloexec01.at25
-rw-r--r--tests/cloexec02.at27
-rw-r--r--tests/cloexec03.at26
-rw-r--r--tests/create00.at29
-rw-r--r--tests/d_creat_ce.c90
-rw-r--r--tests/dbmcreate00.at30
-rw-r--r--tests/dbmcvt.at34
-rw-r--r--tests/dbmdel00.at40
-rw-r--r--tests/dbmdel01.at32
-rw-r--r--tests/dbmdel02.at29
-rw-r--r--tests/dbmfetch00.at32
-rw-r--r--tests/dbmfetch01.at31
-rw-r--r--tests/dbmfetch02.at32
-rw-r--r--tests/dbmfetch03.at36
-rw-r--r--tests/delete00.at39
-rw-r--r--tests/delete01.at31
-rw-r--r--tests/delete02.at28
-rw-r--r--tests/dtdel.c96
-rw-r--r--tests/dtdump.c97
-rw-r--r--tests/dtfetch.c119
-rw-r--r--tests/dtload.c152
-rw-r--r--tests/fdop.c36
-rw-r--r--tests/fetch00.at31
-rw-r--r--tests/fetch01.at30
-rw-r--r--tests/g_open_ce.c66
-rw-r--r--tests/g_reorg_ce.c72
-rw-r--r--tests/gtdel.c98
-rw-r--r--tests/gtdump.c113
-rw-r--r--tests/gtfetch.c127
-rw-r--r--tests/gtload.c175
-rw-r--r--tests/gtopt.c414
-rw-r--r--tests/gtver.c74
-rw-r--r--tests/num2word.c255
-rw-r--r--tests/package.m49
-rw-r--r--tests/progname.h32
-rw-r--r--tests/setopt00.at61
-rw-r--r--tests/setopt01.at37
-rwxr-xr-xtests/testsuite3002
-rw-r--r--tests/testsuite.at73
-rw-r--r--tests/version.at25
44 files changed, 6801 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..42335e8
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,135 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+EXTRA_DIST = \
+ $(TESTSUITE_AT)\
+ testsuite\
+ package.m4
+
+DISTCLEANFILES = atconfig
+MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
+
+
+## ------------ ##
+## package.m4. ##
+## ------------ ##
+
+$(srcdir)/package.m4: $(top_srcdir)/configure.ac $(srcdir)/Makefile.am
+ $(AM_V_GEN){ \
+ echo '# Signature of the current package.'; \
+ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \
+ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_MAJOR], [@GDBM_VERSION_MAJOR@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_MINOR], [@GDBM_VERSION_MINOR@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_PATCH], [@GDBM_VERSION_PATCH@])'; \
+ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
+ } >$(srcdir)/package.m4
+
+#
+
+## ------------ ##
+## Test suite. ##
+## ------------ ##
+
+TESTSUITE_AT = \
+ testsuite.at\
+ cloexec00.at\
+ cloexec01.at\
+ cloexec02.at\
+ cloexec03.at\
+ dbmcreate00.at\
+ dbmdel00.at\
+ dbmdel01.at\
+ dbmdel02.at\
+ dbmcvt.at\
+ dbmfetch00.at\
+ dbmfetch01.at\
+ dbmfetch02.at\
+ dbmfetch03.at\
+ create00.at\
+ delete00.at\
+ delete01.at\
+ delete02.at\
+ fetch00.at\
+ fetch01.at\
+ setopt00.at\
+ setopt01.at\
+ version.at
+
+TESTSUITE = $(srcdir)/testsuite
+M4=m4
+
+AUTOTEST = $(AUTOM4TE) --language=autotest
+$(TESTSUITE): package.m4 $(TESTSUITE_AT)
+ $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
+ mv $@.tmp $@
+
+atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && ./config.status tests/$@
+
+clean-local:
+ test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
+
+check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) $(TESTSUITE)
+
+# Run the test suite on the *installed* tree.
+#installcheck-local:
+# $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin
+
+## --------------- ##
+## num2word et al. ##
+## --------------- ##
+
+if COMPAT_OPT
+ DBMINCLUDES = -I$(top_srcdir)/compat
+ DBMPROGS = dtload dtdump dtfetch dtdel d_creat_ce
+endif
+
+check_PROGRAMS = \
+ fdop\
+ g_open_ce\
+ g_reorg_ce\
+ gtdel\
+ gtdump\
+ gtfetch\
+ gtload\
+ gtopt\
+ gtver\
+ num2word\
+ $(DBMPROGS)
+
+AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src $(DBMINCLUDES)
+noinst_HEADERS=progname.h
+gtdel_LDADD = ../src/libgdbm.la
+gtload_LDADD = ../src/libgdbm.la
+gtdump_LDADD = ../src/libgdbm.la
+gtfetch_LDADD = ../src/libgdbm.la
+gtver_LDADD = ../src/libgdbm.la
+gtopt_LDADD = ../src/libgdbm.la
+
+g_open_ce_LDADD = ../src/libgdbm.la
+g_reorg_ce_LDADD = ../src/libgdbm.la
+
+dtload_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtdump_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtfetch_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtdel_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+d_creat_ce_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+
+
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..18e7b48
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,832 @@
+# 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. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+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@
+check_PROGRAMS = fdop$(EXEEXT) g_open_ce$(EXEEXT) g_reorg_ce$(EXEEXT) \
+ gtdel$(EXEEXT) gtdump$(EXEEXT) gtfetch$(EXEEXT) \
+ gtload$(EXEEXT) gtopt$(EXEEXT) gtver$(EXEEXT) \
+ num2word$(EXEEXT) $(am__EXEEXT_1)
+subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(srcdir)/atlocal.in $(top_srcdir)/build-aux/depcomp \
+ $(noinst_HEADERS)
+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 = atlocal
+CONFIG_CLEAN_VPATH_FILES =
+@COMPAT_OPT_TRUE@am__EXEEXT_1 = dtload$(EXEEXT) dtdump$(EXEEXT) \
+@COMPAT_OPT_TRUE@ dtfetch$(EXEEXT) dtdel$(EXEEXT) \
+@COMPAT_OPT_TRUE@ d_creat_ce$(EXEEXT)
+d_creat_ce_SOURCES = d_creat_ce.c
+d_creat_ce_OBJECTS = d_creat_ce.$(OBJEXT)
+d_creat_ce_DEPENDENCIES = ../src/libgdbm.la \
+ ../compat/libgdbm_compat.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+dtdel_SOURCES = dtdel.c
+dtdel_OBJECTS = dtdel.$(OBJEXT)
+dtdel_DEPENDENCIES = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtdump_SOURCES = dtdump.c
+dtdump_OBJECTS = dtdump.$(OBJEXT)
+dtdump_DEPENDENCIES = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtfetch_SOURCES = dtfetch.c
+dtfetch_OBJECTS = dtfetch.$(OBJEXT)
+dtfetch_DEPENDENCIES = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtload_SOURCES = dtload.c
+dtload_OBJECTS = dtload.$(OBJEXT)
+dtload_DEPENDENCIES = ../src/libgdbm.la ../compat/libgdbm_compat.la
+fdop_SOURCES = fdop.c
+fdop_OBJECTS = fdop.$(OBJEXT)
+fdop_LDADD = $(LDADD)
+g_open_ce_SOURCES = g_open_ce.c
+g_open_ce_OBJECTS = g_open_ce.$(OBJEXT)
+g_open_ce_DEPENDENCIES = ../src/libgdbm.la
+g_reorg_ce_SOURCES = g_reorg_ce.c
+g_reorg_ce_OBJECTS = g_reorg_ce.$(OBJEXT)
+g_reorg_ce_DEPENDENCIES = ../src/libgdbm.la
+gtdel_SOURCES = gtdel.c
+gtdel_OBJECTS = gtdel.$(OBJEXT)
+gtdel_DEPENDENCIES = ../src/libgdbm.la
+gtdump_SOURCES = gtdump.c
+gtdump_OBJECTS = gtdump.$(OBJEXT)
+gtdump_DEPENDENCIES = ../src/libgdbm.la
+gtfetch_SOURCES = gtfetch.c
+gtfetch_OBJECTS = gtfetch.$(OBJEXT)
+gtfetch_DEPENDENCIES = ../src/libgdbm.la
+gtload_SOURCES = gtload.c
+gtload_OBJECTS = gtload.$(OBJEXT)
+gtload_DEPENDENCIES = ../src/libgdbm.la
+gtopt_SOURCES = gtopt.c
+gtopt_OBJECTS = gtopt.$(OBJEXT)
+gtopt_DEPENDENCIES = ../src/libgdbm.la
+gtver_SOURCES = gtver.c
+gtver_OBJECTS = gtver.$(OBJEXT)
+gtver_DEPENDENCIES = ../src/libgdbm.la
+num2word_SOURCES = num2word.c
+num2word_OBJECTS = num2word.$(OBJEXT)
+num2word_LDADD = $(LDADD)
+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 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = d_creat_ce.c dtdel.c dtdump.c dtfetch.c dtload.c fdop.c \
+ g_open_ce.c g_reorg_ce.c gtdel.c gtdump.c gtfetch.c gtload.c \
+ gtopt.c gtver.c num2word.c
+DIST_SOURCES = d_creat_ce.c dtdel.c dtdump.c dtfetch.c dtload.c fdop.c \
+ g_open_ce.c g_reorg_ce.c gtdel.c gtdump.c gtfetch.c gtload.c \
+ gtopt.c gtver.c num2word.c
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+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@
+EXTRA_DIST = \
+ $(TESTSUITE_AT)\
+ testsuite\
+ package.m4
+
+DISTCLEANFILES = atconfig
+MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
+
+#
+TESTSUITE_AT = \
+ testsuite.at\
+ cloexec00.at\
+ cloexec01.at\
+ cloexec02.at\
+ cloexec03.at\
+ dbmcreate00.at\
+ dbmdel00.at\
+ dbmdel01.at\
+ dbmdel02.at\
+ dbmcvt.at\
+ dbmfetch00.at\
+ dbmfetch01.at\
+ dbmfetch02.at\
+ dbmfetch03.at\
+ create00.at\
+ delete00.at\
+ delete01.at\
+ delete02.at\
+ fetch00.at\
+ fetch01.at\
+ setopt00.at\
+ setopt01.at\
+ version.at
+
+TESTSUITE = $(srcdir)/testsuite
+M4 = m4
+AUTOTEST = $(AUTOM4TE) --language=autotest
+
+# Run the test suite on the *installed* tree.
+#installcheck-local:
+# $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin
+@COMPAT_OPT_TRUE@DBMINCLUDES = -I$(top_srcdir)/compat
+@COMPAT_OPT_TRUE@DBMPROGS = dtload dtdump dtfetch dtdel d_creat_ce
+AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src $(DBMINCLUDES)
+noinst_HEADERS = progname.h
+gtdel_LDADD = ../src/libgdbm.la
+gtload_LDADD = ../src/libgdbm.la
+gtdump_LDADD = ../src/libgdbm.la
+gtfetch_LDADD = ../src/libgdbm.la
+gtver_LDADD = ../src/libgdbm.la
+gtopt_LDADD = ../src/libgdbm.la
+g_open_ce_LDADD = ../src/libgdbm.la
+g_reorg_ce_LDADD = ../src/libgdbm.la
+dtload_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtdump_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtfetch_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+dtdel_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+d_creat_ce_LDADD = ../src/libgdbm.la ../compat/libgdbm_compat.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(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 tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnits tests/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):
+atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+d_creat_ce$(EXEEXT): $(d_creat_ce_OBJECTS) $(d_creat_ce_DEPENDENCIES) $(EXTRA_d_creat_ce_DEPENDENCIES)
+ @rm -f d_creat_ce$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(d_creat_ce_OBJECTS) $(d_creat_ce_LDADD) $(LIBS)
+
+dtdel$(EXEEXT): $(dtdel_OBJECTS) $(dtdel_DEPENDENCIES) $(EXTRA_dtdel_DEPENDENCIES)
+ @rm -f dtdel$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(dtdel_OBJECTS) $(dtdel_LDADD) $(LIBS)
+
+dtdump$(EXEEXT): $(dtdump_OBJECTS) $(dtdump_DEPENDENCIES) $(EXTRA_dtdump_DEPENDENCIES)
+ @rm -f dtdump$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(dtdump_OBJECTS) $(dtdump_LDADD) $(LIBS)
+
+dtfetch$(EXEEXT): $(dtfetch_OBJECTS) $(dtfetch_DEPENDENCIES) $(EXTRA_dtfetch_DEPENDENCIES)
+ @rm -f dtfetch$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(dtfetch_OBJECTS) $(dtfetch_LDADD) $(LIBS)
+
+dtload$(EXEEXT): $(dtload_OBJECTS) $(dtload_DEPENDENCIES) $(EXTRA_dtload_DEPENDENCIES)
+ @rm -f dtload$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(dtload_OBJECTS) $(dtload_LDADD) $(LIBS)
+
+fdop$(EXEEXT): $(fdop_OBJECTS) $(fdop_DEPENDENCIES) $(EXTRA_fdop_DEPENDENCIES)
+ @rm -f fdop$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(fdop_OBJECTS) $(fdop_LDADD) $(LIBS)
+
+g_open_ce$(EXEEXT): $(g_open_ce_OBJECTS) $(g_open_ce_DEPENDENCIES) $(EXTRA_g_open_ce_DEPENDENCIES)
+ @rm -f g_open_ce$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(g_open_ce_OBJECTS) $(g_open_ce_LDADD) $(LIBS)
+
+g_reorg_ce$(EXEEXT): $(g_reorg_ce_OBJECTS) $(g_reorg_ce_DEPENDENCIES) $(EXTRA_g_reorg_ce_DEPENDENCIES)
+ @rm -f g_reorg_ce$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(g_reorg_ce_OBJECTS) $(g_reorg_ce_LDADD) $(LIBS)
+
+gtdel$(EXEEXT): $(gtdel_OBJECTS) $(gtdel_DEPENDENCIES) $(EXTRA_gtdel_DEPENDENCIES)
+ @rm -f gtdel$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtdel_OBJECTS) $(gtdel_LDADD) $(LIBS)
+
+gtdump$(EXEEXT): $(gtdump_OBJECTS) $(gtdump_DEPENDENCIES) $(EXTRA_gtdump_DEPENDENCIES)
+ @rm -f gtdump$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtdump_OBJECTS) $(gtdump_LDADD) $(LIBS)
+
+gtfetch$(EXEEXT): $(gtfetch_OBJECTS) $(gtfetch_DEPENDENCIES) $(EXTRA_gtfetch_DEPENDENCIES)
+ @rm -f gtfetch$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtfetch_OBJECTS) $(gtfetch_LDADD) $(LIBS)
+
+gtload$(EXEEXT): $(gtload_OBJECTS) $(gtload_DEPENDENCIES) $(EXTRA_gtload_DEPENDENCIES)
+ @rm -f gtload$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtload_OBJECTS) $(gtload_LDADD) $(LIBS)
+
+gtopt$(EXEEXT): $(gtopt_OBJECTS) $(gtopt_DEPENDENCIES) $(EXTRA_gtopt_DEPENDENCIES)
+ @rm -f gtopt$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtopt_OBJECTS) $(gtopt_LDADD) $(LIBS)
+
+gtver$(EXEEXT): $(gtver_OBJECTS) $(gtver_DEPENDENCIES) $(EXTRA_gtver_DEPENDENCIES)
+ @rm -f gtver$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gtver_OBJECTS) $(gtver_LDADD) $(LIBS)
+
+num2word$(EXEEXT): $(num2word_OBJECTS) $(num2word_DEPENDENCIES) $(EXTRA_num2word_DEPENDENCIES)
+ @rm -f num2word$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(num2word_OBJECTS) $(num2word_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/d_creat_ce.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtdel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtdump.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtfetch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtload.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdop.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_open_ce.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_reorg_ce.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtdel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtdump.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtfetch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtload.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtopt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/num2word.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+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
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+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)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+ clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags 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-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+
+$(srcdir)/package.m4: $(top_srcdir)/configure.ac $(srcdir)/Makefile.am
+ $(AM_V_GEN){ \
+ echo '# Signature of the current package.'; \
+ echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \
+ echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_MAJOR], [@GDBM_VERSION_MAJOR@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_MINOR], [@GDBM_VERSION_MINOR@])'; \
+ echo 'm4_define([AT_PACKAGE_VERSION_PATCH], [@GDBM_VERSION_PATCH@])'; \
+ echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
+ } >$(srcdir)/package.m4
+$(TESTSUITE): package.m4 $(TESTSUITE_AT)
+ $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp
+ mv $@.tmp $@
+
+atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && ./config.status tests/$@
+
+clean-local:
+ test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
+
+check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) $(TESTSUITE)
+
+# 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/tests/atlocal.in b/tests/atlocal.in
new file mode 100644
index 0000000..8dc31d1
--- /dev/null
+++ b/tests/atlocal.in
@@ -0,0 +1,24 @@
+# @configure_input@ -*- shell-script -*-
+# Copyright (C) 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 2, 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/>. */
+
+PATH=@abs_top_builddir@/src:$PATH
+
+@COMPAT_OPT_TRUE@COMPAT=1
+@COMPAT_OPT_FALSE@COMPAT=0
+
+
+
+
diff --git a/tests/cloexec00.at b/tests/cloexec00.at
new file mode 100644
index 0000000..022b12f
--- /dev/null
+++ b/tests/cloexec00.at
@@ -0,0 +1,25 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([cloexec: gdbm_open])
+AT_KEYWORDS([gdbm gdbm_open cloexec cloexec00])
+
+AT_CHECK([
+g_open_ce "$abs_builddir/fdop"
+],
+0)
+
+AT_CLEANUP
diff --git a/tests/cloexec01.at b/tests/cloexec01.at
new file mode 100644
index 0000000..21baac6
--- /dev/null
+++ b/tests/cloexec01.at
@@ -0,0 +1,25 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([cloexec: gdbm_reorganize])
+AT_KEYWORDS([gdbm gdbm_reorganize cloexec cloexec01])
+
+AT_CHECK([
+g_reorg_ce "$abs_builddir/fdop"
+],
+0)
+
+AT_CLEANUP
diff --git a/tests/cloexec02.at b/tests/cloexec02.at
new file mode 100644
index 0000000..9d1b7e3
--- /dev/null
+++ b/tests/cloexec02.at
@@ -0,0 +1,27 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([cloexec: dbm_open])
+AT_KEYWORDS([ndbm dbm_open cloexec cloexec02])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10 | dtload file
+d_creat_ce "$abs_builddir/fdop"
+],
+0)
+
+AT_CLEANUP
diff --git a/tests/cloexec03.at b/tests/cloexec03.at
new file mode 100644
index 0000000..5fa1c0f
--- /dev/null
+++ b/tests/cloexec03.at
@@ -0,0 +1,26 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([cloexec: dbm_open -creat])
+AT_KEYWORDS([ndbm dbm_open cloexec cloexec03])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+d_creat_ce "$abs_builddir/fdop" -creat
+],
+0)
+
+AT_CLEANUP
diff --git a/tests/create00.at b/tests/create00.at
new file mode 100644
index 0000000..c428fdc
--- /dev/null
+++ b/tests/create00.at
@@ -0,0 +1,29 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([create database])
+AT_KEYWORDS([gdbm create create00])
+
+AT_CHECK([
+AT_SORT_PREREQ
+num2word 1:1000 > input
+gtload test.db < input
+gtdump test.db | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+])
+
+AT_CLEANUP
+
diff --git a/tests/d_creat_ce.c b/tests/d_creat_ce.c
new file mode 100644
index 0000000..6a6cff2
--- /dev/null
+++ b/tests/d_creat_ce.c
@@ -0,0 +1,90 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <ndbm.h>
+
+char *
+ntos (int n, char *buf, size_t size)
+{
+ char *p = buf + size;
+ *--p = 0;
+ do
+ {
+ int x = n % 10;
+ *--p = '0' + x;
+ n /= 10;
+ }
+ while (n);
+ return p;
+}
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ DBM *d;
+ char fdbuf[2][80];
+ int i;
+ int flags = O_RDONLY;
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "usage: %s PATH-TO-FDOP [-creat] [-write]\n", argv[0]);
+ return 2;
+ }
+
+ for (i = 2; i < argc; i++)
+ {
+ if (strcmp (argv[i], "-creat") == 0)
+ flags = O_RDWR|O_CREAT;
+ else if (strcmp (argv[i], "-write") == 0)
+ flags = O_RDWR;
+ else
+ {
+ fprintf (stderr, "%s: unknown option: %s\n",
+ argv[0], argv[i]);
+ return 2;
+ }
+
+ }
+
+ if (!O_CLOEXEC)
+ return 77;
+
+ d = dbm_open ("file", flags|O_CLOEXEC, 0600);
+ if (!d)
+ {
+ perror ("dbm_open");
+ return 3;
+ }
+
+ execl (argv[1], "fdop",
+ ntos (dbm_pagfno (d), fdbuf[0], sizeof (fdbuf[0])),
+ ntos (dbm_dirfno (d), fdbuf[1], sizeof (fdbuf[1])),
+ NULL);
+ return 127;
+}
+
diff --git a/tests/dbmcreate00.at b/tests/dbmcreate00.at
new file mode 100644
index 0000000..fbfed52
--- /dev/null
+++ b/tests/dbmcreate00.at
@@ -0,0 +1,30 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([create database])
+AT_KEYWORDS([dbm create create00 dbmcreate00])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+AT_SORT_PREREQ
+num2word 1:1000 > input
+dtload test < input
+dtdump test | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmcvt.at b/tests/dbmcvt.at
new file mode 100644
index 0000000..c314c8e
--- /dev/null
+++ b/tests/dbmcvt.at
@@ -0,0 +1,34 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([converting a 1.8-style database])
+AT_KEYWORDS([dbm fetch cvt])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+dtfetch test 6
+cmp test.pag test.dir >/dev/null 2>&1 && exit 1
+exit 0
+],
+[0],
+[six
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmdel00.at b/tests/dbmdel00.at
new file mode 100644
index 0000000..8f76648
--- /dev/null
+++ b/tests/dbmdel00.at
@@ -0,0 +1,40 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete a record])
+AT_KEYWORDS([dbm delete delete00 dbmdel00])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+AT_SORT_PREREQ
+num2word 1:10 | dtload test
+dtdel test 8
+dtdump test | sort -k1,2 -n
+],
+[0],
+[1 one
+2 two
+3 three
+4 four
+5 five
+6 six
+7 seven
+9 nine
+10 ten
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmdel01.at b/tests/dbmdel01.at
new file mode 100644
index 0000000..e0b8f20
--- /dev/null
+++ b/tests/dbmdel01.at
@@ -0,0 +1,32 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete: non existing record])
+AT_KEYWORDS([dbm delete delete01 dbmdel01])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+AT_SORT_PREREQ
+num2word 1:10 | dtload test
+dtdel test 11
+],
+[2],
+[],
+[dtdel: cannot delete 11: Item not found
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmdel02.at b/tests/dbmdel02.at
new file mode 100644
index 0000000..79e5ef6
--- /dev/null
+++ b/tests/dbmdel02.at
@@ -0,0 +1,29 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete: all records])
+AT_KEYWORDS([dbm delete delete02 dbmdel02])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10 | dtload test
+dtdel test 1 2 3 4 5 6 7 8 9 10
+dtdump test
+],
+[0])
+
+AT_CLEANUP
+
diff --git a/tests/dbmfetch00.at b/tests/dbmfetch00.at
new file mode 100644
index 0000000..2eb3279
--- /dev/null
+++ b/tests/dbmfetch00.at
@@ -0,0 +1,32 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch a record])
+AT_KEYWORDS([dbm fetch fetch00 dbmfetch00])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10000 | dtload test
+dtfetch test 1 2745 9999
+],
+[0],
+[one
+two thousand seven hundred and fourty-five
+nine thousand nine hundred and ninety-nine
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmfetch01.at b/tests/dbmfetch01.at
new file mode 100644
index 0000000..ce74a16
--- /dev/null
+++ b/tests/dbmfetch01.at
@@ -0,0 +1,31 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch: nonexisting record])
+AT_KEYWORDS([dbm fetch fetch01 dbmfetch01])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10000 | dtload test
+dtfetch test 0
+],
+[2],
+[],
+[dtfetch: 0: not found
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmfetch02.at b/tests/dbmfetch02.at
new file mode 100644
index 0000000..c581a22
--- /dev/null
+++ b/tests/dbmfetch02.at
@@ -0,0 +1,32 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch from a read-only database])
+AT_KEYWORDS([dbm fetch fetch02 dbmfetch02])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+num2word 1:10 | dtload test
+chmod -w test.dir test.pag
+dtfetch test 6 10
+],
+[0],
+[six
+ten
+])
+
+AT_CLEANUP
+
diff --git a/tests/dbmfetch03.at b/tests/dbmfetch03.at
new file mode 100644
index 0000000..b1e149b
--- /dev/null
+++ b/tests/dbmfetch03.at
@@ -0,0 +1,36 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch from a read-only 1.8-style database])
+AT_KEYWORDS([dbm fetch fetch03 dbmfetch03])
+
+AT_CHECK([
+AT_COMPAT_PREREQ
+mkdir dir
+cd dir
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+chmod -w test.dir test.pag .
+dtfetch test 6 10
+],
+[0],
+[six
+ten
+])
+
+AT_CLEANUP
+
diff --git a/tests/delete00.at b/tests/delete00.at
new file mode 100644
index 0000000..ad98034
--- /dev/null
+++ b/tests/delete00.at
@@ -0,0 +1,39 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete a record])
+AT_KEYWORDS([gdbm delete delete00])
+
+AT_CHECK([
+AT_SORT_PREREQ
+num2word 1:10 | gtload test.db
+gtdel test.db 8
+gtdump test.db | sort -k1,2 -n
+],
+[0],
+[1 one
+2 two
+3 three
+4 four
+5 five
+6 six
+7 seven
+9 nine
+10 ten
+])
+
+AT_CLEANUP
+
diff --git a/tests/delete01.at b/tests/delete01.at
new file mode 100644
index 0000000..ab7fe4b
--- /dev/null
+++ b/tests/delete01.at
@@ -0,0 +1,31 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete: non existing record])
+AT_KEYWORDS([gdbm delete delete01])
+
+AT_CHECK([
+AT_SORT_PREREQ
+num2word 1:10 | gtload test.db
+gtdel test.db 11
+],
+[2],
+[],
+[gtdel: cannot delete 11: Item not found
+])
+
+AT_CLEANUP
+
diff --git a/tests/delete02.at b/tests/delete02.at
new file mode 100644
index 0000000..6162c0b
--- /dev/null
+++ b/tests/delete02.at
@@ -0,0 +1,28 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([delete: all records])
+AT_KEYWORDS([gdbm delete delete02])
+
+AT_CHECK([
+num2word 1:10 | gtload test.db
+gtdel test.db 1 2 3 4 5 6 7 8 9 10
+gtdump test.db
+],
+[0])
+
+AT_CLEANUP
+
diff --git a/tests/dtdel.c b/tests/dtdel.c
new file mode 100644
index 0000000..b7d0112
--- /dev/null
+++ b/tests/dtdel.c
@@ -0,0 +1,96 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dbm.h"
+#include "progname.h"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ char *dbname;
+ datum key;
+ int flags = 0;
+ int data_z = 0;
+ int rc = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-null] [-nolock] [-nommap] [-sync] DBFILE KEY [KEY...]\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-nommap") == 0)
+ flags |= GDBM_NOMMAP;
+ else if (strcmp (arg, "-sync") == 0)
+ flags |= GDBM_SYNC;
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ if (dbminit (dbname))
+ {
+ fprintf (stderr, "dbminit failed\n");
+ exit (1);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ key.dptr = arg;
+ key.dsize = strlen (arg) + !!data_z;
+
+ if (delete(key))
+ {
+ fprintf (stderr, "%s: cannot delete %s: %s\n",
+ progname, arg, gdbm_strerror (gdbm_errno));
+ rc = 2;
+ }
+ }
+ dbmclose ();
+ exit (rc);
+}
diff --git a/tests/dtdump.c b/tests/dtdump.c
new file mode 100644
index 0000000..4e0aa3e
--- /dev/null
+++ b/tests/dtdump.c
@@ -0,0 +1,97 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dbm.h"
+#include "progname.h"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ char *dbname;
+ datum key;
+ datum data;
+ int delim = '\t';
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-delim=CHR] DBFILE\n", progname);
+ exit (0);
+ }
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc != 1)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ if (dbminit (dbname))
+ {
+ fprintf (stderr, "dbminit failed\n");
+ exit (1);
+ }
+
+ for (key = firstkey (); key.dptr; key = nextkey (key))
+ {
+ int i;
+
+ for (i = 0; i < key.dsize && key.dptr[i]; i++)
+ {
+ if (key.dptr[i] == delim || key.dptr[i] == '\\')
+ fputc ('\\', stdout);
+ fputc (key.dptr[i], stdout);
+ }
+
+ fputc (delim, stdout);
+
+ data = fetch (key);
+ i = data.dsize;
+ if (data.dptr[i-1] == 0)
+ i--;
+
+ fwrite (data.dptr, i, 1, stdout);
+
+ fputc ('\n', stdout);
+ }
+
+ dbmclose ();
+ exit (0);
+}
diff --git a/tests/dtfetch.c b/tests/dtfetch.c
new file mode 100644
index 0000000..8a2686f
--- /dev/null
+++ b/tests/dtfetch.c
@@ -0,0 +1,119 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dbm.h"
+#include "progname.h"
+
+void
+print_key (FILE *fp, datum key, int delim)
+{
+ size_t i;
+
+ for (i = 0; i < key.dsize && key.dptr[i]; i++)
+ {
+ if (key.dptr[i] == delim || key.dptr[i] == '\\')
+ fputc ('\\', fp);
+ fputc (key.dptr[i], fp);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ char *dbname;
+ datum key;
+ datum data;
+ int data_z = 0;
+ int delim = 0;
+ int rc = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-null] [-delim=CHR] DBFILE KEY [KEY...]\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ if (dbminit (dbname))
+ {
+ fprintf (stderr, "dbminit failed\n");
+ exit (1);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ key.dptr = arg;
+ key.dsize = strlen (arg) + !!data_z;
+
+ data = fetch (key);
+ if (data.dptr == NULL)
+ {
+ rc = 2;
+ fprintf (stderr, "%s: ", progname);
+ print_key (stderr, key, delim);
+ fprintf (stderr, ": not found\n");
+ continue;
+ }
+ if (delim)
+ {
+ print_key (stdout, key, delim);
+ fputc (delim, stdout);
+ }
+
+ fwrite (data.dptr, data.dsize - !!data_z, 1, stdout);
+
+ fputc ('\n', stdout);
+ }
+
+ dbmclose ();
+ exit (rc);
+}
diff --git a/tests/dtload.c b/tests/dtload.c
new file mode 100644
index 0000000..a02b36c
--- /dev/null
+++ b/tests/dtload.c
@@ -0,0 +1,152 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "dbm.h"
+#include "progname.h"
+
+#define PAGSUF ".pag"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ char *dbname;
+ int line = 0;
+ char buf[1024];
+ datum key;
+ datum data;
+ int delim = '\t';
+ int data_z = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-null] [-delim=CHR] DBFILE\n", progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc != 1)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+
+ /* Check if .pag file exists. Create it if it doesn't, as DBM
+ cannot do it itself. */
+
+ dbname = malloc (strlen (*argv) + sizeof (PAGSUF));
+ if (!dbname)
+ abort ();
+
+ strcat (strcpy (dbname, *argv), PAGSUF);
+
+ if (access (dbname, F_OK))
+ {
+ int fd = creat (dbname, 0644);
+ if (fd < 0)
+ {
+ fprintf (stderr, "%s: ", progname);
+ perror (dbname);
+ exit (1);
+ }
+ close (fd);
+ }
+ free (dbname);
+
+ if (dbminit (*argv))
+ {
+ fprintf (stderr, "dbminit failed\n");
+ exit (1);
+ }
+
+ while (fgets (buf, sizeof buf, stdin))
+ {
+ size_t i, j;
+ size_t len = strlen (buf);
+
+ if (buf[len - 1] != '\n')
+ {
+ fprintf (stderr, "%s: %d: line too long\n",
+ progname, line);
+ continue;
+ }
+
+ buf[--len] = 0;
+
+ line++;
+
+ for (i = j = 0; i < len; i++)
+ {
+ if (buf[i] == '\\')
+ i++;
+ else if (buf[i] == delim)
+ break;
+ else
+ buf[j++] = buf[i];
+ }
+
+ if (buf[i] != delim)
+ {
+ fprintf (stderr, "%s: %d: malformed line\n",
+ progname, line);
+ continue;
+ }
+ buf[j] = 0;
+
+ key.dptr = buf;
+ key.dsize = j + data_z;
+ data.dptr = buf + i + 1;
+ data.dsize = strlen (data.dptr) + data_z;
+ if (store (key, data) != 0)
+ {
+ fprintf (stderr, "%s: %d: item not inserted\n",
+ progname, line);
+ exit (1);
+ }
+ }
+ dbmclose ();
+ exit (0);
+}
diff --git a/tests/fdop.c b/tests/fdop.c
new file mode 100644
index 0000000..1729323
--- /dev/null
+++ b/tests/fdop.c
@@ -0,0 +1,36 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <unistd.h>
+
+/* usage: fdop FD [FD...]
+ Return: false if any of the FDs is open, true otherwise.
+*/
+int
+main (int argc, char **argv)
+{
+ int fd = dup (0);
+
+ while (--argc)
+ {
+ int n = atoi (*++argv);
+ if (n < fd)
+ return 1;
+ }
+ return 0;
+}
diff --git a/tests/fetch00.at b/tests/fetch00.at
new file mode 100644
index 0000000..0b2f48b
--- /dev/null
+++ b/tests/fetch00.at
@@ -0,0 +1,31 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch a record])
+AT_KEYWORDS([gdbm fetch fetch00])
+
+AT_CHECK([
+num2word 1:10000 | gtload test.db
+gtfetch test.db 1 2745 9999
+],
+[0],
+[one
+two thousand seven hundred and fourty-five
+nine thousand nine hundred and ninety-nine
+])
+
+AT_CLEANUP
+
diff --git a/tests/fetch01.at b/tests/fetch01.at
new file mode 100644
index 0000000..8618b66
--- /dev/null
+++ b/tests/fetch01.at
@@ -0,0 +1,30 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([fetch: nonexisting record])
+AT_KEYWORDS([gdbm fetch fetch01])
+
+AT_CHECK([
+num2word 1:10000 | gtload test.db
+gtfetch test.db 0
+],
+[2],
+[],
+[gtfetch: 0: not found
+])
+
+AT_CLEANUP
+
diff --git a/tests/g_open_ce.c b/tests/g_open_ce.c
new file mode 100644
index 0000000..4f1fcd4
--- /dev/null
+++ b/tests/g_open_ce.c
@@ -0,0 +1,66 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <gdbm.h>
+
+char *
+ntos (int n, char *buf, size_t size)
+{
+ char *p = buf + size;
+ *--p = 0;
+ do
+ {
+ int x = n % 10;
+ *--p = '0' + x;
+ n /= 10;
+ }
+ while (n);
+ return p;
+}
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ GDBM_FILE d;
+ char fdbuf[80];
+
+ if (argc != 2)
+ {
+ fprintf (stderr, "usage: %s PATH-TO-FDOP\n", argv[0]);
+ return 2;
+ }
+ if (!O_CLOEXEC)
+ return 77;
+ d = gdbm_open ("file.db", 0, GDBM_NEWDB|GDBM_CLOEXEC, 0600, NULL);
+ if (!d)
+ {
+ fprintf (stderr, "gdbm_open: %s\n", gdbm_strerror (gdbm_errno));
+ return 3;
+ }
+ execl (argv[1], "fdop",
+ ntos (gdbm_fdesc (d), fdbuf, sizeof (fdbuf)), NULL);
+ return 127;
+}
+
diff --git a/tests/g_reorg_ce.c b/tests/g_reorg_ce.c
new file mode 100644
index 0000000..f72afa2
--- /dev/null
+++ b/tests/g_reorg_ce.c
@@ -0,0 +1,72 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <gdbm.h>
+
+char *
+ntos (int n, char *buf, size_t size)
+{
+ char *p = buf + size;
+ *--p = 0;
+ do
+ {
+ int x = n % 10;
+ *--p = '0' + x;
+ n /= 10;
+ }
+ while (n);
+ return p;
+}
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ GDBM_FILE d;
+ char fdbuf[80];
+
+ if (argc != 2)
+ {
+ fprintf (stderr, "usage: %s PATH-TO-FDOP\n", argv[0]);
+ return 2;
+ }
+ if (!O_CLOEXEC)
+ return 77;
+ d = gdbm_open ("file.db", 0, GDBM_NEWDB|GDBM_CLOEXEC, 0600, NULL);
+ if (!d)
+ {
+ fprintf (stderr, "gdbm_open: %s\n", gdbm_strerror (gdbm_errno));
+ return 3;
+ }
+ if (gdbm_reorganize (d))
+ {
+ fprintf (stderr, "gdbm_reorganize: %s\n",
+ gdbm_strerror (gdbm_errno));
+ return 3;
+ }
+ execl (argv[1], "fdop",
+ ntos (gdbm_fdesc (d), fdbuf, sizeof (fdbuf)), NULL);
+ return 127;
+}
+
diff --git a/tests/gtdel.c b/tests/gtdel.c
new file mode 100644
index 0000000..ff9cdb9
--- /dev/null
+++ b/tests/gtdel.c
@@ -0,0 +1,98 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gdbm.h"
+#include "progname.h"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ const char *dbname;
+ datum key;
+ int flags = 0;
+ GDBM_FILE dbf;
+ int data_z = 0;
+ int rc = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-null] [-nolock] [-nommap] [-sync] DBFILE KEY [KEY...]\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-nommap") == 0)
+ flags |= GDBM_NOMMAP;
+ else if (strcmp (arg, "-sync") == 0)
+ flags |= GDBM_SYNC;
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ dbf = gdbm_open (dbname, 0, GDBM_WRITER|flags, 0, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ key.dptr = arg;
+ key.dsize = strlen (arg) + !!data_z;
+
+ if (gdbm_delete(dbf, key))
+ {
+ fprintf (stderr, "%s: cannot delete %s: %s\n",
+ progname, arg, gdbm_strerror (gdbm_errno));
+ rc = 2;
+ }
+ }
+ gdbm_close (dbf);
+ exit (rc);
+}
diff --git a/tests/gtdump.c b/tests/gtdump.c
new file mode 100644
index 0000000..927a47c
--- /dev/null
+++ b/tests/gtdump.c
@@ -0,0 +1,113 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gdbm.h"
+#include "progname.h"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ const char *dbname;
+ datum key;
+ datum data;
+ int flags = 0;
+ GDBM_FILE dbf;
+ int delim = '\t';
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-nolock] [-nommap] [-delim=CHR] DBFILE\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-nommap") == 0)
+ flags |= GDBM_NOMMAP;
+ else if (strcmp (arg, "-sync") == 0)
+ flags |= GDBM_SYNC;
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc != 1)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ dbf = gdbm_open (dbname, 0, GDBM_READER|flags, 00664, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+
+ key = gdbm_firstkey (dbf);
+ while (key.dptr)
+ {
+ size_t i;
+ datum nextkey = gdbm_nextkey (dbf, key);
+
+ for (i = 0; i < key.dsize && key.dptr[i]; i++)
+ {
+ if (key.dptr[i] == delim || key.dptr[i] == '\\')
+ fputc ('\\', stdout);
+ fputc (key.dptr[i], stdout);
+ }
+
+ fputc (delim, stdout);
+
+ data = gdbm_fetch (dbf, key);
+ i = data.dsize;
+ if (data.dptr[i-1] == 0)
+ i--;
+
+ fwrite (data.dptr, i, 1, stdout);
+ free (data.dptr);
+
+ fputc ('\n', stdout);
+
+ free (key.dptr);
+ key = nextkey;
+ }
+
+ gdbm_close (dbf);
+ exit (0);
+}
diff --git a/tests/gtfetch.c b/tests/gtfetch.c
new file mode 100644
index 0000000..0c254b7
--- /dev/null
+++ b/tests/gtfetch.c
@@ -0,0 +1,127 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gdbm.h"
+#include "progname.h"
+
+void
+print_key (FILE *fp, datum key, int delim)
+{
+ size_t i;
+
+ for (i = 0; i < key.dsize && key.dptr[i]; i++)
+ {
+ if (key.dptr[i] == delim || key.dptr[i] == '\\')
+ fputc ('\\', fp);
+ fputc (key.dptr[i], fp);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ const char *dbname;
+ datum key;
+ datum data;
+ int flags = 0;
+ GDBM_FILE dbf;
+ int data_z = 0;
+ int delim = 0;
+ int rc = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-nolock] [-nommap] [-null] [-delim=CHR] DBFILE KEY [KEY...]\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-nommap") == 0)
+ flags |= GDBM_NOMMAP;
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc < 2)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ dbf = gdbm_open (dbname, 0, GDBM_READER|flags, 00664, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ key.dptr = arg;
+ key.dsize = strlen (arg) + !!data_z;
+
+ data = gdbm_fetch (dbf, key);
+ if (data.dptr == NULL)
+ {
+ rc = 2;
+ fprintf (stderr, "%s: ", progname);
+ print_key (stderr, key, delim);
+ fprintf (stderr, ": not found\n");
+ continue;
+ }
+ if (delim)
+ {
+ print_key (stdout, key, delim);
+ fputc (delim, stdout);
+ }
+
+ fwrite (data.dptr, data.dsize - !!data_z, 1, stdout);
+ free (data.dptr);
+
+ fputc ('\n', stdout);
+ }
+
+ gdbm_close (dbf);
+ exit (rc);
+}
diff --git a/tests/gtload.c b/tests/gtload.c
new file mode 100644
index 0000000..2920463
--- /dev/null
+++ b/tests/gtload.c
@@ -0,0 +1,175 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "gdbm.h"
+#include "progname.h"
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ const char *dbname;
+ int line = 0;
+ char buf[1024];
+ datum key;
+ datum data;
+ int replace = 0;
+ int flags = 0;
+ int mode = GDBM_WRCREAT;
+ int block_size = 0;
+ GDBM_FILE dbf;
+ int delim = '\t';
+ int data_z = 0;
+ size_t mapped_size_max = 0;
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-replace] [-clear] [-blocksize=N] [-null] [-nolock] [-nommap] [-maxmap=N] [-sync] [-delim=CHR] DBFILE\n", progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-replace") == 0)
+ replace |= GDBM_REPLACE;
+ else if (strcmp (arg, "-clear") == 0)
+ mode = GDBM_NEWDB;
+ else if (strcmp (arg, "-null") == 0)
+ data_z = 1;
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-nommap") == 0)
+ flags |= GDBM_NOMMAP;
+ else if (strcmp (arg, "-sync") == 0)
+ flags |= GDBM_SYNC;
+ else if (strncmp (arg, "-blocksize=", 11) == 0)
+ block_size = atoi (arg + 11);
+ else if (strncmp (arg, "-maxmap=", 8) == 0)
+ {
+ char *p;
+
+ errno = 0;
+ mapped_size_max = strtoul (arg + 8, &p, 10);
+
+ if (errno)
+ {
+ fprintf (stderr, "%s: ", progname);
+ perror ("maxmap");
+ exit (1);
+ }
+
+ if (*p)
+ {
+ fprintf (stderr, "%s: bad maxmap\n", progname);
+ exit (1);
+ }
+ }
+ else if (strncmp (arg, "-delim=", 7) == 0)
+ delim = arg[7];
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc != 1)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+
+ dbf = gdbm_open (dbname, block_size, mode|flags, 00664, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+
+ if (mapped_size_max)
+ {
+ if (gdbm_setopt (dbf, GDBM_SETMAXMAPSIZE, &mapped_size_max,
+ sizeof (mapped_size_max)))
+ {
+ fprintf (stderr, "gdbm_setopt failed: %s\n",
+ gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+ }
+
+ while (fgets (buf, sizeof buf, stdin))
+ {
+ size_t i, j;
+ size_t len = strlen (buf);
+
+ if (buf[len - 1] != '\n')
+ {
+ fprintf (stderr, "%s: %d: line too long\n",
+ progname, line);
+ continue;
+ }
+
+ buf[--len] = 0;
+
+ line++;
+
+ for (i = j = 0; i < len; i++)
+ {
+ if (buf[i] == '\\')
+ i++;
+ else if (buf[i] == delim)
+ break;
+ else
+ buf[j++] = buf[i];
+ }
+
+ if (buf[i] != delim)
+ {
+ fprintf (stderr, "%s: %d: malformed line\n",
+ progname, line);
+ continue;
+ }
+ buf[j] = 0;
+
+ key.dptr = buf;
+ key.dsize = j + data_z;
+ data.dptr = buf + i + 1;
+ data.dsize = strlen (data.dptr) + data_z;
+ if (gdbm_store (dbf, key, data, replace) != 0)
+ {
+ fprintf (stderr, "%s: %d: item not inserted\n",
+ progname, line);
+ exit (1);
+ }
+ }
+ gdbm_close (dbf);
+ exit (0);
+}
diff --git a/tests/gtopt.c b/tests/gtopt.c
new file mode 100644
index 0000000..13ad8cc
--- /dev/null
+++ b/tests/gtopt.c
@@ -0,0 +1,414 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include "gdbmdefs.h"
+#include "progname.h"
+
+const char *progname;
+const char *dbname;
+int flags = 0; /* gdbm_open flags */
+int mode = GDBM_WRCREAT; /* gdbm_open mode */
+int block_size = 0; /* block size for the db. 0 means default */
+size_t mapped_size_max = 32768; /* size of the memory mapped region */
+size_t cache_size = 32; /* cache size */
+
+static size_t
+get_max_mmap_size (const char *arg)
+{
+ char *p;
+ size_t size;
+
+ errno = 0;
+ size = strtoul (arg, &p, 10);
+
+ if (errno)
+ {
+ fprintf (stderr, "%s: ", progname);
+ perror ("maxmap");
+ exit (1);
+ }
+
+ if (*p)
+ {
+ fprintf (stderr, "%s: bad maxmap\n", progname);
+ exit (1);
+ }
+ return size;
+}
+
+/* Test results */
+#define RES_PASS 0
+#define RES_FAIL 1
+#define RES_XFAIL 2
+#define RES_SKIP 3
+
+const char *resstr[] = { "PASS", "FAIL", "XFAIL", "SKIP" };
+static int _res_max = sizeof(resstr) / sizeof(resstr[0]);
+
+/* A single setopt testcase */
+struct optest
+{
+ char *group; /* Group this testcase belongs to */
+ char *name; /* Testcase name */
+ /* gdbm_setopt arguments: */
+ int code; /* option code */
+ void *valptr; /* points to the value */
+ int valsize; /* size of the value */
+ /* end of arguments */
+ int xfail; /* if !0, expected value of gdbm_errno */
+ int (*test) (void *valptr); /* Test function (can be NULL) */
+ void (*init) (void *valptr, int valsize); /* Initialization function
+ (can be NULL) */
+};
+
+/* Storage for the test value */
+char *string;
+size_t size;
+int intval;
+int retbool;
+
+/* Individual test and initialization functions */
+
+int
+test_getflags (void *valptr)
+{
+ int expected = mode | flags;
+#ifndef HAVE_MMAP
+ expected |= GDBM_NOMMAP;
+#endif
+ return (*(int*) valptr == expected) ? RES_PASS : RES_FAIL;
+}
+
+int
+test_dbname (void *valptr)
+{
+ char *s = *(char**)valptr;
+ int rc = strcmp (string, dbname) == 0 ? RES_PASS : RES_FAIL;
+ if (rc != RES_PASS)
+ printf ("[got %s instead of %s] ", s, dbname);
+ free (s);
+ return rc;
+}
+
+void
+init_cachesize (void *valptr, int valsize)
+{
+ *(size_t*) valptr = cache_size;
+}
+
+int
+test_getcachesize (void *valptr)
+{
+ return *(size_t*) valptr == cache_size ? RES_PASS : RES_FAIL;
+}
+
+void
+init_true (void *valptr, int valsize)
+{
+ *(int*) valptr = 1;
+}
+
+void
+init_false (void *valptr, int valsize)
+{
+ *(int*) valptr = 0;
+}
+
+void
+init_negate_bool (void *valptr, int valsize)
+{
+ *(int*) valptr = !retbool;
+}
+
+int
+test_true (void *valptr)
+{
+ return *(int*) valptr == 1 ? RES_PASS : RES_FAIL;
+}
+
+int
+test_false (void *valptr)
+{
+ return *(int*) valptr == 0 ? RES_PASS : RES_FAIL;
+}
+
+int
+test_negate_bool (void *valptr)
+{
+ return *(int*) valptr == !retbool ? RES_PASS : RES_FAIL;
+}
+
+int
+test_bool (void *valptr)
+{
+ return *(int*) valptr == retbool ? RES_PASS : RES_FAIL;
+}
+
+int
+test_initial_maxmapsize(void *valptr)
+{
+ return *(size_t*) valptr == SIZE_T_MAX ? RES_PASS : RES_FAIL;
+}
+
+void
+init_maxmapsize (void *valptr, int valsize)
+{
+ *(size_t*)valptr = mapped_size_max;
+}
+
+int
+test_maxmapsize (void *valptr)
+{
+ size_t page_size = sysconf (_SC_PAGESIZE);
+ size_t expected_size = ((mapped_size_max + page_size - 1) / page_size) *
+ page_size;
+ return (*(size_t*) valptr == expected_size) ? RES_PASS : RES_FAIL;
+}
+
+int
+test_mmap_group (void *valptr)
+{
+#ifdef HAVE_MMAP
+ return RES_PASS;
+#else
+ return RES_SKIP;
+#endif
+}
+
+/* Create a group of testcases for testing a boolean option.
+ Arguments:
+
+ grp - group name
+ set - GDBM_SETxxx option
+ get - GDBM_GETxxx option
+*/
+#define TEST_BOOL_OPTION(grp, set,get) \
+ { #grp, }, \
+ { #grp, "initial " #get, get, &retbool, sizeof (retbool), \
+ 0, NULL, NULL }, \
+ { #grp, #set, set, &intval, sizeof (intval), \
+ 0, NULL, init_negate_bool }, \
+ { #grp, #get, get, &intval, sizeof (intval), \
+ 0, test_negate_bool, NULL }, \
+ { #grp, #set " true", set, &intval, sizeof (intval), \
+ 0, NULL, init_true }, \
+ { #grp, #get, get, &intval, sizeof (intval), \
+ 0, test_true, NULL }, \
+ { #grp, #set " false", set, &intval, sizeof (intval), \
+ 0, NULL, init_false }, \
+ { #grp, #get, get, &intval, sizeof (intval), \
+ 0, test_false, NULL }
+
+
+/* Table of testcases: */
+struct optest optest_tab[] = {
+ { "GETFLAGS", "GDBM_GETFLAGS", GDBM_GETFLAGS, &intval, sizeof (intval),
+ 0, test_getflags },
+
+ { "CACHESIZE" },
+ { "CACHESIZE", "initial GDBM_SETCACHESIZE", GDBM_SETCACHESIZE,
+ &size, sizeof (size), 0,
+ NULL, init_cachesize },
+ { "CACHESIZE", "GDBM_GETCACHESIZE", GDBM_GETCACHESIZE,
+ &size, sizeof (size), 0,
+ test_getcachesize },
+ { "CACHESIZE", "second GDBM_SETCACHESIZE", GDBM_SETCACHESIZE,
+ &size, sizeof (size),
+ GDBM_OPT_ALREADY_SET, NULL, init_cachesize },
+
+ TEST_BOOL_OPTION (SYNCMODE, GDBM_SETSYNCMODE, GDBM_GETSYNCMODE),
+ TEST_BOOL_OPTION (CENTFREE, GDBM_SETCENTFREE, GDBM_GETCENTFREE),
+ TEST_BOOL_OPTION (COALESCEBLKS, GDBM_SETCOALESCEBLKS, GDBM_GETCOALESCEBLKS),
+
+ /* MMAP group */
+ { "MMAP", NULL, 0, NULL, 0, 0, test_mmap_group },
+
+ { "MMAP", "initial GDBM_GETMMAP", GDBM_GETMMAP,
+ &intval, sizeof (intval), 0,
+ test_true },
+ { "MMAP", "GDBM_SETMMAP false", GDBM_SETMMAP,
+ &intval, sizeof (intval), 0,
+ NULL, init_false },
+ { "MMAP", "GDBM_GETMMAP", GDBM_GETMMAP,
+ &intval, sizeof (intval), 0,
+ test_false },
+
+ { "MMAP", "initial GDBM_GETMAXMAPSIZE", GDBM_GETMAXMAPSIZE,
+ &size, sizeof (size), 0,
+ test_initial_maxmapsize, NULL },
+ { "MMAP", "GDBM_SETMAXMAPSIZE", GDBM_SETMAXMAPSIZE,
+ &size, sizeof (size), 0,
+ NULL, init_maxmapsize },
+ { "MMAP", "GDBM_GETMAXMAPSIZE", GDBM_GETMAXMAPSIZE,
+ &size, sizeof (size), 0,
+ test_maxmapsize, NULL },
+
+
+ { "GETDBNAME", "GDBM_GETDBNAME", GDBM_GETDBNAME,
+ &string, sizeof (string), 0,
+ test_dbname, NULL },
+ { NULL }
+};
+
+/* Use ARGV to determine whether to run the given GROUP of
+ testcases.
+
+ ARGV is a NULL-terminated array of allowed group names. A "!"
+ prefix can be used to denote negation. */
+int
+groupok (char **argv, const char *group)
+{
+ int retval = 1;
+
+ if (*argv)
+ {
+ char *arg;
+
+ while ((arg = *argv++))
+ {
+ if (*arg == '!')
+ {
+ if (strcasecmp (arg + 1, group) == 0)
+ return 0;
+ retval = 1;
+ }
+ else
+ {
+ if (strcasecmp (arg, group) == 0)
+ return 1;
+ retval = 0;
+ }
+ }
+ }
+
+ return retval;
+}
+
+int
+main (int argc, char **argv)
+{
+ GDBM_FILE dbf;
+ struct optest *op;
+
+ progname = canonical_progname (argv[0]);
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-h") == 0)
+ {
+ printf ("usage: %s [-blocksize=N] [-nolock] [-sync] [-maxmap=N] DBFILE [GROUP [GROUP...]\n",
+ progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-nolock") == 0)
+ flags |= GDBM_NOLOCK;
+ else if (strcmp (arg, "-sync") == 0)
+ flags |= GDBM_SYNC;
+ else if (strncmp (arg, "-blocksize=", 11) == 0)
+ block_size = atoi (arg + 11);
+ else if (strncmp (arg, "-maxmap=", 8) == 0)
+ mapped_size_max = get_max_mmap_size (arg + 8);
+ else if (strcmp (arg, "--") == 0)
+ {
+ --argc;
+ ++argv;
+ break;
+ }
+ else if (arg[0] == '-')
+ {
+ fprintf (stderr, "%s: unknown option %s\n", progname, arg);
+ exit (1);
+ }
+ else
+ break;
+ }
+
+ if (argc == 0)
+ {
+ fprintf (stderr, "%s: wrong arguments\n", progname);
+ exit (1);
+ }
+ dbname = *argv;
+ ++argv;
+ --argc;
+
+ dbf = gdbm_open (dbname, block_size, mode|flags, 00664, NULL);
+ if (!dbf)
+ {
+ fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ exit (1);
+ }
+
+ for (op = optest_tab; op->group; op++)
+ {
+ int rc;
+
+ if (!groupok (argv, op->group))
+ continue;
+
+ if (!op->name)
+ {
+ /* Group header */
+ const char *grp = op->group;
+
+ printf ("* %s:", grp);
+ if (op->test && (rc = op->test (NULL)) != RES_PASS)
+ {
+ printf (" %s", resstr[rc]);
+ for (op++; op->name && strcmp (op->group, grp) == 0; op++)
+ ;
+ op--;
+ }
+ putchar ('\n');
+ continue;
+ }
+
+ printf ("%s: ", op->name);
+ if (op->init)
+ op->init (op->valptr, op->valsize);
+
+ rc = gdbm_setopt (dbf, op->code, op->valptr, op->valsize);
+ if (rc)
+ {
+ if (gdbm_errno == op->xfail)
+ puts (resstr[RES_XFAIL]);
+ else
+ printf ("%s: %s\n", resstr[RES_FAIL],
+ gdbm_strerror (gdbm_errno));
+ }
+ else if (!op->test)
+ puts (resstr[RES_PASS]);
+ else
+ {
+ rc = op->test (op->valptr);
+ assert (rc >= 0 && rc < _res_max);
+ puts (resstr[rc]);
+ }
+ }
+
+ gdbm_close (dbf);
+ exit (0);
+}
+
+
+
diff --git a/tests/gtver.c b/tests/gtver.c
new file mode 100644
index 0000000..27fc0b9
--- /dev/null
+++ b/tests/gtver.c
@@ -0,0 +1,74 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "gdbm.h"
+#include "progname.h"
+
+#define major_number(lib) ((lib) ? gdbm_version_number[0] : GDBM_VERSION_MAJOR)
+#define minor_number(lib) ((lib) ? gdbm_version_number[1] : GDBM_VERSION_MINOR)
+#define patch_number(lib) ((lib) ? gdbm_version_number[2] : GDBM_VERSION_PATCH)
+
+int
+main (int argc, char **argv)
+{
+ const char *progname = canonical_progname (argv[0]);
+ int library = 0;
+
+ if (argc == 1)
+ {
+ printf ("%s\n", gdbm_version);
+ exit (0);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (strcmp (arg, "-help") == 0)
+ {
+ printf ("usage: %s [-string] [-lib] [-header] [-major] [-minor] [-patch] [-full]\n", progname);
+ exit (0);
+ }
+ else if (strcmp (arg, "-string") == 0)
+ printf ("%s\n", gdbm_version);
+ else if (strcmp (arg, "-lib") == 0)
+ library = 1;
+ else if (strcmp (arg, "-header") == 0)
+ library = 0;
+ else if (strcmp (arg, "-major") == 0)
+ printf ("%d\n", major_number (library));
+ else if (strcmp (arg, "-minor") == 0)
+ printf ("%d\n", minor_number (library));
+ else if (strcmp (arg, "-patch") == 0)
+ printf ("%d\n", patch_number (library));
+ else if (strcmp (arg, "-full") == 0)
+ printf ("%d.%d.%d\n",
+ major_number (library),
+ minor_number (library),
+ patch_number (library));
+ else
+ {
+ fprintf (stderr, "%s: unknown option %s\n",
+ progname, arg);
+ exit (1);
+ }
+ }
+ exit (0);
+}
diff --git a/tests/num2word.c b/tests/num2word.c
new file mode 100644
index 0000000..4b55a35
--- /dev/null
+++ b/tests/num2word.c
@@ -0,0 +1,255 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+#include "autoconf.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+const char *progname;
+
+const char *nstr[][10] = {
+ { "zero",
+ "one",
+ "two",
+ "three",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine"
+ },
+ { "ten",
+ "eleven",
+ "twelve",
+ "thirteen",
+ "fourteen",
+ "fifteen",
+ "sixteen",
+ "seventeen",
+ "eighteen",
+ "nineteen"
+ },
+ { NULL,
+ NULL,
+ "twenty",
+ "thirty",
+ "fourty",
+ "fifty",
+ "sixty",
+ "seventy",
+ "eighty",
+ "ninety"
+ }
+};
+
+const char *short_scale[] = {
+ "one",
+ "thousand",
+ "million",
+ "billion"
+ /* End of range for 32-bit unsigned long */
+};
+size_t short_scale_max = sizeof (short_scale) / sizeof (short_scale[0]);
+
+char buffer[1024];
+size_t bufsize = sizeof(buffer);
+size_t bufoff;
+int delim = 0;
+
+void
+copy (const char *str, int dch)
+{
+ size_t len = strlen (str);
+ if (len + !!dch > bufoff)
+ abort ();
+ if (dch)
+ buffer[--bufoff] = dch;
+ bufoff -= len;
+ memcpy (buffer + bufoff, str, len);
+ delim = ' ';
+}
+
+void
+format_100 (unsigned long num)
+{
+ if (num == 0)
+ ;
+ else if (num < 10)
+ copy (nstr[0][num], delim);
+ else if (num < 20)
+ copy (nstr[1][num-10], delim);
+ else
+ {
+ unsigned long tens = num / 10;
+ num %= 10;
+ if (num)
+ {
+ copy (nstr[0][num], delim);
+ copy ("-", 0);
+ copy (nstr[2][tens], 0);
+ }
+ else
+ copy (nstr[2][tens], delim);
+ }
+}
+
+void
+format_1000 (unsigned long num, int more)
+{
+ size_t n = num % 100;
+ num /= 100;
+ format_100 (n);
+ more |= num != 0;
+ if (n && more)
+ copy ("and", delim);
+ if (num)
+ {
+ copy ("hundred", delim);
+ copy (nstr[0][num], delim);
+ }
+}
+
+
+void
+format_number (unsigned long num)
+{
+ int s = 0;
+ size_t off;
+
+ bufoff = bufsize;
+ buffer[--bufoff] = 0;
+ off = bufoff;
+ delim = 0;
+
+ do
+ {
+ unsigned long n = num % 1000;
+
+ num /= 1000;
+
+ if (s > 0 && ((n && off > bufoff) || num == 0))
+ copy (short_scale[s], delim);
+ s++;
+
+ if (s > short_scale_max)
+ abort ();
+
+ format_1000 (n, num != 0);
+ }
+ while (num);
+
+ if (bufoff + 1 == bufsize)
+ copy (nstr[0][0], 0);
+}
+
+
+void
+print_number (unsigned long num)
+{
+ format_number (num);
+ printf ("%lu\t%s\n", num, buffer + bufoff);
+}
+
+void
+print_range (unsigned long num, unsigned long to)
+{
+ for (; num <= to; num++)
+ print_number (num);
+}
+
+unsigned long
+xstrtoul (char *arg, char **endp)
+{
+ unsigned long num;
+ char *p;
+
+ errno = 0;
+ num = strtoul (arg, &p, 10);
+ if (errno)
+ {
+ fprintf (stderr, "%s: invalid number: ", progname);
+ perror (arg);
+ exit (2);
+ }
+ if (endp)
+ *endp = p;
+ else if (*p)
+ {
+ fprintf (stderr, "%s: invalid number (near %s)\n",
+ progname, p);
+ exit (2);
+ }
+
+ return num;
+}
+
+int
+main (int argc, char **argv)
+{
+ progname = argv[0];
+
+ if (argc == 1 || strcmp (argv[1], "-h") == 0)
+ {
+ printf ("usage: %s NUM [NUM...]\n", progname);
+ printf ("where NUM is a decimal number, NUM:COUNT or NUM-NUM\n");
+ exit (0);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+ unsigned long num, num2;
+ char *p;
+
+ num = xstrtoul (arg, &p);
+ if (*p == 0)
+ print_number (num);
+ else if (*p == ':')
+ {
+ *p++ = 0;
+ num2 = xstrtoul (p, NULL);
+ if (num2 == 0)
+ {
+ fprintf (stderr, "%s: invalid count\n", progname);
+ exit (2);
+ }
+ print_range (num, num + num2 - 1);
+ }
+ else if (*p == '-')
+ {
+ *p++ = 0;
+ num2 = xstrtoul (p, NULL);
+ if (num2 < num)
+ {
+ fprintf (stderr, "%s: invalid range: %lu-%lu\n",
+ progname, num, num2);
+ exit (2);
+ }
+
+ print_range (num, num2);
+ }
+ else
+ {
+ fprintf (stderr, "%s: invalid argument\n", progname);
+ exit (2);
+ }
+ }
+ exit (0);
+}
diff --git a/tests/package.m4 b/tests/package.m4
new file mode 100644
index 0000000..a871201
--- /dev/null
+++ b/tests/package.m4
@@ -0,0 +1,9 @@
+# Signature of the current package.
+m4_define([AT_PACKAGE_NAME], [gdbm])
+m4_define([AT_PACKAGE_TARNAME], [gdbm])
+m4_define([AT_PACKAGE_VERSION], [1.11])
+m4_define([AT_PACKAGE_VERSION_MAJOR], [1])
+m4_define([AT_PACKAGE_VERSION_MINOR], [11])
+m4_define([AT_PACKAGE_VERSION_PATCH], [0])
+m4_define([AT_PACKAGE_STRING], [gdbm 1.11])
+m4_define([AT_PACKAGE_BUGREPORT], [bug-gdbm@gnu.org])
diff --git a/tests/progname.h b/tests/progname.h
new file mode 100644
index 0000000..47dea1e
--- /dev/null
+++ b/tests/progname.h
@@ -0,0 +1,32 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 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 2, 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/>.
+*/
+
+const char *
+canonical_progname (const char *str)
+{
+ const char *p;
+
+ p = strrchr (str, '/');
+ if (p)
+ p++;
+ else
+ p = str;
+ if (strncmp (p, "lt-", 3) == 0)
+ p += 3;
+ return p;
+}
+
diff --git a/tests/setopt00.at b/tests/setopt00.at
new file mode 100644
index 0000000..6fe3f41
--- /dev/null
+++ b/tests/setopt00.at
@@ -0,0 +1,61 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([setopt])
+AT_KEYWORDS([setopt setopt00])
+
+AT_CHECK([
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db '!MMAP'
+],
+[0],
+[GDBM_GETFLAGS: PASS
+* CACHESIZE:
+initial GDBM_SETCACHESIZE: PASS
+GDBM_GETCACHESIZE: PASS
+second GDBM_SETCACHESIZE: XFAIL
+* SYNCMODE:
+initial GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE: PASS
+GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE true: PASS
+GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE false: PASS
+GDBM_GETSYNCMODE: PASS
+* CENTFREE:
+initial GDBM_GETCENTFREE: PASS
+GDBM_SETCENTFREE: PASS
+GDBM_GETCENTFREE: FAIL
+GDBM_SETCENTFREE true: PASS
+GDBM_GETCENTFREE: FAIL
+GDBM_SETCENTFREE false: PASS
+GDBM_GETCENTFREE: FAIL
+* COALESCEBLKS:
+initial GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS true: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS false: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_GETDBNAME: PASS
+])
+
+AT_CLEANUP
+
+
+
+
diff --git a/tests/setopt01.at b/tests/setopt01.at
new file mode 100644
index 0000000..fbe9c71
--- /dev/null
+++ b/tests/setopt01.at
@@ -0,0 +1,37 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([setopt: mmap options])
+AT_KEYWORDS([setopt setopt01 mmap])
+
+AT_CHECK([
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db 'MMAP' > out
+grep 'MMAP: SKIP' out >/dev/null && AT_SKIP_TEST
+cat out
+],
+[0],
+[* MMAP:
+initial GDBM_GETMMAP: PASS
+GDBM_SETMMAP false: PASS
+GDBM_GETMMAP: PASS
+initial GDBM_GETMAXMAPSIZE: PASS
+GDBM_SETMAXMAPSIZE: PASS
+GDBM_GETMAXMAPSIZE: PASS
+])
+
+AT_CLEANUP
+
diff --git a/tests/testsuite b/tests/testsuite
new file mode 100755
index 0000000..11117ab
--- /dev/null
+++ b/tests/testsuite
@@ -0,0 +1,3002 @@
+#! /bin/sh
+# Generated from testsuite.at by GNU Autoconf 2.69.
+#
+# Copyright (C) 2009-2012 Free Software Foundation, Inc.
+#
+# This test suite is free software; the Free Software Foundation gives
+# unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# How were we run?
+at_cli_args="$@"
+
+
+# Not all shells have the 'times' builtin; the subshell is needed to make
+# sure we discard the 'times: not found' message from the shell.
+at_times_p=false
+(times) >/dev/null 2>&1 && at_times_p=:
+
+# CLI Arguments to pass to the debugging scripts.
+at_debug_args=
+# -e sets to true
+at_errexit_p=false
+# Shall we be verbose? ':' means no, empty means yes.
+at_verbose=:
+at_quiet=
+# Running several jobs in parallel, 0 means as many as test groups.
+at_jobs=1
+at_traceon=:
+at_trace_echo=:
+at_check_filter_trace=:
+
+# Shall we keep the debug scripts? Must be `:' when the suite is
+# run by a debug script, so that the script doesn't remove itself.
+at_debug_p=false
+# Display help message?
+at_help_p=false
+# Display the version message?
+at_version_p=false
+# List test groups?
+at_list_p=false
+# --clean
+at_clean=false
+# Test groups to run
+at_groups=
+# Whether to rerun failed tests.
+at_recheck=
+# Whether a write failure occurred
+at_write_fail=0
+
+# The directory we run the suite in. Default to . if no -C option.
+at_dir=`pwd`
+# An absolute reference to this testsuite script.
+case $as_myself in
+ [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;;
+ * ) at_myself=$at_dir/$as_myself ;;
+esac
+# Whether -C is in effect.
+at_change_dir=false
+
+# Whether to enable colored test results.
+at_color=no
+# List of the tested programs.
+at_tested=''
+# As many question marks as there are digits in the last test group number.
+# Used to normalize the test group numbers so that `ls' lists them in
+# numerical order.
+at_format='??'
+# Description of all the test groups.
+at_help_all="1;version.at:17;gdbm version;;
+2;create00.at:17;create database;gdbm create create00;
+3;fetch00.at:17;fetch a record;gdbm fetch fetch00;
+4;fetch01.at:17;fetch: nonexisting record;gdbm fetch fetch01;
+5;delete00.at:17;delete a record;gdbm delete delete00;
+6;delete01.at:17;delete: non existing record;gdbm delete delete01;
+7;delete02.at:17;delete: all records;gdbm delete delete02;
+8;dbmcreate00.at:17;create database;dbm create create00 dbmcreate00;
+9;dbmcvt.at:17;converting a 1.8-style database;dbm fetch cvt;
+10;dbmfetch00.at:17;fetch a record;dbm fetch fetch00 dbmfetch00;
+11;dbmfetch01.at:17;fetch: nonexisting record;dbm fetch fetch01 dbmfetch01;
+12;dbmfetch02.at:17;fetch from a read-only database;dbm fetch fetch02 dbmfetch02;
+13;dbmfetch03.at:17;fetch from a read-only 1.8-style database;dbm fetch fetch03 dbmfetch03;
+14;dbmdel00.at:17;delete a record;dbm delete delete00 dbmdel00;
+15;dbmdel01.at:17;delete: non existing record;dbm delete delete01 dbmdel01;
+16;dbmdel02.at:17;delete: all records;dbm delete delete02 dbmdel02;
+17;setopt00.at:17;setopt;setopt setopt00;
+18;setopt01.at:17;setopt: mmap options;setopt setopt01 mmap;
+19;cloexec00.at:17;cloexec: gdbm_open;gdbm gdbm_open cloexec cloexec00;
+20;cloexec01.at:17;cloexec: gdbm_reorganize;gdbm gdbm_reorganize cloexec cloexec01;
+21;cloexec02.at:17;cloexec: dbm_open;ndbm dbm_open cloexec cloexec02;
+22;cloexec03.at:17;cloexec: dbm_open -creat;ndbm dbm_open cloexec cloexec03;
+"
+# List of the all the test groups.
+at_groups_all=`$as_echo "$at_help_all" | sed 's/;.*//'`
+
+# at_fn_validate_ranges NAME...
+# -----------------------------
+# Validate and normalize the test group number contained in each variable
+# NAME. Leading zeroes are treated as decimal.
+at_fn_validate_ranges ()
+{
+ for at_grp
+ do
+ eval at_value=\$$at_grp
+ if test $at_value -lt 1 || test $at_value -gt 22; then
+ $as_echo "invalid test group: $at_value" >&2
+ exit 1
+ fi
+ case $at_value in
+ 0*) # We want to treat leading 0 as decimal, like expr and test, but
+ # AS_VAR_ARITH treats it as octal if it uses $(( )).
+ # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the
+ # expr fork, but it is not worth the effort to determine if the
+ # shell supports XSI when the user can just avoid leading 0.
+ eval $at_grp='`expr $at_value + 0`' ;;
+ esac
+ done
+}
+
+at_prev=
+for at_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$at_prev"; then
+ at_option=$at_prev=$at_option
+ at_prev=
+ fi
+
+ case $at_option in
+ *=?*) at_optarg=`expr "X$at_option" : '[^=]*=\(.*\)'` ;;
+ *) at_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $at_option in
+ --help | -h )
+ at_help_p=:
+ ;;
+
+ --list | -l )
+ at_list_p=:
+ ;;
+
+ --version | -V )
+ at_version_p=:
+ ;;
+
+ --clean | -c )
+ at_clean=:
+ ;;
+
+ --color )
+ at_color=always
+ ;;
+ --color=* )
+ case $at_optarg in
+ no | never | none) at_color=never ;;
+ auto | tty | if-tty) at_color=auto ;;
+ always | yes | force) at_color=always ;;
+ *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'`
+ as_fn_error $? "unrecognized argument to $at_optname: $at_optarg" ;;
+ esac
+ ;;
+
+ --debug | -d )
+ at_debug_p=:
+ ;;
+
+ --errexit | -e )
+ at_debug_p=:
+ at_errexit_p=:
+ ;;
+
+ --verbose | -v )
+ at_verbose=; at_quiet=:
+ ;;
+
+ --trace | -x )
+ at_traceon='set -x'
+ at_trace_echo=echo
+ at_check_filter_trace=at_fn_filter_trace
+ ;;
+
+ [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
+ at_fn_validate_ranges at_option
+ as_fn_append at_groups "$at_option$as_nl"
+ ;;
+
+ # Ranges
+ [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
+ at_range_start=`echo $at_option |tr -d X-`
+ at_fn_validate_ranges at_range_start
+ at_range=`$as_echo "$at_groups_all" | \
+ sed -ne '/^'$at_range_start'$/,$p'`
+ as_fn_append at_groups "$at_range$as_nl"
+ ;;
+
+ -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
+ at_range_end=`echo $at_option |tr -d X-`
+ at_fn_validate_ranges at_range_end
+ at_range=`$as_echo "$at_groups_all" | \
+ sed -ne '1,/^'$at_range_end'$/p'`
+ as_fn_append at_groups "$at_range$as_nl"
+ ;;
+
+ [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
+ [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \
+ [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+ [0-9][0-9][0-9]-[0-9][0-9][0-9] | \
+ [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \
+ [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] )
+ at_range_start=`expr $at_option : '\(.*\)-'`
+ at_range_end=`expr $at_option : '.*-\(.*\)'`
+ if test $at_range_start -gt $at_range_end; then
+ at_tmp=$at_range_end
+ at_range_end=$at_range_start
+ at_range_start=$at_tmp
+ fi
+ at_fn_validate_ranges at_range_start at_range_end
+ at_range=`$as_echo "$at_groups_all" | \
+ sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'`
+ as_fn_append at_groups "$at_range$as_nl"
+ ;;
+
+ # Directory selection.
+ --directory | -C )
+ at_prev=--directory
+ ;;
+ --directory=* )
+ at_change_dir=:
+ at_dir=$at_optarg
+ if test x- = "x$at_dir" ; then
+ at_dir=./-
+ fi
+ ;;
+
+ # Parallel execution.
+ --jobs | -j )
+ at_jobs=0
+ ;;
+ --jobs=* | -j[0-9]* )
+ if test -n "$at_optarg"; then
+ at_jobs=$at_optarg
+ else
+ at_jobs=`expr X$at_option : 'X-j\(.*\)'`
+ fi
+ case $at_jobs in *[!0-9]*)
+ at_optname=`echo " $at_option" | sed 's/^ //; s/[0-9=].*//'`
+ as_fn_error $? "non-numeric argument to $at_optname: $at_jobs" ;;
+ esac
+ ;;
+
+ # Keywords.
+ --keywords | -k )
+ at_prev=--keywords
+ ;;
+ --keywords=* )
+ at_groups_selected=$at_help_all
+ at_save_IFS=$IFS
+ IFS=,
+ set X $at_optarg
+ shift
+ IFS=$at_save_IFS
+ for at_keyword
+ do
+ at_invert=
+ case $at_keyword in
+ '!'*)
+ at_invert="-v"
+ at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
+ ;;
+ esac
+ # It is on purpose that we match the test group titles too.
+ at_groups_selected=`$as_echo "$at_groups_selected" |
+ grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"`
+ done
+ # Smash the keywords.
+ at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//'`
+ as_fn_append at_groups "$at_groups_selected$as_nl"
+ ;;
+ --recheck)
+ at_recheck=:
+ ;;
+
+ *=*)
+ at_envvar=`expr "x$at_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $at_envvar in
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$at_envvar'" ;;
+ esac
+ at_value=`$as_echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ # Export now, but save eval for later and for debug scripts.
+ export $at_envvar
+ as_fn_append at_debug_args " $at_envvar='$at_value'"
+ ;;
+
+ *) $as_echo "$as_me: invalid option: $at_option" >&2
+ $as_echo "Try \`$0 --help' for more information." >&2
+ exit 1
+ ;;
+ esac
+done
+
+# Verify our last option didn't require an argument
+if test -n "$at_prev"; then :
+ as_fn_error $? "\`$at_prev' requires an argument"
+fi
+
+# The file containing the suite.
+at_suite_log=$at_dir/$as_me.log
+
+# Selected test groups.
+if test -z "$at_groups$at_recheck"; then
+ at_groups=$at_groups_all
+else
+ if test -n "$at_recheck" && test -r "$at_suite_log"; then
+ at_oldfails=`sed -n '
+ /^Failed tests:$/,/^Skipped tests:$/{
+ s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+ }
+ /^Unexpected passes:$/,/^## Detailed failed tests/{
+ s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+ }
+ /^## Detailed failed tests/q
+ ' "$at_suite_log"`
+ as_fn_append at_groups "$at_oldfails$as_nl"
+ fi
+ # Sort the tests, removing duplicates.
+ at_groups=`$as_echo "$at_groups" | sort -nu | sed '/^$/d'`
+fi
+
+if test x"$at_color" = xalways \
+ || { test x"$at_color" = xauto && test -t 1; }; then
+ at_red=`printf '\033[0;31m'`
+ at_grn=`printf '\033[0;32m'`
+ at_lgn=`printf '\033[1;32m'`
+ at_blu=`printf '\033[1;34m'`
+ at_std=`printf '\033[m'`
+else
+ at_red= at_grn= at_lgn= at_blu= at_std=
+fi
+
+# Help message.
+if $at_help_p; then
+ cat <<_ATEOF || at_write_fail=1
+Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]
+
+Run all the tests, or the selected TESTS, given by numeric ranges, and
+save a detailed log file. Upon failure, create debugging scripts.
+
+Do not change environment variables directly. Instead, set them via
+command line arguments. Set \`AUTOTEST_PATH' to select the executables
+to exercise. Each relative directory is expanded as build and source
+directories relative to the top level of this distribution.
+E.g., from within the build directory /tmp/foo-1.0, invoking this:
+
+ $ $0 AUTOTEST_PATH=bin
+
+is equivalent to the following, assuming the source directory is /src/foo-1.0:
+
+ PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $0
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Operation modes:
+ -h, --help print the help message, then exit
+ -V, --version print version number, then exit
+ -c, --clean remove all the files this test suite might create and exit
+ -l, --list describes all the tests, or the selected TESTS
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Execution tuning:
+ -C, --directory=DIR
+ change to directory DIR before starting
+ --color[=never|auto|always]
+ enable colored test results on terminal, or always
+ -j, --jobs[=N]
+ Allow N jobs at once; infinite jobs with no arg (default 1)
+ -k, --keywords=KEYWORDS
+ select the tests matching all the comma-separated KEYWORDS
+ multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD
+ --recheck select all tests that failed or passed unexpectedly last time
+ -e, --errexit abort as soon as a test fails; implies --debug
+ -v, --verbose force more detailed output
+ default for debugging scripts
+ -d, --debug inhibit clean up and top-level logging
+ default for debugging scripts
+ -x, --trace enable tests shell tracing
+_ATEOF
+cat <<_ATEOF || at_write_fail=1
+
+Report bugs to <bug-gdbm@gnu.org>.
+_ATEOF
+ exit $at_write_fail
+fi
+
+# List of tests.
+if $at_list_p; then
+ cat <<_ATEOF || at_write_fail=1
+gdbm 1.11 test suite test groups:
+
+ NUM: FILE-NAME:LINE TEST-GROUP-NAME
+ KEYWORDS
+
+_ATEOF
+ # Pass an empty line as separator between selected groups and help.
+ $as_echo "$at_groups$as_nl$as_nl$at_help_all" |
+ awk 'NF == 1 && FS != ";" {
+ selected[$ 1] = 1
+ next
+ }
+ /^$/ { FS = ";" }
+ NF > 0 {
+ if (selected[$ 1]) {
+ printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
+ if ($ 4) {
+ lmax = 79
+ indent = " "
+ line = indent
+ len = length (line)
+ n = split ($ 4, a, " ")
+ for (i = 1; i <= n; i++) {
+ l = length (a[i]) + 1
+ if (i > 1 && len + l > lmax) {
+ print line
+ line = indent " " a[i]
+ len = length (line)
+ } else {
+ line = line " " a[i]
+ len += l
+ }
+ }
+ if (n)
+ print line
+ }
+ }
+ }' || at_write_fail=1
+ exit $at_write_fail
+fi
+if $at_version_p; then
+ $as_echo "$as_me (gdbm 1.11)" &&
+ cat <<\_ATEOF || at_write_fail=1
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This test suite is free software; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+_ATEOF
+ exit $at_write_fail
+fi
+
+# Should we print banners? Yes if more than one test is run.
+case $at_groups in #(
+ *$as_nl* )
+ at_print_banners=: ;; #(
+ * ) at_print_banners=false ;;
+esac
+# Text for banner N, set to a single space once printed.
+# Banner 1. testsuite.at:35
+# Category starts at test group 2.
+at_banner_text_1="GDBM interface"
+# Banner 2. testsuite.at:46
+# Category starts at test group 8.
+at_banner_text_2="Compatibility library (dbm/ndbm)"
+# Banner 3. testsuite.at:61
+# Category starts at test group 17.
+at_banner_text_3="DB options"
+# Banner 4. testsuite.at:66
+# Category starts at test group 19.
+at_banner_text_4="Cloexec"
+
+# Take any -C into account.
+if $at_change_dir ; then
+ test x != "x$at_dir" && cd "$at_dir" \
+ || as_fn_error $? "unable to change directory"
+ at_dir=`pwd`
+fi
+
+# Load the config files for any default variable assignments.
+for at_file in atconfig atlocal
+do
+ test -r $at_file || continue
+ . ./$at_file || as_fn_error $? "invalid content: $at_file"
+done
+
+# Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
+: "${at_top_build_prefix=$at_top_builddir}"
+
+# Perform any assignments requested during argument parsing.
+eval "$at_debug_args"
+
+# atconfig delivers names relative to the directory the test suite is
+# in, but the groups themselves are run in testsuite-dir/group-dir.
+if test -n "$at_top_srcdir"; then
+ builddir=../..
+ for at_dir_var in srcdir top_srcdir top_build_prefix
+ do
+ eval at_val=\$at_$at_dir_var
+ case $at_val in
+ [\\/$]* | ?:[\\/]* ) at_prefix= ;;
+ *) at_prefix=../../ ;;
+ esac
+ eval "$at_dir_var=\$at_prefix\$at_val"
+ done
+fi
+
+## -------------------- ##
+## Directory structure. ##
+## -------------------- ##
+
+# This is the set of directories and files used by this script
+# (non-literals are capitalized):
+#
+# TESTSUITE - the testsuite
+# TESTSUITE.log - summarizes the complete testsuite run
+# TESTSUITE.dir/ - created during a run, remains after -d or failed test
+# + at-groups/ - during a run: status of all groups in run
+# | + NNN/ - during a run: meta-data about test group NNN
+# | | + check-line - location (source file and line) of current AT_CHECK
+# | | + status - exit status of current AT_CHECK
+# | | + stdout - stdout of current AT_CHECK
+# | | + stder1 - stderr, including trace
+# | | + stderr - stderr, with trace filtered out
+# | | + test-source - portion of testsuite that defines group
+# | | + times - timestamps for computing duration
+# | | + pass - created if group passed
+# | | + xpass - created if group xpassed
+# | | + fail - created if group failed
+# | | + xfail - created if group xfailed
+# | | + skip - created if group skipped
+# + at-stop - during a run: end the run if this file exists
+# + at-source-lines - during a run: cache of TESTSUITE line numbers for extraction
+# + 0..NNN/ - created for each group NNN, remains after -d or failed test
+# | + TESTSUITE.log - summarizes the group results
+# | + ... - files created during the group
+
+# The directory the whole suite works in.
+# Should be absolute to let the user `cd' at will.
+at_suite_dir=$at_dir/$as_me.dir
+# The file containing the suite ($at_dir might have changed since earlier).
+at_suite_log=$at_dir/$as_me.log
+# The directory containing helper files per test group.
+at_helper_dir=$at_suite_dir/at-groups
+# Stop file: if it exists, do not start new jobs.
+at_stop_file=$at_suite_dir/at-stop
+# The fifo used for the job dispatcher.
+at_job_fifo=$at_suite_dir/at-job-fifo
+
+if $at_clean; then
+ test -d "$at_suite_dir" &&
+ find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+ rm -f -r "$at_suite_dir" "$at_suite_log"
+ exit $?
+fi
+
+# Don't take risks: use only absolute directories in PATH.
+#
+# For stand-alone test suites (ie. atconfig was not found),
+# AUTOTEST_PATH is relative to `.'.
+#
+# For embedded test suites, AUTOTEST_PATH is relative to the top level
+# of the package. Then expand it into build/src parts, since users
+# may create executables in both places.
+AUTOTEST_PATH=`$as_echo "$AUTOTEST_PATH" | sed "s|:|$PATH_SEPARATOR|g"`
+at_path=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $AUTOTEST_PATH $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -n "$at_path" && as_fn_append at_path $PATH_SEPARATOR
+case $as_dir in
+ [\\/]* | ?:[\\/]* )
+ as_fn_append at_path "$as_dir"
+ ;;
+ * )
+ if test -z "$at_top_build_prefix"; then
+ # Stand-alone test suite.
+ as_fn_append at_path "$as_dir"
+ else
+ # Embedded test suite.
+ as_fn_append at_path "$at_top_build_prefix$as_dir$PATH_SEPARATOR"
+ as_fn_append at_path "$at_top_srcdir/$as_dir"
+ fi
+ ;;
+esac
+ done
+IFS=$as_save_IFS
+
+
+# Now build and simplify PATH.
+#
+# There might be directories that don't exist, but don't redirect
+# builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
+at_new_path=
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $at_path
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -d "$as_dir" || continue
+case $as_dir in
+ [\\/]* | ?:[\\/]* ) ;;
+ * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;;
+esac
+case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in
+ *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;;
+ $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;;
+ *) as_fn_append at_new_path "$PATH_SEPARATOR$as_dir" ;;
+esac
+ done
+IFS=$as_save_IFS
+
+PATH=$at_new_path
+export PATH
+
+# Setting up the FDs.
+
+
+
+# 5 is the log file. Not to be overwritten if `-d'.
+if $at_debug_p; then
+ at_suite_log=/dev/null
+else
+ : >"$at_suite_log"
+fi
+exec 5>>"$at_suite_log"
+
+# Banners and logs.
+$as_echo "## --------------------- ##
+## gdbm 1.11 test suite. ##
+## --------------------- ##"
+{
+ $as_echo "## --------------------- ##
+## gdbm 1.11 test suite. ##
+## --------------------- ##"
+ echo
+
+ $as_echo "$as_me: command line was:"
+ $as_echo " \$ $0 $at_cli_args"
+ echo
+
+ # If ChangeLog exists, list a few lines in case it might help determining
+ # the exact version.
+ if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then
+ $as_echo "## ---------- ##
+## ChangeLog. ##
+## ---------- ##"
+ echo
+ sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog"
+ echo
+ fi
+
+ {
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+}
+ echo
+
+ # Contents of the config files.
+ for at_file in atconfig atlocal
+ do
+ test -r $at_file || continue
+ $as_echo "$as_me: $at_file:"
+ sed 's/^/| /' $at_file
+ echo
+ done
+} >&5
+
+
+## ------------------------- ##
+## Autotest shell functions. ##
+## ------------------------- ##
+
+# at_fn_banner NUMBER
+# -------------------
+# Output banner NUMBER, provided the testsuite is running multiple groups and
+# this particular banner has not yet been printed.
+at_fn_banner ()
+{
+ $at_print_banners || return 0
+ eval at_banner_text=\$at_banner_text_$1
+ test "x$at_banner_text" = "x " && return 0
+ eval "at_banner_text_$1=\" \""
+ if test -z "$at_banner_text"; then
+ $at_first || echo
+ else
+ $as_echo "$as_nl$at_banner_text$as_nl"
+ fi
+} # at_fn_banner
+
+# at_fn_check_prepare_notrace REASON LINE
+# ---------------------------------------
+# Perform AT_CHECK preparations for the command at LINE for an untraceable
+# command; REASON is the reason for disabling tracing.
+at_fn_check_prepare_notrace ()
+{
+ $at_trace_echo "Not enabling shell tracing (command contains $1)"
+ $as_echo "$2" >"$at_check_line_file"
+ at_check_trace=: at_check_filter=:
+ : >"$at_stdout"; : >"$at_stderr"
+}
+
+# at_fn_check_prepare_trace LINE
+# ------------------------------
+# Perform AT_CHECK preparations for the command at LINE for a traceable
+# command.
+at_fn_check_prepare_trace ()
+{
+ $as_echo "$1" >"$at_check_line_file"
+ at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace
+ : >"$at_stdout"; : >"$at_stderr"
+}
+
+# at_fn_check_prepare_dynamic COMMAND LINE
+# ----------------------------------------
+# Decide if COMMAND at LINE is traceable at runtime, and call the appropriate
+# preparation function.
+at_fn_check_prepare_dynamic ()
+{
+ case $1 in
+ *$as_nl*)
+ at_fn_check_prepare_notrace 'an embedded newline' "$2" ;;
+ *)
+ at_fn_check_prepare_trace "$2" ;;
+ esac
+}
+
+# at_fn_filter_trace
+# ------------------
+# Remove the lines in the file "$at_stderr" generated by "set -x" and print
+# them to stderr.
+at_fn_filter_trace ()
+{
+ mv "$at_stderr" "$at_stder1"
+ grep '^ *+' "$at_stder1" >&2
+ grep -v '^ *+' "$at_stder1" >"$at_stderr"
+}
+
+# at_fn_log_failure FILE-LIST
+# ---------------------------
+# Copy the files in the list on stdout with a "> " prefix, and exit the shell
+# with a failure exit code.
+at_fn_log_failure ()
+{
+ for file
+ do $as_echo "$file:"; sed 's/^/> /' "$file"; done
+ echo 1 > "$at_status_file"
+ exit 1
+}
+
+# at_fn_check_skip EXIT-CODE LINE
+# -------------------------------
+# Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit
+# the test group subshell with that same exit code. Use LINE in any report
+# about test failure.
+at_fn_check_skip ()
+{
+ case $1 in
+ 99) echo 99 > "$at_status_file"; at_failed=:
+ $as_echo "$2: hard failure"; exit 99;;
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ esac
+}
+
+# at_fn_check_status EXPECTED EXIT-CODE LINE
+# ------------------------------------------
+# Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing.
+# Otherwise, if it is 77 or 99, exit the test group subshell with that same
+# exit code; if it is anything else print an error message referring to LINE,
+# and fail the test.
+at_fn_check_status ()
+{
+ case $2 in
+ $1 ) ;;
+ 77) echo 77 > "$at_status_file"; exit 77;;
+ 99) echo 99 > "$at_status_file"; at_failed=:
+ $as_echo "$3: hard failure"; exit 99;;
+ *) $as_echo "$3: exit code was $2, expected $1"
+ at_failed=:;;
+ esac
+}
+
+# at_fn_diff_devnull FILE
+# -----------------------
+# Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless diff
+# invocations.
+at_fn_diff_devnull ()
+{
+ test -s "$1" || return 0
+ $at_diff "$at_devnull" "$1"
+}
+
+# at_fn_test NUMBER
+# -----------------
+# Parse out test NUMBER from the tail of this file.
+at_fn_test ()
+{
+ eval at_sed=\$at_sed$1
+ sed "$at_sed" "$at_myself" > "$at_test_source"
+}
+
+# at_fn_create_debugging_script
+# -----------------------------
+# Create the debugging script $at_group_dir/run which will reproduce the
+# current test group.
+at_fn_create_debugging_script ()
+{
+ {
+ echo "#! /bin/sh" &&
+ echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\''' &&
+ $as_echo "cd '$at_dir'" &&
+ $as_echo "exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d $at_debug_args $at_group \${1+\"\$@\"}" &&
+ echo 'exit 1'
+ } >"$at_group_dir/run" &&
+ chmod +x "$at_group_dir/run"
+}
+
+## -------------------------------- ##
+## End of autotest shell functions. ##
+## -------------------------------- ##
+{
+ $as_echo "## ---------------- ##
+## Tested programs. ##
+## ---------------- ##"
+ echo
+} >&5
+
+# Report what programs are being tested.
+for at_program in : $at_tested
+do
+ test "$at_program" = : && continue
+ case $at_program in
+ [\\/]* | ?:[\\/]* ) $at_program_=$at_program ;;
+ * )
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -f "$as_dir/$at_program" && break
+ done
+IFS=$as_save_IFS
+
+ at_program_=$as_dir/$at_program ;;
+ esac
+ if test -f "$at_program_"; then
+ {
+ $as_echo "$at_srcdir/testsuite.at:32: $at_program_ --version"
+ "$at_program_" --version </dev/null
+ echo
+ } >&5 2>&1
+ else
+ as_fn_error $? "cannot find $at_program" "$LINENO" 5
+ fi
+done
+
+{
+ $as_echo "## ------------------ ##
+## Running the tests. ##
+## ------------------ ##"
+} >&5
+
+at_start_date=`date`
+at_start_time=`date +%s 2>/dev/null`
+$as_echo "$as_me: starting at: $at_start_date" >&5
+
+# Create the master directory if it doesn't already exist.
+as_dir="$at_suite_dir"; as_fn_mkdir_p ||
+ as_fn_error $? "cannot create \`$at_suite_dir'" "$LINENO" 5
+
+# Can we diff with `/dev/null'? DU 5.0 refuses.
+if diff /dev/null /dev/null >/dev/null 2>&1; then
+ at_devnull=/dev/null
+else
+ at_devnull=$at_suite_dir/devnull
+ >"$at_devnull"
+fi
+
+# Use `diff -u' when possible.
+if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
+then
+ at_diff='diff -u'
+else
+ at_diff=diff
+fi
+
+# Get the last needed group.
+for at_group in : $at_groups; do :; done
+
+# Extract the start and end lines of each test group at the tail
+# of this file
+awk '
+BEGIN { FS="" }
+/^#AT_START_/ {
+ start = NR
+}
+/^#AT_STOP_/ {
+ test = substr ($ 0, 10)
+ print "at_sed" test "=\"1," start "d;" (NR-1) "q\""
+ if (test == "'"$at_group"'") exit
+}' "$at_myself" > "$at_suite_dir/at-source-lines" &&
+. "$at_suite_dir/at-source-lines" ||
+ as_fn_error $? "cannot create test line number cache" "$LINENO" 5
+rm -f "$at_suite_dir/at-source-lines"
+
+# Set number of jobs for `-j'; avoid more jobs than test groups.
+set X $at_groups; shift; at_max_jobs=$#
+if test $at_max_jobs -eq 0; then
+ at_jobs=1
+fi
+if test $at_jobs -ne 1 &&
+ { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then
+ at_jobs=$at_max_jobs
+fi
+
+# If parallel mode, don't output banners, don't split summary lines.
+if test $at_jobs -ne 1; then
+ at_print_banners=false
+ at_quiet=:
+fi
+
+# Set up helper dirs.
+rm -rf "$at_helper_dir" &&
+mkdir "$at_helper_dir" &&
+cd "$at_helper_dir" &&
+{ test -z "$at_groups" || mkdir $at_groups; } ||
+as_fn_error $? "testsuite directory setup failed" "$LINENO" 5
+
+# Functions for running a test group. We leave the actual
+# test group execution outside of a shell function in order
+# to avoid hitting zsh 4.x exit status bugs.
+
+# at_fn_group_prepare
+# -------------------
+# Prepare for running a test group.
+at_fn_group_prepare ()
+{
+ # The directory for additional per-group helper files.
+ at_job_dir=$at_helper_dir/$at_group
+ # The file containing the location of the last AT_CHECK.
+ at_check_line_file=$at_job_dir/check-line
+ # The file containing the exit status of the last command.
+ at_status_file=$at_job_dir/status
+ # The files containing the output of the tested commands.
+ at_stdout=$at_job_dir/stdout
+ at_stder1=$at_job_dir/stder1
+ at_stderr=$at_job_dir/stderr
+ # The file containing the code for a test group.
+ at_test_source=$at_job_dir/test-source
+ # The file containing dates.
+ at_times_file=$at_job_dir/times
+
+ # Be sure to come back to the top test directory.
+ cd "$at_suite_dir"
+
+ # Clearly separate the test groups when verbose.
+ $at_first || $at_verbose echo
+
+ at_group_normalized=$at_group
+
+ eval 'while :; do
+ case $at_group_normalized in #(
+ '"$at_format"'*) break;;
+ esac
+ at_group_normalized=0$at_group_normalized
+ done'
+
+
+ # Create a fresh directory for the next test group, and enter.
+ # If one already exists, the user may have invoked ./run from
+ # within that directory; we remove the contents, but not the
+ # directory itself, so that we aren't pulling the rug out from
+ # under the shell's notion of the current directory.
+ at_group_dir=$at_suite_dir/$at_group_normalized
+ at_group_log=$at_group_dir/$as_me.log
+ if test -d "$at_group_dir"; then
+ find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx {} \;
+ rm -fr "$at_group_dir"/* "$at_group_dir"/.[!.] "$at_group_dir"/.??*
+fi ||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: test directory for $at_group_normalized could not be cleaned" >&5
+$as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned" >&2;}
+ # Be tolerant if the above `rm' was not able to remove the directory.
+ as_dir="$at_group_dir"; as_fn_mkdir_p
+
+ echo 0 > "$at_status_file"
+
+ # In verbose mode, append to the log file *and* show on
+ # the standard output; in quiet mode only write to the log.
+ if test -z "$at_verbose"; then
+ at_tee_pipe='tee -a "$at_group_log"'
+ else
+ at_tee_pipe='cat >> "$at_group_log"'
+ fi
+}
+
+# at_fn_group_banner ORDINAL LINE DESC PAD [BANNER]
+# -------------------------------------------------
+# Declare the test group ORDINAL, located at LINE with group description DESC,
+# and residing under BANNER. Use PAD to align the status column.
+at_fn_group_banner ()
+{
+ at_setup_line="$2"
+ test -n "$5" && at_fn_banner $5
+ at_desc="$3"
+ case $1 in
+ [0-9]) at_desc_line=" $1: ";;
+ [0-9][0-9]) at_desc_line=" $1: " ;;
+ *) at_desc_line="$1: " ;;
+ esac
+ as_fn_append at_desc_line "$3$4"
+ $at_quiet $as_echo_n "$at_desc_line"
+ echo "# -*- compilation -*-" >> "$at_group_log"
+}
+
+# at_fn_group_postprocess
+# -----------------------
+# Perform cleanup after running a test group.
+at_fn_group_postprocess ()
+{
+ # Be sure to come back to the suite directory, in particular
+ # since below we might `rm' the group directory we are in currently.
+ cd "$at_suite_dir"
+
+ if test ! -f "$at_check_line_file"; then
+ sed "s/^ */$as_me: WARNING: /" <<_ATEOF
+ A failure happened in a test group before any test could be
+ run. This means that test suite is improperly designed. Please
+ report this failure to <bug-gdbm@gnu.org>.
+_ATEOF
+ $as_echo "$at_setup_line" >"$at_check_line_file"
+ at_status=99
+ fi
+ $at_verbose $as_echo_n "$at_group. $at_setup_line: "
+ $as_echo_n "$at_group. $at_setup_line: " >> "$at_group_log"
+ case $at_xfail:$at_status in
+ yes:0)
+ at_msg="UNEXPECTED PASS"
+ at_res=xpass
+ at_errexit=$at_errexit_p
+ at_color=$at_red
+ ;;
+ no:0)
+ at_msg="ok"
+ at_res=pass
+ at_errexit=false
+ at_color=$at_grn
+ ;;
+ *:77)
+ at_msg='skipped ('`cat "$at_check_line_file"`')'
+ at_res=skip
+ at_errexit=false
+ at_color=$at_blu
+ ;;
+ no:* | *:99)
+ at_msg='FAILED ('`cat "$at_check_line_file"`')'
+ at_res=fail
+ at_errexit=$at_errexit_p
+ at_color=$at_red
+ ;;
+ yes:*)
+ at_msg='expected failure ('`cat "$at_check_line_file"`')'
+ at_res=xfail
+ at_errexit=false
+ at_color=$at_lgn
+ ;;
+ esac
+ echo "$at_res" > "$at_job_dir/$at_res"
+ # In parallel mode, output the summary line only afterwards.
+ if test $at_jobs -ne 1 && test -n "$at_verbose"; then
+ $as_echo "$at_desc_line $at_color$at_msg$at_std"
+ else
+ # Make sure there is a separator even with long titles.
+ $as_echo " $at_color$at_msg$at_std"
+ fi
+ at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
+ case $at_status in
+ 0|77)
+ # $at_times_file is only available if the group succeeded.
+ # We're not including the group log, so the success message
+ # is written in the global log separately. But we also
+ # write to the group log in case they're using -d.
+ if test -f "$at_times_file"; then
+ at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')'
+ rm -f "$at_times_file"
+ fi
+ $as_echo "$at_log_msg" >> "$at_group_log"
+ $as_echo "$at_log_msg" >&5
+
+ # Cleanup the group directory, unless the user wants the files
+ # or the success was unexpected.
+ if $at_debug_p || test $at_res = xpass; then
+ at_fn_create_debugging_script
+ if test $at_res = xpass && $at_errexit; then
+ echo stop > "$at_stop_file"
+ fi
+ else
+ if test -d "$at_group_dir"; then
+ find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
+ rm -fr "$at_group_dir"
+ fi
+ rm -f "$at_test_source"
+ fi
+ ;;
+ *)
+ # Upon failure, include the log into the testsuite's global
+ # log. The failure message is written in the group log. It
+ # is later included in the global log.
+ $as_echo "$at_log_msg" >> "$at_group_log"
+
+ # Upon failure, keep the group directory for autopsy, and create
+ # the debugging script. With -e, do not start any further tests.
+ at_fn_create_debugging_script
+ if $at_errexit; then
+ echo stop > "$at_stop_file"
+ fi
+ ;;
+ esac
+}
+
+
+## ------------ ##
+## Driver loop. ##
+## ------------ ##
+
+
+if (set -m && set +m && set +b) >/dev/null 2>&1; then
+ set +b
+ at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=-
+else
+ at_job_control_on=: at_job_control_off=: at_job_group=
+fi
+
+for at_signal in 1 2 15; do
+ trap 'set +x; set +e
+ $at_job_control_off
+ at_signal='"$at_signal"'
+ echo stop > "$at_stop_file"
+ trap "" $at_signal
+ at_pgids=
+ for at_pgid in `jobs -p 2>/dev/null`; do
+ at_pgids="$at_pgids $at_job_group$at_pgid"
+ done
+ test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null
+ wait
+ if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then
+ echo >&2
+ fi
+ at_signame=`kill -l $at_signal 2>&1 || echo $at_signal`
+ set x $at_signame
+ test 0 -gt 2 && at_signame=$at_signal
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: caught signal $at_signame, bailing out" >&5
+$as_echo "$as_me: WARNING: caught signal $at_signame, bailing out" >&2;}
+ as_fn_arith 128 + $at_signal && exit_status=$as_val
+ as_fn_exit $exit_status' $at_signal
+done
+
+rm -f "$at_stop_file"
+at_first=:
+
+if test $at_jobs -ne 1 &&
+ rm -f "$at_job_fifo" &&
+ test -n "$at_job_group" &&
+ ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null
+then
+ # FIFO job dispatcher.
+
+ trap 'at_pids=
+ for at_pid in `jobs -p`; do
+ at_pids="$at_pids $at_job_group$at_pid"
+ done
+ if test -n "$at_pids"; then
+ at_sig=TSTP
+ test "${TMOUT+set}" = set && at_sig=STOP
+ kill -$at_sig $at_pids 2>/dev/null
+ fi
+ kill -STOP $$
+ test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP
+
+ echo
+ # Turn jobs into a list of numbers, starting from 1.
+ at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p`
+
+ set X $at_joblist
+ shift
+ for at_group in $at_groups; do
+ $at_job_control_on 2>/dev/null
+ (
+ # Start one test group.
+ $at_job_control_off
+ if $at_first; then
+ exec 7>"$at_job_fifo"
+ else
+ exec 6<&-
+ fi
+ trap 'set +x; set +e
+ trap "" PIPE
+ echo stop > "$at_stop_file"
+ echo >&7
+ as_fn_exit 141' PIPE
+ at_fn_group_prepare
+ if cd "$at_group_dir" &&
+ at_fn_test $at_group &&
+ . "$at_test_source"
+ then :; else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
+$as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
+ at_failed=:
+ fi
+ at_fn_group_postprocess
+ echo >&7
+ ) &
+ $at_job_control_off
+ if $at_first; then
+ at_first=false
+ exec 6<"$at_job_fifo" 7>"$at_job_fifo"
+ fi
+ shift # Consume one token.
+ if test $# -gt 0; then :; else
+ read at_token <&6 || break
+ set x $*
+ fi
+ test -f "$at_stop_file" && break
+ done
+ exec 7>&-
+ # Read back the remaining ($at_jobs - 1) tokens.
+ set X $at_joblist
+ shift
+ if test $# -gt 0; then
+ shift
+ for at_job
+ do
+ read at_token
+ done <&6
+ fi
+ exec 6<&-
+ wait
+else
+ # Run serially, avoid forks and other potential surprises.
+ for at_group in $at_groups; do
+ at_fn_group_prepare
+ if cd "$at_group_dir" &&
+ at_fn_test $at_group &&
+ . "$at_test_source"; then :; else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
+$as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
+ at_failed=:
+ fi
+ at_fn_group_postprocess
+ test -f "$at_stop_file" && break
+ at_first=false
+ done
+fi
+
+# Wrap up the test suite with summary statistics.
+cd "$at_helper_dir"
+
+# Use ?..???? when the list must remain sorted, the faster * otherwise.
+at_pass_list=`for f in */pass; do echo $f; done | sed '/\*/d; s,/pass,,'`
+at_skip_list=`for f in */skip; do echo $f; done | sed '/\*/d; s,/skip,,'`
+at_xfail_list=`for f in */xfail; do echo $f; done | sed '/\*/d; s,/xfail,,'`
+at_xpass_list=`for f in ?/xpass ??/xpass ???/xpass ????/xpass; do
+ echo $f; done | sed '/?/d; s,/xpass,,'`
+at_fail_list=`for f in ?/fail ??/fail ???/fail ????/fail; do
+ echo $f; done | sed '/?/d; s,/fail,,'`
+
+set X $at_pass_list $at_xpass_list $at_xfail_list $at_fail_list $at_skip_list
+shift; at_group_count=$#
+set X $at_xpass_list; shift; at_xpass_count=$#; at_xpass_list=$*
+set X $at_xfail_list; shift; at_xfail_count=$#
+set X $at_fail_list; shift; at_fail_count=$#; at_fail_list=$*
+set X $at_skip_list; shift; at_skip_count=$#
+
+as_fn_arith $at_group_count - $at_skip_count && at_run_count=$as_val
+as_fn_arith $at_xpass_count + $at_fail_count && at_unexpected_count=$as_val
+as_fn_arith $at_xfail_count + $at_fail_count && at_total_fail_count=$as_val
+
+# Back to the top directory.
+cd "$at_dir"
+rm -rf "$at_helper_dir"
+
+# Compute the duration of the suite.
+at_stop_date=`date`
+at_stop_time=`date +%s 2>/dev/null`
+$as_echo "$as_me: ending at: $at_stop_date" >&5
+case $at_start_time,$at_stop_time in
+ [0-9]*,[0-9]*)
+ as_fn_arith $at_stop_time - $at_start_time && at_duration_s=$as_val
+ as_fn_arith $at_duration_s / 60 && at_duration_m=$as_val
+ as_fn_arith $at_duration_m / 60 && at_duration_h=$as_val
+ as_fn_arith $at_duration_s % 60 && at_duration_s=$as_val
+ as_fn_arith $at_duration_m % 60 && at_duration_m=$as_val
+ at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
+ $as_echo "$as_me: test suite duration: $at_duration" >&5
+ ;;
+esac
+
+echo
+$as_echo "## ------------- ##
+## Test results. ##
+## ------------- ##"
+echo
+{
+ echo
+ $as_echo "## ------------- ##
+## Test results. ##
+## ------------- ##"
+ echo
+} >&5
+
+if test $at_run_count = 1; then
+ at_result="1 test"
+ at_were=was
+else
+ at_result="$at_run_count tests"
+ at_were=were
+fi
+if $at_errexit_p && test $at_unexpected_count != 0; then
+ if test $at_xpass_count = 1; then
+ at_result="$at_result $at_were run, one passed"
+ else
+ at_result="$at_result $at_were run, one failed"
+ fi
+ at_result="$at_result unexpectedly and inhibited subsequent tests."
+ at_color=$at_red
+else
+ # Don't you just love exponential explosion of the number of cases?
+ at_color=$at_red
+ case $at_xpass_count:$at_fail_count:$at_xfail_count in
+ # So far, so good.
+ 0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;;
+ 0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;;
+
+ # Some unexpected failures
+ 0:*:0) at_result="$at_result $at_were run,
+$at_fail_count failed unexpectedly." ;;
+
+ # Some failures, both expected and unexpected
+ 0:*:1) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+ 0:*:*) at_result="$at_result $at_were run,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+
+ # No unexpected failures, but some xpasses
+ *:0:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly." ;;
+
+ # No expected failures, but failures and xpasses
+ *:1:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
+ *:*:0) at_result="$at_result $at_were run,
+$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
+
+ # All of them.
+ *:*:1) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failure)." ;;
+ *:*:*) at_result="$at_result $at_were run,
+$at_xpass_count passed unexpectedly,
+$at_total_fail_count failed ($at_xfail_count expected failures)." ;;
+ esac
+
+ if test $at_skip_count = 0 && test $at_run_count -gt 1; then
+ at_result="All $at_result"
+ fi
+fi
+
+# Now put skips in the mix.
+case $at_skip_count in
+ 0) ;;
+ 1) at_result="$at_result
+1 test was skipped." ;;
+ *) at_result="$at_result
+$at_skip_count tests were skipped." ;;
+esac
+
+if test $at_unexpected_count = 0; then
+ echo "$at_color$at_result$at_std"
+ echo "$at_result" >&5
+else
+ echo "${at_color}ERROR: $at_result$at_std" >&2
+ echo "ERROR: $at_result" >&5
+ {
+ echo
+ $as_echo "## ------------------------ ##
+## Summary of the failures. ##
+## ------------------------ ##"
+
+ # Summary of failed and skipped tests.
+ if test $at_fail_count != 0; then
+ echo "Failed tests:"
+ $SHELL "$at_myself" $at_fail_list --list
+ echo
+ fi
+ if test $at_skip_count != 0; then
+ echo "Skipped tests:"
+ $SHELL "$at_myself" $at_skip_list --list
+ echo
+ fi
+ if test $at_xpass_count != 0; then
+ echo "Unexpected passes:"
+ $SHELL "$at_myself" $at_xpass_list --list
+ echo
+ fi
+ if test $at_fail_count != 0; then
+ $as_echo "## ---------------------- ##
+## Detailed failed tests. ##
+## ---------------------- ##"
+ echo
+ for at_group in $at_fail_list
+ do
+ at_group_normalized=$at_group
+
+ eval 'while :; do
+ case $at_group_normalized in #(
+ '"$at_format"'*) break;;
+ esac
+ at_group_normalized=0$at_group_normalized
+ done'
+
+ cat "$at_suite_dir/$at_group_normalized/$as_me.log"
+ echo
+ done
+ echo
+ fi
+ if test -n "$at_top_srcdir"; then
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## ${at_top_build_prefix}config.log ##
+_ASBOX
+ sed 's/^/| /' ${at_top_build_prefix}config.log
+ echo
+ fi
+ } >&5
+
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## $as_me.log was created. ##
+_ASBOX
+
+ echo
+ if $at_debug_p; then
+ at_msg='per-test log files'
+ else
+ at_msg="\`${at_testdir+${at_testdir}/}$as_me.log'"
+ fi
+ $as_echo "Please send $at_msg and all information you think might help:
+
+ To: <bug-gdbm@gnu.org>
+ Subject: [gdbm 1.11] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly}
+
+You may investigate any problem if you feel able to do so, in which
+case the test suite provides a good starting point. Its output may
+be found below \`${at_testdir+${at_testdir}/}$as_me.dir'.
+"
+ exit 1
+fi
+
+exit 0
+
+## ------------- ##
+## Actual tests. ##
+## ------------- ##
+#AT_START_1
+at_fn_group_banner 1 'version.at:17' \
+ "gdbm version" " "
+at_xfail=no
+(
+ $as_echo "1. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+{ set +x
+$as_echo "$at_srcdir/version.at:19: gtver -lib -full -header -full"
+at_fn_check_prepare_trace "version.at:19"
+( $at_check_trace; gtver -lib -full -header -full
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1.11.0
+1.11.0
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/version.at:19"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_1
+#AT_START_2
+at_fn_group_banner 2 'create00.at:17' \
+ "create database" " " 1
+at_xfail=no
+(
+ $as_echo "2. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/create00.at:20:
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:1000 > input
+gtload test.db < input
+gtdump test.db | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "create00.at:20"
+( $at_check_trace;
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:1000 > input
+gtload test.db < input
+gtdump test.db | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/create00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_2
+#AT_START_3
+at_fn_group_banner 3 'fetch00.at:17' \
+ "fetch a record" " " 1
+at_xfail=no
+(
+ $as_echo "3. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/fetch00.at:20:
+num2word 1:10000 | gtload test.db
+gtfetch test.db 1 2745 9999
+"
+at_fn_check_prepare_notrace 'an embedded newline' "fetch00.at:20"
+( $at_check_trace;
+num2word 1:10000 | gtload test.db
+gtfetch test.db 1 2745 9999
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "one
+two thousand seven hundred and fourty-five
+nine thousand nine hundred and ninety-nine
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/fetch00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_3
+#AT_START_4
+at_fn_group_banner 4 'fetch01.at:17' \
+ "fetch: nonexisting record" " " 1
+at_xfail=no
+(
+ $as_echo "4. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/fetch01.at:20:
+num2word 1:10000 | gtload test.db
+gtfetch test.db 0
+"
+at_fn_check_prepare_notrace 'an embedded newline' "fetch01.at:20"
+( $at_check_trace;
+num2word 1:10000 | gtload test.db
+gtfetch test.db 0
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "gtfetch: 0: not found
+" | \
+ $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/fetch01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_4
+#AT_START_5
+at_fn_group_banner 5 'delete00.at:17' \
+ "delete a record" " " 1
+at_xfail=no
+(
+ $as_echo "5. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/delete00.at:20:
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:10 | gtload test.db
+gtdel test.db 8
+gtdump test.db | sort -k1,2 -n
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "delete00.at:20"
+( $at_check_trace;
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:10 | gtload test.db
+gtdel test.db 8
+gtdump test.db | sort -k1,2 -n
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1 one
+2 two
+3 three
+4 four
+5 five
+6 six
+7 seven
+9 nine
+10 ten
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/delete00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_5
+#AT_START_6
+at_fn_group_banner 6 'delete01.at:17' \
+ "delete: non existing record" " " 1
+at_xfail=no
+(
+ $as_echo "6. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/delete01.at:20:
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:10 | gtload test.db
+gtdel test.db 11
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "delete01.at:20"
+( $at_check_trace;
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:10 | gtload test.db
+gtdel test.db 11
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "gtdel: cannot delete 11: Item not found
+" | \
+ $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/delete01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_6
+#AT_START_7
+at_fn_group_banner 7 'delete02.at:17' \
+ "delete: all records" " " 1
+at_xfail=no
+(
+ $as_echo "7. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/delete02.at:20:
+num2word 1:10 | gtload test.db
+gtdel test.db 1 2 3 4 5 6 7 8 9 10
+gtdump test.db
+"
+at_fn_check_prepare_notrace 'an embedded newline' "delete02.at:20"
+( $at_check_trace;
+num2word 1:10 | gtload test.db
+gtdel test.db 1 2 3 4 5 6 7 8 9 10
+gtdump test.db
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/delete02.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_7
+#AT_START_8
+at_fn_group_banner 8 'dbmcreate00.at:17' \
+ "create database" " " 2
+at_xfail=no
+(
+ $as_echo "8. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmcreate00.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:1000 > input
+dtload test < input
+dtdump test | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmcreate00.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:1000 > input
+dtload test < input
+dtdump test | sort -k1,2 -n > output
+cmp -s input output || diff -u input output
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmcreate00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_8
+#AT_START_9
+at_fn_group_banner 9 'dbmcvt.at:17' \
+ "converting a 1.8-style database" " " 2
+at_xfail=no
+(
+ $as_echo "9. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmcvt.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+dtfetch test 6
+cmp test.pag test.dir >/dev/null 2>&1 && exit 1
+exit 0
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmcvt.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+dtfetch test 6
+cmp test.pag test.dir >/dev/null 2>&1 && exit 1
+exit 0
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "six
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmcvt.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_9
+#AT_START_10
+at_fn_group_banner 10 'dbmfetch00.at:17' \
+ "fetch a record" " " 2
+at_xfail=no
+(
+ $as_echo "10. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmfetch00.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10000 | dtload test
+dtfetch test 1 2745 9999
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch00.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10000 | dtload test
+dtfetch test 1 2745 9999
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "one
+two thousand seven hundred and fourty-five
+nine thousand nine hundred and ninety-nine
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_10
+#AT_START_11
+at_fn_group_banner 11 'dbmfetch01.at:17' \
+ "fetch: nonexisting record" " " 2
+at_xfail=no
+(
+ $as_echo "11. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmfetch01.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10000 | dtload test
+dtfetch test 0
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch01.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10000 | dtload test
+dtfetch test 0
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "dtfetch: 0: not found
+" | \
+ $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/dbmfetch01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_11
+#AT_START_12
+at_fn_group_banner 12 'dbmfetch02.at:17' \
+ "fetch from a read-only database" " " 2
+at_xfail=no
+(
+ $as_echo "12. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmfetch02.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+chmod -w test.dir test.pag
+dtfetch test 6 10
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch02.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+chmod -w test.dir test.pag
+dtfetch test 6 10
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "six
+ten
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch02.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_12
+#AT_START_13
+at_fn_group_banner 13 'dbmfetch03.at:17' \
+ "fetch from a read-only 1.8-style database" " " 2
+at_xfail=no
+(
+ $as_echo "13. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmfetch03.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+mkdir dir
+cd dir
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+chmod -w test.dir test.pag .
+dtfetch test 6 10
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch03.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+mkdir dir
+cd dir
+num2word 1:10 | dtload test
+rm test.dir
+ln test.pag test.dir
+chmod -w test.dir test.pag .
+dtfetch test 6 10
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "six
+ten
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch03.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_13
+#AT_START_14
+at_fn_group_banner 14 'dbmdel00.at:17' \
+ "delete a record" " " 2
+at_xfail=no
+(
+ $as_echo "14. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmdel00.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 8
+dtdump test | sort -k1,2 -n
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmdel00.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 8
+dtdump test | sort -k1,2 -n
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1 one
+2 two
+3 three
+4 four
+5 five
+6 six
+7 seven
+9 nine
+10 ten
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmdel00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_14
+#AT_START_15
+at_fn_group_banner 15 'dbmdel01.at:17' \
+ "delete: non existing record" " " 2
+at_xfail=no
+(
+ $as_echo "15. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmdel01.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 11
+"
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmdel01.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+
+test -z "`sort < /dev/null 2>&1`" || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 11
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+echo >>"$at_stderr"; $as_echo "dtdel: cannot delete 11: Item not found
+" | \
+ $at_diff - "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/dbmdel01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_15
+#AT_START_16
+at_fn_group_banner 16 'dbmdel02.at:17' \
+ "delete: all records" " " 2
+at_xfail=no
+(
+ $as_echo "16. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/dbmdel02.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 1 2 3 4 5 6 7 8 9 10
+dtdump test
+"
+at_fn_check_prepare_notrace 'an embedded newline' "dbmdel02.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload test
+dtdel test 1 2 3 4 5 6 7 8 9 10
+dtdump test
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmdel02.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_16
+#AT_START_17
+at_fn_group_banner 17 'setopt00.at:17' \
+ "setopt" " " 3
+at_xfail=no
+(
+ $as_echo "17. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/setopt00.at:20:
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db '!MMAP'
+"
+at_fn_check_prepare_notrace 'an embedded newline' "setopt00.at:20"
+( $at_check_trace;
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db '!MMAP'
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "GDBM_GETFLAGS: PASS
+* CACHESIZE:
+initial GDBM_SETCACHESIZE: PASS
+GDBM_GETCACHESIZE: PASS
+second GDBM_SETCACHESIZE: XFAIL
+* SYNCMODE:
+initial GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE: PASS
+GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE true: PASS
+GDBM_GETSYNCMODE: PASS
+GDBM_SETSYNCMODE false: PASS
+GDBM_GETSYNCMODE: PASS
+* CENTFREE:
+initial GDBM_GETCENTFREE: PASS
+GDBM_SETCENTFREE: PASS
+GDBM_GETCENTFREE: FAIL
+GDBM_SETCENTFREE true: PASS
+GDBM_GETCENTFREE: FAIL
+GDBM_SETCENTFREE false: PASS
+GDBM_GETCENTFREE: FAIL
+* COALESCEBLKS:
+initial GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS true: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_SETCOALESCEBLKS false: PASS
+GDBM_GETCOALESCEBLKS: PASS
+GDBM_GETDBNAME: PASS
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/setopt00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_17
+#AT_START_18
+at_fn_group_banner 18 'setopt01.at:17' \
+ "setopt: mmap options" " " 3
+at_xfail=no
+(
+ $as_echo "18. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/setopt01.at:20:
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db 'MMAP' > out
+grep 'MMAP: SKIP' out >/dev/null && exit 77
+cat out
+"
+at_fn_check_prepare_notrace 'an embedded newline' "setopt01.at:20"
+( $at_check_trace;
+num2word 1:1000 | gtload test.db || exit 2
+gtopt test.db 'MMAP' > out
+grep 'MMAP: SKIP' out >/dev/null && exit 77
+cat out
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "* MMAP:
+initial GDBM_GETMMAP: PASS
+GDBM_SETMMAP false: PASS
+GDBM_GETMMAP: PASS
+initial GDBM_GETMAXMAPSIZE: PASS
+GDBM_SETMAXMAPSIZE: PASS
+GDBM_GETMAXMAPSIZE: PASS
+" | \
+ $at_diff - "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/setopt01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_18
+#AT_START_19
+at_fn_group_banner 19 'cloexec00.at:17' \
+ "cloexec: gdbm_open" " " 4
+at_xfail=no
+(
+ $as_echo "19. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/cloexec00.at:20:
+g_open_ce \"\$abs_builddir/fdop\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec00.at:20"
+( $at_check_trace;
+g_open_ce "$abs_builddir/fdop"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec00.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_19
+#AT_START_20
+at_fn_group_banner 20 'cloexec01.at:17' \
+ "cloexec: gdbm_reorganize" " " 4
+at_xfail=no
+(
+ $as_echo "20. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/cloexec01.at:20:
+g_reorg_ce \"\$abs_builddir/fdop\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec01.at:20"
+( $at_check_trace;
+g_reorg_ce "$abs_builddir/fdop"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec01.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_20
+#AT_START_21
+at_fn_group_banner 21 'cloexec02.at:17' \
+ "cloexec: dbm_open" " " 4
+at_xfail=no
+(
+ $as_echo "21. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/cloexec02.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload file
+d_creat_ce \"\$abs_builddir/fdop\"
+"
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec02.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+num2word 1:10 | dtload file
+d_creat_ce "$abs_builddir/fdop"
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec02.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_21
+#AT_START_22
+at_fn_group_banner 22 'cloexec03.at:17' \
+ "cloexec: dbm_open -creat" " " 4
+at_xfail=no
+(
+ $as_echo "22. $at_setup_line: testing $at_desc ..."
+ $at_traceon
+
+
+
+{ set +x
+$as_echo "$at_srcdir/cloexec03.at:20:
+
+test \$COMPAT -eq 1 || exit 77
+
+d_creat_ce \"\$abs_builddir/fdop\" -creat
+"
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec03.at:20"
+( $at_check_trace;
+
+test $COMPAT -eq 1 || exit 77
+
+d_creat_ce "$abs_builddir/fdop" -creat
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec03.at:20"
+$at_failed && at_fn_log_failure
+$at_traceon; }
+
+
+ set +x
+ $at_times_p && times >"$at_times_file"
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
+#AT_STOP_22
diff --git a/tests/testsuite.at b/tests/testsuite.at
new file mode 100644
index 0000000..1e7373c
--- /dev/null
+++ b/tests/testsuite.at
@@ -0,0 +1,73 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+m4_version_prereq([2.52g])
+
+m4_define([AT_SKIP_TEST],[exit 77])
+
+dnl AT_SORT_PREREQ - Skip test if sort utility outputs unwanted data on stderr
+m4_define([AT_SORT_PREREQ],[
+test -z "`sort < /dev/null 2>&1`" || AT_SKIP_TEST
+])
+
+m4_define([AT_COMPAT_PREREQ],[
+test $COMPAT -eq 1 || AT_SKIP_TEST
+])
+
+dnl # Begin tests
+
+AT_INIT
+m4_include([version.at])
+
+AT_BANNER([GDBM interface])
+
+m4_include([create00.at])
+
+m4_include([fetch00.at])
+m4_include([fetch01.at])
+
+m4_include([delete00.at])
+m4_include([delete01.at])
+m4_include([delete02.at])
+
+AT_BANNER([Compatibility library (dbm/ndbm)])
+
+m4_include([dbmcreate00.at])
+
+m4_include([dbmcvt.at])
+
+m4_include([dbmfetch00.at])
+m4_include([dbmfetch01.at])
+m4_include([dbmfetch02.at])
+m4_include([dbmfetch03.at])
+
+m4_include([dbmdel00.at])
+m4_include([dbmdel01.at])
+m4_include([dbmdel02.at])
+
+AT_BANNER([DB options])
+
+m4_include([setopt00.at])
+m4_include([setopt01.at])
+
+AT_BANNER([Cloexec])
+
+m4_include([cloexec00.at])
+m4_include([cloexec01.at])
+m4_include([cloexec02.at])
+m4_include([cloexec03.at])
+
+# End of testsuite.at
diff --git a/tests/version.at b/tests/version.at
new file mode 100644
index 0000000..8959d75
--- /dev/null
+++ b/tests/version.at
@@ -0,0 +1,25 @@
+# This file is part of GDBM. -*- autoconf -*-
+# Copyright (C) 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 2, 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/>. */
+
+AT_SETUP([gdbm version])
+
+AT_CHECK([gtver -lib -full -header -full],
+[0],
+[AT_PACKAGE_VERSION_MAJOR.AT_PACKAGE_VERSION_MINOR.AT_PACKAGE_VERSION_PATCH
+AT_PACKAGE_VERSION_MAJOR.AT_PACKAGE_VERSION_MINOR.AT_PACKAGE_VERSION_PATCH
+])
+
+AT_CLEANUP