[Box Backup-commit] COMMIT r2794 - in box/trunk: . bin/bbackupd bundled infrastructure qdbm qdbm/misc

subversion at boxbackup.org subversion at boxbackup.org
Mon Oct 18 21:34:26 BST 2010


Author: chris
Date: 2010-10-18 21:34:25 +0100 (Mon, 18 Oct 2010)
New Revision: 2794

Added:
   box/trunk/qdbm/
   box/trunk/qdbm/COPYING
   box/trunk/qdbm/ChangeLog
   box/trunk/qdbm/LTmakefile.in
   box/trunk/qdbm/Makefile.in
   box/trunk/qdbm/NEWS
   box/trunk/qdbm/README
   box/trunk/qdbm/RISCmakefile
   box/trunk/qdbm/THANKS
   box/trunk/qdbm/VCmakefile
   box/trunk/qdbm/cabin.c
   box/trunk/qdbm/cabin.h
   box/trunk/qdbm/cbcodec.c
   box/trunk/qdbm/cbtest.c
   box/trunk/qdbm/configure
   box/trunk/qdbm/configure.in
   box/trunk/qdbm/crmgr.c
   box/trunk/qdbm/crtest.c
   box/trunk/qdbm/crtsv.c
   box/trunk/qdbm/curia.c
   box/trunk/qdbm/curia.h
   box/trunk/qdbm/depot.c
   box/trunk/qdbm/depot.h
   box/trunk/qdbm/dpmgr.c
   box/trunk/qdbm/dptest.c
   box/trunk/qdbm/dptsv.c
   box/trunk/qdbm/hovel.c
   box/trunk/qdbm/hovel.h
   box/trunk/qdbm/hvmgr.c
   box/trunk/qdbm/hvtest.c
   box/trunk/qdbm/misc/
   box/trunk/qdbm/misc/COPYING.txt
   box/trunk/qdbm/misc/README-win32.txt
   box/trunk/qdbm/misc/VCmakefile-old
   box/trunk/qdbm/misc/benchmark.pdf
   box/trunk/qdbm/misc/icon16.png
   box/trunk/qdbm/misc/icon20.png
   box/trunk/qdbm/misc/index.html
   box/trunk/qdbm/misc/index.ja.html
   box/trunk/qdbm/misc/logo.png
   box/trunk/qdbm/misc/makevcdef
   box/trunk/qdbm/misc/mymemo-ja.html
   box/trunk/qdbm/misc/tutorial-ja.html
   box/trunk/qdbm/misc/win32check.bat
   box/trunk/qdbm/myconf.c
   box/trunk/qdbm/myconf.h
   box/trunk/qdbm/odeum.c
   box/trunk/qdbm/odeum.h
   box/trunk/qdbm/odidx.c
   box/trunk/qdbm/odmgr.c
   box/trunk/qdbm/odtest.c
   box/trunk/qdbm/qdbm.def
   box/trunk/qdbm/qdbm.pc.in
   box/trunk/qdbm/qdbm.spec.in
   box/trunk/qdbm/qmttest.c
   box/trunk/qdbm/relic.c
   box/trunk/qdbm/relic.h
   box/trunk/qdbm/rlmgr.c
   box/trunk/qdbm/rltest.c
   box/trunk/qdbm/spex-ja.html
   box/trunk/qdbm/spex.html
   box/trunk/qdbm/villa.c
   box/trunk/qdbm/villa.h
   box/trunk/qdbm/vista.c
   box/trunk/qdbm/vista.h
   box/trunk/qdbm/vlmgr.c
   box/trunk/qdbm/vltest.c
   box/trunk/qdbm/vltsv.c
Removed:
   box/trunk/bundled/replace/
   box/trunk/bundled/tdb/
   box/trunk/qdbm/COPYING
   box/trunk/qdbm/ChangeLog
   box/trunk/qdbm/LTmakefile.in
   box/trunk/qdbm/Makefile.in
   box/trunk/qdbm/NEWS
   box/trunk/qdbm/README
   box/trunk/qdbm/RISCmakefile
   box/trunk/qdbm/THANKS
   box/trunk/qdbm/VCmakefile
   box/trunk/qdbm/cabin.c
   box/trunk/qdbm/cabin.h
   box/trunk/qdbm/cbcodec.c
   box/trunk/qdbm/cbtest.c
   box/trunk/qdbm/configure
   box/trunk/qdbm/configure.in
   box/trunk/qdbm/crmgr.c
   box/trunk/qdbm/crtest.c
   box/trunk/qdbm/crtsv.c
   box/trunk/qdbm/curia.c
   box/trunk/qdbm/curia.h
   box/trunk/qdbm/depot.c
   box/trunk/qdbm/depot.h
   box/trunk/qdbm/dpmgr.c
   box/trunk/qdbm/dptest.c
   box/trunk/qdbm/dptsv.c
   box/trunk/qdbm/hovel.c
   box/trunk/qdbm/hovel.h
   box/trunk/qdbm/hvmgr.c
   box/trunk/qdbm/hvtest.c
   box/trunk/qdbm/misc/
   box/trunk/qdbm/misc/COPYING.txt
   box/trunk/qdbm/misc/README-win32.txt
   box/trunk/qdbm/misc/VCmakefile-old
   box/trunk/qdbm/misc/benchmark.pdf
   box/trunk/qdbm/misc/icon16.png
   box/trunk/qdbm/misc/icon20.png
   box/trunk/qdbm/misc/index.html
   box/trunk/qdbm/misc/index.ja.html
   box/trunk/qdbm/misc/logo.png
   box/trunk/qdbm/misc/makevcdef
   box/trunk/qdbm/misc/mymemo-ja.html
   box/trunk/qdbm/misc/tutorial-ja.html
   box/trunk/qdbm/misc/win32check.bat
   box/trunk/qdbm/myconf.c
   box/trunk/qdbm/myconf.h
   box/trunk/qdbm/odeum.c
   box/trunk/qdbm/odeum.h
   box/trunk/qdbm/odidx.c
   box/trunk/qdbm/odmgr.c
   box/trunk/qdbm/odtest.c
   box/trunk/qdbm/qdbm.def
   box/trunk/qdbm/qdbm.pc.in
   box/trunk/qdbm/qdbm.spec.in
   box/trunk/qdbm/qmttest.c
   box/trunk/qdbm/relic.c
   box/trunk/qdbm/relic.h
   box/trunk/qdbm/rlmgr.c
   box/trunk/qdbm/rltest.c
   box/trunk/qdbm/spex-ja.html
   box/trunk/qdbm/spex.html
   box/trunk/qdbm/villa.c
   box/trunk/qdbm/villa.h
   box/trunk/qdbm/vista.c
   box/trunk/qdbm/vista.h
   box/trunk/qdbm/vlmgr.c
   box/trunk/qdbm/vltest.c
   box/trunk/qdbm/vltsv.c
Modified:
   box/trunk/bin/bbackupd/BackupClientInodeToIDMap.cpp
   box/trunk/bin/bbackupd/BackupClientInodeToIDMap.h
   box/trunk/bootstrap
   box/trunk/configure.ac
   box/trunk/infrastructure/makebuildenv.pl.in
   box/trunk/infrastructure/makeparcels.pl.in
   box/trunk/modules.txt
   box/trunk/parcels.txt
Log:
Revert [2710] and [2717], remove TDB and replace with QDBM again, to fix 
build on Windows and make it easier to merge Charles' work.


Modified: box/trunk/bin/bbackupd/BackupClientInodeToIDMap.cpp
===================================================================
--- box/trunk/bin/bbackupd/BackupClientInodeToIDMap.cpp	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/bin/bbackupd/BackupClientInodeToIDMap.cpp	2010-10-18 20:34:25 UTC (rev 2794)
@@ -10,10 +10,8 @@
 #include "Box.h"
 
 #include <stdlib.h>
+#include <depot.h>
 
-#define _PUBLIC_
-#include "tdb.h"
-
 #define BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION
 #include "BackupClientInodeToIDMap.h"
 #undef BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION
@@ -28,7 +26,7 @@
 	int64_t mInDirectory;
 } IDBRecord;
 
-#define BOX_DBM_MESSAGE(stuff) stuff << " (tdb): " << tdb_error(mpContext)
+#define BOX_DBM_MESSAGE(stuff) stuff << " (qdbm): " << dperrmsg(dpecode)
 
 #define BOX_LOG_DBM_ERROR(stuff) \
 	BOX_ERROR(BOX_DBM_MESSAGE(stuff))
@@ -38,21 +36,21 @@
 	THROW_EXCEPTION_MESSAGE(exception, subtype, \
 		BOX_DBM_MESSAGE(message << ": " << filename));
 
-#define ASSERT_DBM(success, message, exception, subtype) \
-	if(!(success)) \
+#define ASSERT_DBM_OK(operation, message, filename, exception, subtype) \
+	if(!(operation)) \
 	{ \
-		THROW_DBM_ERROR(message, mFilename, exception, subtype); \
+		THROW_DBM_ERROR(message, filename, exception, subtype); \
 	}
 
 #define ASSERT_DBM_OPEN() \
-	if(mpContext == 0) \
+	if(mpDepot == 0) \
 	{ \
 		THROW_EXCEPTION_MESSAGE(BackupStoreException, InodeMapNotOpen, \
 			"Inode database not open"); \
 	}
 
 #define ASSERT_DBM_CLOSED() \
-	if(mpContext != 0) \
+	if(mpDepot != 0) \
 	{ \
 		THROW_EXCEPTION_MESSAGE(CommonException, Internal, \
 			"Inode database already open: " << mFilename); \
@@ -69,7 +67,7 @@
 BackupClientInodeToIDMap::BackupClientInodeToIDMap()
 	: mReadOnly(true),
 	  mEmpty(false),
-	  mpContext(NULL)
+	  mpDepot(0)
 {
 }
 
@@ -83,7 +81,7 @@
 // --------------------------------------------------------------------------
 BackupClientInodeToIDMap::~BackupClientInodeToIDMap()
 {
-	if(mpContext != NULL)
+	if(mpDepot != 0)
 	{
 		Close();
 	}
@@ -110,15 +108,15 @@
 	ASSERT(!mEmpty);
 	
 	// Open the database file
-	int mode = ReadOnly ? O_RDONLY : O_RDWR;
+	int mode = ReadOnly ? DP_OREADER : DP_OWRITER;
 	if(CreateNew)
 	{
-		mode |= O_CREAT;
+		mode |= DP_OCREAT;
 	}
 	
-	mpContext = tdb_open(Filename, 0, 0, mode, 0700);
+	mpDepot = dpopen(Filename, mode, 0);
 	
-	ASSERT_DBM(mpContext != NULL, "Failed to open inode database",
+	ASSERT_DBM_OK(mpDepot, "Failed to open inode database", mFilename,
 		BackupStoreException, BerkelyDBFailure);
 	
 	// Read only flag
@@ -139,7 +137,7 @@
 void BackupClientInodeToIDMap::OpenEmpty()
 {
 	ASSERT_DBM_CLOSED();
-	ASSERT(mpContext == NULL);
+	ASSERT(mpDepot == 0);
 	mEmpty = true;
 	mReadOnly = true;
 }
@@ -155,22 +153,11 @@
 void BackupClientInodeToIDMap::Close()
 {
 	ASSERT_DBM_OPEN();
-	ASSERT_DBM(tdb_close(mpContext) == 0, "Failed to close inode database",
-		BackupStoreException, BerkelyDBFailure);
-	mpContext = NULL;
+	ASSERT_DBM_OK(dpclose(mpDepot), "Failed to close inode database",
+		mFilename, BackupStoreException, BerkelyDBFailure);
+	mpDepot = 0;
 }
 
-static TDB_DATA GetDatum(void* dptr, size_t dsize)
-{
-	TDB_DATA datum;
-	datum.dptr = (unsigned char *)dptr;
-	datum.dsize = dsize;
-	return datum;
-}
-
-#define GET_STRUCT_DATUM(structure) \
-	GetDatum(&structure, sizeof(structure))
-
 // --------------------------------------------------------------------------
 //
 // Function
@@ -189,7 +176,7 @@
 		THROW_EXCEPTION(BackupStoreException, InodeMapIsReadOnly);
 	}
 
-	if(mpContext == 0)
+	if(mpDepot == 0)
 	{
 		THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen);
 	}
@@ -201,9 +188,9 @@
 	rec.mObjectID = ObjectID;
 	rec.mInDirectory = InDirectory;
 
-	ASSERT_DBM(tdb_store(mpContext, GET_STRUCT_DATUM(InodeRef),
-		GET_STRUCT_DATUM(rec), 0) == 0,
-		"Failed to add record to inode database",
+	ASSERT_DBM_OK(dpput(mpDepot, (const char *)&InodeRef, sizeof(InodeRef),
+		(const char *)&rec, sizeof(rec), DP_DOVER),
+		"Failed to add record to inode database", mFilename,
 		BackupStoreException, BerkelyDBFailure);
 }
 
@@ -227,33 +214,22 @@
 		return false;
 	}
 
-	if(mpContext == 0)
+	if(mpDepot == 0)
 	{
 		THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen);
 	}
 	
 	ASSERT_DBM_OPEN();
 
-	TDB_DATA datum = tdb_fetch(mpContext, GET_STRUCT_DATUM(InodeRef));
-	if(datum.dptr == NULL)
+	IDBRecord rec;
+	
+	if(dpgetwb(mpDepot, (const char *)&InodeRef, sizeof(InodeRef),
+		0, sizeof(IDBRecord), (char *)&rec) == -1)
 	{
 		// key not in file
 		return false;
 	}
-
-	IDBRecord rec;
-	if(datum.dsize != sizeof(rec))
-	{
-		THROW_EXCEPTION_MESSAGE(CommonException, Internal,
-			"Failed to get inode database entry: "
-			"record has wrong size: expected " <<
-			sizeof(rec) << " but was " << datum.dsize <<
-			" in " << mFilename);
-	}
 		
-	rec = *(IDBRecord *)datum.dptr;
-	free(datum.dptr);
-	
 	// Return data
 	rObjectIDOut = rec.mObjectID;
 	rInDirectoryOut = rec.mInDirectory;

Modified: box/trunk/bin/bbackupd/BackupClientInodeToIDMap.h
===================================================================
--- box/trunk/bin/bbackupd/BackupClientInodeToIDMap.h	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/bin/bbackupd/BackupClientInodeToIDMap.h	2010-10-18 20:34:25 UTC (rev 2794)
@@ -17,8 +17,7 @@
 
 // avoid having to include the DB files when not necessary
 #ifndef BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION
-	struct TDB_CONTEXT;
-	struct TDB_DATUM;
+	class DEPOT;
 #endif
 
 // --------------------------------------------------------------------------
@@ -50,7 +49,7 @@
 	bool mReadOnly;
 	bool mEmpty;
 	std::string mFilename;
-	TDB_CONTEXT *mpContext;
+	DEPOT *mpDepot;
 };
 
 #endif // BACKUPCLIENTINODETOIDMAP_H

Modified: box/trunk/bootstrap
===================================================================
--- box/trunk/bootstrap	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/bootstrap	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,8 +1,5 @@
 #!/bin/sh
 
-set -e
-
 aclocal -I infrastructure/m4
 autoheader
 autoconf
-( cd bundled/tdb; ./autogen.sh; )

Modified: box/trunk/configure.ac
===================================================================
--- box/trunk/configure.ac	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/configure.ac	2010-10-18 20:34:25 UTC (rev 2794)
@@ -388,7 +388,7 @@
 fi
 
 cat parcels.txt | sed -e 's/#.*//' | while read cmd subdir configure_args; do
-	if test "$cmd" = "configure"; then
+	if test "$cmd" = "subdir"; then
 		echo
 		export CC CXX CXXFLAGS LDFLAGS LIBS
 		args="$configure_args --target=$target_alias"

Modified: box/trunk/infrastructure/makebuildenv.pl.in
===================================================================
--- box/trunk/infrastructure/makebuildenv.pl.in	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/infrastructure/makebuildenv.pl.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -252,9 +252,6 @@
 	
 	# check directory exists
 	die "Module $mod can't be found\n" unless -d $mod;
-
-	# skip bundled libraries with their own Makefile process	
-	next if ($mod =~ m|^bundled/|);
 	
 	# and put in lists
 	push @modules,$mod;
@@ -513,21 +510,10 @@
 		}
 	}	
 	
+
 	# make include path
-	my $include_paths = "";
+	my $include_paths = join(' ',map {'-I../../'.$_} @all_deps_for_module);
 
-	foreach my $mod (@all_deps_for_module)
-	{
-		if ($mod =~ m|^bundled/| and -d "$mod/include")
-		{
-			$include_paths .= "-I../../$mod/include ";
-		}
-		else
-		{
-			$include_paths .= "-I../../$mod ";
-		}
-	}
-
 	# is target a library?
 	my $target_is_library = ($type ne 'bin' && $type ne 'test');
 
@@ -788,18 +774,13 @@
 			{
 				$dep_target = "\$(OUTBASE)/$dep/$1.a";
 			}
-			elsif ($dep =~ m|^bundled/(.*)|)
+			elsif ($dep =~ m|^.*/(.*)|)
 			{
-				$dep_target = "lib$1.a";
-			}
-			elsif ($dep =~ m|^bin/(.*)|)
-			{
 				$dep_target = "\$(OUTBASE)/$dep/$1$platform_exe_ext";
 			}
 			else
 			{
-				die "Don't know how to add compile-time " .
-					"dependency on $dep";
+				$dep_target = "lib$dep.a";
 			}
 
 			$deps_makeinfo .= <<EOF;
@@ -820,11 +801,11 @@
 	my @lib_files;
 	foreach my $dep (reverse @all_deps_for_module)
 	{
-		if ($dep =~ m|^lib/(.+)$|)
+		if ($dep =~ m|^lib\/(.+)$|)
 		{
 			push @lib_files, "\$(OUTBASE)/$dep/$1.a";
 		}
-		elsif ($dep =~ m|^bundled/(.+)$|)
+		elsif ($dep =~ m|^([^/]+)$|)
 		{
 			push @lib_files, "../../$dep/lib$1.a";
 		}

Modified: box/trunk/infrastructure/makeparcels.pl.in
===================================================================
--- box/trunk/infrastructure/makeparcels.pl.in	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/infrastructure/makeparcels.pl.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -243,7 +243,7 @@
 EOF
 			push @parcel_deps, "$dir/docs/${name}.html";
 		}
-		elsif ($type eq 'configure')
+		elsif ($type eq 'subdir')
 		{
 			shift @args;
 			my $subdir = shift @args;
@@ -255,7 +255,6 @@
 
 $name-clean:
 	cd $name; \$(MAKE) clean
-
 EOF
 			push @parcel_deps, "$name-build";
 			push @clean_deps,  "$name-clean";

Modified: box/trunk/modules.txt
===================================================================
--- box/trunk/modules.txt	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/modules.txt	2010-10-18 20:34:25 UTC (rev 2794)
@@ -26,12 +26,12 @@
 # Backup system
 
 lib/backupclient	lib/server	lib/crypto	lib/compress
-lib/backupstore		lib/server	lib/raidfile	lib/backupclient		bundled/tdb
+lib/backupstore		lib/server	lib/raidfile	lib/backupclient
 
 bin/bbackupobjdump	lib/backupclient lib/backupstore
-bin/bbstored		lib/raidfile	lib/server	lib/backupstore	lib/backupclient	bundled/tdb
+bin/bbstored		lib/raidfile	lib/server	lib/backupstore	lib/backupclient
 bin/bbstoreaccounts	lib/raidfile	lib/backupstore
-bin/bbackupd		lib/server	lib/backupclient	bundled/tdb
+bin/bbackupd		lib/server	lib/backupclient	qdbm
 bin/bbackupquery	lib/server	lib/backupclient
 bin/bbackupctl		lib/server	lib/backupclient
 

Modified: box/trunk/parcels.txt
===================================================================
--- box/trunk/parcels.txt	2010-10-18 20:32:52 UTC (rev 2793)
+++ box/trunk/parcels.txt	2010-10-18 20:34:25 UTC (rev 2794)
@@ -18,6 +18,7 @@
 	html bbackupd-config
 	html bbackupd.conf
 
+	subdir qdbm libqdbm.a
 
 EXCEPT:mingw32,mingw32msvc
 	man bbackupd.8
@@ -65,8 +66,6 @@
 	html bbstored.conf
 	html raidfile.conf
 
-	configure bundled/tdb
-
 EXCEPT:mingw32,mingw32msvc
 	man bbstored.8
 	man bbstoreaccounts.8

Deleted: box/trunk/qdbm/COPYING
===================================================================
--- box/trunk/qdbm/COPYING	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/COPYING	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library 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
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-

Copied: box/trunk/qdbm/COPYING (from rev 2716, box/trunk/qdbm/COPYING)
===================================================================
--- box/trunk/qdbm/COPYING	                        (rev 0)
+++ box/trunk/qdbm/COPYING	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+

Deleted: box/trunk/qdbm/ChangeLog
===================================================================
--- box/trunk/qdbm/ChangeLog	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/ChangeLog	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,990 +0,0 @@
-2007-10-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A potential defect related to leaf division of B+ tree was cleared.
-	- Release: 1.8.77
-
-2007-03-07  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The hash function of on-memory map was optimized.
-	- A bug related to large object was fixed.
-	- Release: 1.8.76
-
-2006-11-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- A bug related to B+ tree API for Ruby was fixed.
-	- Release: 1.8.75
-
-2006-11-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug related to optimization on Intel Mac series was escaped.
-	- Release: 1.8.74
-
-2006-10-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug related to BZIP2 encoding was fixed.
-	- Release: 1.8.73
-
-2006-10-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.72
-
-2006-08-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefile was modified to assure portability.
-	- Silent flag was added to the C++ API, the Java API, and the Ruby API.
-	- Release: 1.8.71
-
-2006-08-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of segmentation fault on BSD was fixed.
-	- A test command for checking multi thread safety was added.
-	- Release: 1.8.70
-
-2006-08-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Mutex controll in C++ API became refined.
-	- Release: 1.8.69
-
-2006-08-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug about memory alignment was fixed.
-	- A bug of handling meta data on big endian platforms was fixed.
-	- Release: 1.8.68
-
-2006-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug about memory alignment was fixed.
-	- A bug about parsing MIME was fixed.
-	- Release: 1.8.67
-
-2006-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.66
-
-2006-08-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended API was enhanced.
-	- The extended advanced API was enhanced.
-	- Release: 1.8.65
-
-2006-07-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of Makefile ralated to optimization was fixed.
-	- Release: 1.8.64
-
-2006-07-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A lot of functions were replaced by macros.
-	- The utility API was enhanced.
-	- Release: 1.8.63
-
-2006-07-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A lot of functions were replaced by macros.
-	- The URL resolver was to allow unescaped meta characters.
-	- The advanced API was enhanced.
-	- Release: 1.8.62
-
-2006-07-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of the size checking function of the extended API was fixed.
-	- The advanced API was enhanced.
-	- Release: 1.8.61
-
-2006-06-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- The extended API was enhanced.
-	- The advanced API was enhanced.
-	- Multiple cursor class is now supported on the java API.
-	- Release: 1.8.60
-
-2006-05-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- The extended API was enhanced.
-	- The advanced API was enhanced.
-	- A bug of Makefile for Mac OS X support was fixed.
-	- Release: 1.8.59
-
-2006-05-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- The advanced API was enhanced.
-	- Release: 1.8.58
-
-2006-05-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.8.57
-
-2006-05-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of URL decoder was fixed.
-	- Release: 1.8.56
-
-2006-05-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.8.55
-
-2006-05-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- Release: 1.8.54
-
-2006-05-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- AIX is now supported.
-	- The utility API was enhanced.
-	- Release: 1.8.53
-
-2006-05-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug about evaluating RFC822 date format was fixed.
-	- Release: 1.8.52
-
-2006-05-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug about evaluating RFC822 date format was fixed.
-	- Warings from GCC 4.1.x were dealt with.
-	- Missing functions in qdbm.def were supplied.
-	- Release: 1.8.51
-
-2006-04-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.50
-
-2006-04-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A parameter of dynamic linking library on Mac OS X was modified.
-	- The utility API was enhanced.
-	- Release: 1.8.49
-
-2006-03-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.48
-
-2006-03-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- LTmakefile was modified.
-	- The utility API was enhanced.
-	- Release: 1.8.47
-
-2006-02-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.46
-
-2006-01-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Alignment algorithm was improved.
-	- A bug of mmap emulation on Windows was fixed.
-	- Release: 1.8.45
-
-2006-01-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of handling meta data on big endian platforms was fixed.
-	- The advanced API was enhanced.
-	- Release: 1.8.44
-
-2006-01-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of mmap emulation on Windows was fixed.
-	- Release: 1.8.43
-
-2006-01-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- mmap emulation on Windows was enhanced.
-	- Release: 1.8.42
-
-2006-01-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Compression of pages of B+ tree with LZO and BZIP was added.
-	- Release: 1.8.41
-
-2006-01-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Configuration for VC++ was to build DLL.
-	- Release: 1.8.40
-
-2006-01-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The advanced API was enhanced.
-	- Release: 1.8.39
-
-2006-01-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The advanced API was enhanced.
-	- Release: 1.8.38
-
-2005-12-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Functions to set the size of the free block pool were added.
-	- Commands line tools were enhanced.
-	- Release: 1.8.37
-
-2005-12-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Free block pool was enhanced.
-	- Commands line tools were enhanced.
-	- Release: 1.8.36
-
-2005-11-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The extended advanced API was enhanced.
-	- All stat calls were replaced with lstat calls.
-	- Release: 1.8.35
-
-2005-11-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of i-node duplication on MinGW was fixed.
-	- Release: 1.8.34
-
-2005-09-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Compressing options of ZLIB was changed.
-	- The utility API was enhanced.
-	- Release: 1.8.33
-
-2005-08-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of backward string matching was fixed.
-	- The utility API was enhanced.
-	- Release: 1.8.32
-
-2005-06-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug of the MIME parser was fixed.
-	- A bug about database repair on Win32 was fixed.
-	- A bug of Makefile for Mac OS X support was fixed.
-	- The type of error codes of GDBM-compatibility API was changed.
-	- Release: 1.8.31
-
-2005-06-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A Bug of APIs for C++ related to namespace was fixed.
-	- The library of shared objects of C++ APIs was added.
-	- The utility API was enhanced.
-	- Release: 1.8.30
-
-2005-06-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug about file locking on Win32 was fixed.
-	- Manuals of command line tools were added.
-	- The utility API was enhanced.
-	- Release: 1.8.29
-
-2005-05-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A compilation problem on hppa-linux was fixed.
-	- A configuration file for pkg-config was added.
-	- Release: 1.8.28
-
-2005-05-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Non-blocking lock was featured.
-	- Release: 1.8.27
-
-2005-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.8.26
-
-2005-05-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.8.25
-
-2005-04-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- A bug about database repair on Win32 was fixed.
-	- Release: 1.8.24
-
-2005-04-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The extended advanced API was enhanced.
-	- Release: 1.8.23
-
-2005-03-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended advanced API was enhanced.
-	- The utility API was enhanced.
-	- The inverted API was enhanced.
-	- Test commands were enhanced.
-	- Release: 1.8.22
-
-2005-01-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Functions to dump endian independent data was added.
-	- Release: 1.8.21
-
-2005-01-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Sparse file support was added.
-	- Release: 1.8.20
-
-2005-01-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Building configurations were enhanced.
-	- Release: 1.8.19
-
-2004-11-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The extended advanced API was enhanced.
-	- The inverted API was enhanced.
-	- Release: 1.8.18
-
-2004-09-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The CGI script for file upload was enhanced.
-	- The spec file for RPM packages was enhanced.
-	- Release: 1.8.17
-
-2004-08-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug in the extended API was fixed.
-	- A bug about seek on Windows 9x was fixed.
-	- The CGI script for file upload was enhanced.
-	- Release: 1.8.16
-
-2004-08-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- A bug about mmap on Mac OS X was fixed.
-	- A CGI script for file upload was added.
-	- Building configurations were enhanced.
-	- Release: 1.8.15
-	
-2004-07-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The basic API was enhanced.
-	- The extended API was enhanced.
-	- The advanced API was enhanced.
-	- The inverted API was enhanced.
-	- Building configurations were enhanced.
-	- Release: 1.8.14
-
-2004-07-07  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The inverted API was enhanced.
-	- Release: 1.8.13
-
-2004-05-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The inverted API was enhanced.
-	- Building configurations were enhanced.
-	- Release: 1.8.12
-
-2004-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Source codes were cleaned up for Visual C++.
-	- Test commands were enhanced.
-	- Building configurations were enhanced.
-	- Release: 1.8.11
-
-2004-04-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Utility for performance test was enhanced.
-	- It was escaped from a bug about mmap on FreeBSD and NetBSD.
-	- Release: 1.8.10
-
-2004-04-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Logger for debugging is now featured.
-	- It was escaped from a bug about mmap on OpenBSD.
-	- Release: 1.8.9
-
-2004-04-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Processing speed was improved.
-	- The basic API was enhanced.
-	- The extended API was enhanced.
-	- The configuration for VC++ was enhanced.
-	- Release: 1.8.8
-
-2004-03-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The configuration of C++ API escaped from a bug of pthread.
-	- Release: 1.8.7
-
-2004-03-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended API was enhanced.
-	- Bugs in the utility API about memory management were fixed.
-	- Release: 1.8.6
-
-2004-03-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug in the utility API for 64-bit platforms was fixed.
-	- The utility API was enhanced.
-	- Release: 1.8.5
-
-2004-03-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Runtime switching of whether to use ZLIB was featured.
-	- The binary package for Win32 now features ZLIB and ICONV.
-	- The utility API was enhanced.
-	- Release: 1.8.4
-
-2004-03-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- A utility class of Java API was enhanced.
-	- Test commands were enhanced.
-	- Release: 1.8.3
-
-2004-03-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.8.2
-
-2004-02-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Processing speed of multi-thread support was improved.
-	- Release: 1.8.1
-
-2004-02-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Switch to make API for C thread-safe was added.
-	- Release: 1.8.0
-
-2004-02-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Potential bugs in APIs for C++ were fixed.
-	- Release: 1.7.34
-
-2004-01-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended API was enhanced.
-	- The inverted API was enhanced.
-	- Release: 1.7.33
-
-2004-01-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- Release: 1.7.32
-
-2004-01-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- Release: 1.7.31
-
-2004-01-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- Release: 1.7.30
-
-2004-01-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.7.29
-
-2004-01-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug in the utility API was fixed.
-	- Release: 1.7.28
-
-2004-01-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug in the advanced API was fixed.
-	- The utility API was enhanced.
-	- Release: 1.7.27
-
-2004-01-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- Release: 1.7.26
-
-2004-01-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.7.25
-
-2003-12-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C++ export was supported in header files.
-	- The utility API was enhanced.
-	- Release: 1.7.24
-
-2003-12-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Repairing utility was added to the advanced API.
-	- The basic API was enhanced.
-	- The utility API was enhanced.
-	- Release: 1.7.23
-
-2003-12-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Repairing utility was added to the extended API.
-	- The utility API was enhanced.
-	- Release: 1.7.22
-
-2003-12-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A utility to repair a broken database file was added.
-	- A ulitity command for full-text search was enhanced.
-	- Release: 1.7.21
-
-2003-12-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Character encoding converter was added.
-	- Release: 1.7.20
-
-2003-12-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Format converter for older versions than 1.7.13 was added.
-	- Tuning paramters of the inverted API were modified.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.19
-
-2003-12-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The GDBM-compatible API was enhanced.
-	- Release: 1.7.18
-
-2003-12-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.17
-
-2003-12-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A CGI script for full-text search was enhanced.
-	- A ulitity command for full-text search was enhanced.
-	- Building configuration files were modified.
-	- Release: 1.7.16
-
-2003-11-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A CGI script for full-text search was enhanced.
-	- A ulitity command for full-text search was enhanced.
-	- Release: 1.7.15
-
-2003-11-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- A ulitity command for full-text search was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.14
-
-2003-11-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Format of headers of database was modified.
-	- Supporting endian conversion was abolished.
-	- Import/export features were added to utility commands.
-	- A ulitity command for full-text search was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.13
-
-2003-11-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- The inverted API was enhanced.
-	- A ulitity command for full-text search was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.12
-
-2003-11-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API was enhanced.
-	- A ulitity command for full-text search was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- A utility class of Java API was enhanced.
-	- Release: 1.7.11
-
-2003-11-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A utility class of Java API was enhanced.
-	- Building configuration for CGI scripts was modified.
-	- Release: 1.7.10
-
-2003-11-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Tuning paramters of the inverted API were modified.
-	- A ulitity command for full-text search was enhanced.
-	- Release: 1.7.9
-
-2003-11-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Optional features of compressing with ZLIB were added.
-	- Release: 1.7.8
-
-2003-11-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The extended advanced API, Vista was added.
-	- Release: 1.7.7
-
-2003-11-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C API compilation using Visual C++ was supported.
-	- Odeum and its commands were enhanced.
-	- Release: 1.7.6
-
-2003-10-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A ulitity command for full-text search was enhanced.
-	- A CGI script for full-text search was enhanced.
-	- Release: 1.7.5
-
-2003-10-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A CGI script for full-text search was added.
-	- A bug of BSD support in Makefile was fixed.
-	- Release: 1.7.4
-
-2003-10-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Processing speed of the inverted API was improved.
-	- A ulitity command for full-text search was enhanced.
-	- Release: 1.7.3
-
-2003-10-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The license was changed to LGPL.
-	- An indexing command for the inverted API was added.
-	- Release: 1.7.2
-
-2003-10-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A test command for the inverted API was added.
-	- A bug about optimization in the inverted API was fixed.
-	- Tuning paramters of the inverted API were modified.
-	- Release: 1.7.1
-
-2003-10-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The inverted API, Odeum was added.
-	- Comments in source codes increased.
-	- Release: 1.7.0
-
-2003-10-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Executable commands were modified for RISC OS.
-	- Release: 1.6.22
-
-2003-10-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Executable commands were modified for RISC OS.
-	- Release: 1.6.21
-
-2003-09-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Naming file in RISC OS style was supported.
-	- Hash functions were enhanced.
-	- Release: 1.6.20
-
-2003-09-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Test commands were added.
-	- Release: 1.6.19
-
-2003-09-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefile for RISC OS was added.
-	- C++ API was enhanced.
-	- Release: 1.6.18
-
-2003-09-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Test commands were enhanced.
-	- Source codes and Makefile were modified for RISC OS.
-	- The CGI script was enhanced.
-	- Release: 1.6.17
-
-2003-09-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The CGI script for administration was added.
-	- C++ API was enhanced.
-	- Release: 1.6.16
-
-2003-08-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.6.15
-
-2003-08-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.6.14
-
-2003-08-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.6.13
-
-2003-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- A bug in the utility API was fixed.
-	- Test commands were enhanced.
-	- Release: 1.6.12
-
-2003-07-31  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C and Java APIs support compilation using MinGW.
-	- Release: 1.6.11
-
-2003-07-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Perl and Ruby APIs support transaction.
-	- Release: 1.6.10
-
-2003-07-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Speed of transaction was improved.
-	- Release: 1.6.9
-
-2003-07-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C++ and Java APIs of B+ tree support transaction.
-	- Release: 1.6.8
-
-2003-07-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C API of B+ tree supports transaction.
-	- Bugs about Mutex in C++ and Java APIs were fixed.
-	- Release: 1.6.7
-
-2003-07-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- C++ and Java APIs of database abstraction were simplified.
-	- Ruby API of B+ tree was simplified.
-	- Release: 1.6.6
-
-2003-07-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Ruby API of B+ tree was added.
-	- C, C++, Java and Perl APIs of B+ tree were enhanced.
-	- Release: 1.6.5
-
-2003-07-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Perl API of B+ tree was added.
-	- C, C++ and Java APIs of B+ tree were enhanced.
-	- Release: 1.6.4
-
-2003-07-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Java API of B++ tree was added.
-	- C API of B+ tree was enhanced.
-	- C++ API of B+ tree was enhanced.
-	- Release: 1.6.3
-
-2003-07-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Debug routines were removed and speed was improved.
-	- No locking mode was added.
-	- Endian converter of Villa was added.
-	- C++ API of B++ tree was added.
-	- Release: 1.6.2
-
-2003-07-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The advanced API was enhanced to improve its speed.
-	- Makefiles were enhanced for HP-UX.
-	- Release: 1.6.1
-
-2003-06-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The advanced API for B+ tree database is added.
-	- Release: 1.6.0
-
-2003-06-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefiles were enhanced for Mac OS X.
-	- Release: 1.5.13
-
-2003-06-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefile was enhanced for Solaris and Mac OS X.
-	- Release: 1.5.12
-
-2003-06-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.5.11
-
-2003-05-31  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was enhanced.
-	- Release: 1.5.10
-
-2003-05-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was changed.
-	- Release: 1.5.9
-
-2003-05-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Alignment mechanism was simplified.
-	- Release: 1.5.8
-
-2003-05-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefile was updated
-	- Release: 1.5.7
-
-2003-05-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Test tools were enhanced.
-	- Release: 1.5.6
-
-2003-05-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefile using libtool was added.
-	- Release: 1.5.5
-
-2003-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- API for Ruby was enhanced.
-	- Release: 1.5.4
-
-2003-05-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- API for Ruby was added.
-	- Release: 1.5.3
-
-2003-05-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- API for Perl was enhanced.
-	- Release: 1.5.2
-
-2003-04-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- API for Perl was enhanced.
-	- Release: 1.5.1
-
-2003-04-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- API for Perl was added.
-	- Release: 1.5.0
-
-2003-04-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The package was reorganized to be a GNU package.
-	- Release: 1.4.11
-
-2003-04-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The utility API was added.
-	- Release: 1.4.10
-
-2003-04-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Endian converters were added.
-	- Release: 1.4.9
-
-2003-04-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The GDBM-compatible API was enhanced.
-	- Release: 1.4.8
-
-2003-04-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Some bugs were fixed and C++ API was enhanced.
-	- Release: 1.4.7
-
-2003-04-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Coalescence of dead regions and reuse of them were featured.
-	- Release: 1.4.6
-
-2003-04-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The GDBM-compatible API and the C++ API were enhanced.
-	- Release: 1.4.5
-
-2003-04-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The API for C++ and the API for Java were enhanced.
-	- Release: 1.4.4
-
-2003-04-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Documents for C++ was enhanced.
-	- Release: 1.4.3
-
-2003-04-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The API for Java was enhanced.
-	- Release: 1.4.2
-
-2003-03-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Makefiles were modified.
-	- Release: 1.4.1
-
-2003-03-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- APIs for C++ and Java was enhanced.
-	- Release: 1.4.0
-
-2003-03-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The API for C++ was added.
-	- Release: 1.3.2
-
-2003-03-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The API for Java was supported on Solaris and Windows.
-	- Release: 1.3.1
-
-2003-03-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The API for Java was added.
-	- Release: 1.3.0
-
-2003-02-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The GDBM-compatible API was added.
-	- Release: 1.2.0
-
-2003-02-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Compatibility with NDBM was improved.
-	- Release: 1.1.3
-
-2003-02-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Optimizing suppoted on Windows.  DLL is supported.
-	- Release: 1.1.2
-
-2003-02-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- Windows is now supported.
-	- The compatible API was enhanced.
-	- Release: 1.1.1
-
-2003-02-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The NDBM-compatible API was added.
-	- Release: 1.1.0
-
-2003-02-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
-
-	- The initial version.
-	- Release: 1.0.0
-

Copied: box/trunk/qdbm/ChangeLog (from rev 2716, box/trunk/qdbm/ChangeLog)
===================================================================
--- box/trunk/qdbm/ChangeLog	                        (rev 0)
+++ box/trunk/qdbm/ChangeLog	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,990 @@
+2007-10-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A potential defect related to leaf division of B+ tree was cleared.
+	- Release: 1.8.77
+
+2007-03-07  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The hash function of on-memory map was optimized.
+	- A bug related to large object was fixed.
+	- Release: 1.8.76
+
+2006-11-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- A bug related to B+ tree API for Ruby was fixed.
+	- Release: 1.8.75
+
+2006-11-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug related to optimization on Intel Mac series was escaped.
+	- Release: 1.8.74
+
+2006-10-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug related to BZIP2 encoding was fixed.
+	- Release: 1.8.73
+
+2006-10-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.72
+
+2006-08-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefile was modified to assure portability.
+	- Silent flag was added to the C++ API, the Java API, and the Ruby API.
+	- Release: 1.8.71
+
+2006-08-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of segmentation fault on BSD was fixed.
+	- A test command for checking multi thread safety was added.
+	- Release: 1.8.70
+
+2006-08-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Mutex controll in C++ API became refined.
+	- Release: 1.8.69
+
+2006-08-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug about memory alignment was fixed.
+	- A bug of handling meta data on big endian platforms was fixed.
+	- Release: 1.8.68
+
+2006-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug about memory alignment was fixed.
+	- A bug about parsing MIME was fixed.
+	- Release: 1.8.67
+
+2006-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.66
+
+2006-08-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended API was enhanced.
+	- The extended advanced API was enhanced.
+	- Release: 1.8.65
+
+2006-07-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of Makefile ralated to optimization was fixed.
+	- Release: 1.8.64
+
+2006-07-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A lot of functions were replaced by macros.
+	- The utility API was enhanced.
+	- Release: 1.8.63
+
+2006-07-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A lot of functions were replaced by macros.
+	- The URL resolver was to allow unescaped meta characters.
+	- The advanced API was enhanced.
+	- Release: 1.8.62
+
+2006-07-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of the size checking function of the extended API was fixed.
+	- The advanced API was enhanced.
+	- Release: 1.8.61
+
+2006-06-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- The extended API was enhanced.
+	- The advanced API was enhanced.
+	- Multiple cursor class is now supported on the java API.
+	- Release: 1.8.60
+
+2006-05-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- The extended API was enhanced.
+	- The advanced API was enhanced.
+	- A bug of Makefile for Mac OS X support was fixed.
+	- Release: 1.8.59
+
+2006-05-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- The advanced API was enhanced.
+	- Release: 1.8.58
+
+2006-05-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.8.57
+
+2006-05-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of URL decoder was fixed.
+	- Release: 1.8.56
+
+2006-05-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.8.55
+
+2006-05-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- Release: 1.8.54
+
+2006-05-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- AIX is now supported.
+	- The utility API was enhanced.
+	- Release: 1.8.53
+
+2006-05-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug about evaluating RFC822 date format was fixed.
+	- Release: 1.8.52
+
+2006-05-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug about evaluating RFC822 date format was fixed.
+	- Warings from GCC 4.1.x were dealt with.
+	- Missing functions in qdbm.def were supplied.
+	- Release: 1.8.51
+
+2006-04-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.50
+
+2006-04-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A parameter of dynamic linking library on Mac OS X was modified.
+	- The utility API was enhanced.
+	- Release: 1.8.49
+
+2006-03-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.48
+
+2006-03-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- LTmakefile was modified.
+	- The utility API was enhanced.
+	- Release: 1.8.47
+
+2006-02-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.46
+
+2006-01-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Alignment algorithm was improved.
+	- A bug of mmap emulation on Windows was fixed.
+	- Release: 1.8.45
+
+2006-01-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of handling meta data on big endian platforms was fixed.
+	- The advanced API was enhanced.
+	- Release: 1.8.44
+
+2006-01-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of mmap emulation on Windows was fixed.
+	- Release: 1.8.43
+
+2006-01-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- mmap emulation on Windows was enhanced.
+	- Release: 1.8.42
+
+2006-01-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Compression of pages of B+ tree with LZO and BZIP was added.
+	- Release: 1.8.41
+
+2006-01-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Configuration for VC++ was to build DLL.
+	- Release: 1.8.40
+
+2006-01-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The advanced API was enhanced.
+	- Release: 1.8.39
+
+2006-01-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The advanced API was enhanced.
+	- Release: 1.8.38
+
+2005-12-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Functions to set the size of the free block pool were added.
+	- Commands line tools were enhanced.
+	- Release: 1.8.37
+
+2005-12-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Free block pool was enhanced.
+	- Commands line tools were enhanced.
+	- Release: 1.8.36
+
+2005-11-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The extended advanced API was enhanced.
+	- All stat calls were replaced with lstat calls.
+	- Release: 1.8.35
+
+2005-11-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of i-node duplication on MinGW was fixed.
+	- Release: 1.8.34
+
+2005-09-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Compressing options of ZLIB was changed.
+	- The utility API was enhanced.
+	- Release: 1.8.33
+
+2005-08-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of backward string matching was fixed.
+	- The utility API was enhanced.
+	- Release: 1.8.32
+
+2005-06-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug of the MIME parser was fixed.
+	- A bug about database repair on Win32 was fixed.
+	- A bug of Makefile for Mac OS X support was fixed.
+	- The type of error codes of GDBM-compatibility API was changed.
+	- Release: 1.8.31
+
+2005-06-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A Bug of APIs for C++ related to namespace was fixed.
+	- The library of shared objects of C++ APIs was added.
+	- The utility API was enhanced.
+	- Release: 1.8.30
+
+2005-06-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug about file locking on Win32 was fixed.
+	- Manuals of command line tools were added.
+	- The utility API was enhanced.
+	- Release: 1.8.29
+
+2005-05-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A compilation problem on hppa-linux was fixed.
+	- A configuration file for pkg-config was added.
+	- Release: 1.8.28
+
+2005-05-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Non-blocking lock was featured.
+	- Release: 1.8.27
+
+2005-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.8.26
+
+2005-05-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.8.25
+
+2005-04-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- A bug about database repair on Win32 was fixed.
+	- Release: 1.8.24
+
+2005-04-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The extended advanced API was enhanced.
+	- Release: 1.8.23
+
+2005-03-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended advanced API was enhanced.
+	- The utility API was enhanced.
+	- The inverted API was enhanced.
+	- Test commands were enhanced.
+	- Release: 1.8.22
+
+2005-01-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Functions to dump endian independent data was added.
+	- Release: 1.8.21
+
+2005-01-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Sparse file support was added.
+	- Release: 1.8.20
+
+2005-01-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Building configurations were enhanced.
+	- Release: 1.8.19
+
+2004-11-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The extended advanced API was enhanced.
+	- The inverted API was enhanced.
+	- Release: 1.8.18
+
+2004-09-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The CGI script for file upload was enhanced.
+	- The spec file for RPM packages was enhanced.
+	- Release: 1.8.17
+
+2004-08-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug in the extended API was fixed.
+	- A bug about seek on Windows 9x was fixed.
+	- The CGI script for file upload was enhanced.
+	- Release: 1.8.16
+
+2004-08-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- A bug about mmap on Mac OS X was fixed.
+	- A CGI script for file upload was added.
+	- Building configurations were enhanced.
+	- Release: 1.8.15
+	
+2004-07-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The basic API was enhanced.
+	- The extended API was enhanced.
+	- The advanced API was enhanced.
+	- The inverted API was enhanced.
+	- Building configurations were enhanced.
+	- Release: 1.8.14
+
+2004-07-07  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The inverted API was enhanced.
+	- Release: 1.8.13
+
+2004-05-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The inverted API was enhanced.
+	- Building configurations were enhanced.
+	- Release: 1.8.12
+
+2004-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Source codes were cleaned up for Visual C++.
+	- Test commands were enhanced.
+	- Building configurations were enhanced.
+	- Release: 1.8.11
+
+2004-04-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Utility for performance test was enhanced.
+	- It was escaped from a bug about mmap on FreeBSD and NetBSD.
+	- Release: 1.8.10
+
+2004-04-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Logger for debugging is now featured.
+	- It was escaped from a bug about mmap on OpenBSD.
+	- Release: 1.8.9
+
+2004-04-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Processing speed was improved.
+	- The basic API was enhanced.
+	- The extended API was enhanced.
+	- The configuration for VC++ was enhanced.
+	- Release: 1.8.8
+
+2004-03-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The configuration of C++ API escaped from a bug of pthread.
+	- Release: 1.8.7
+
+2004-03-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended API was enhanced.
+	- Bugs in the utility API about memory management were fixed.
+	- Release: 1.8.6
+
+2004-03-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug in the utility API for 64-bit platforms was fixed.
+	- The utility API was enhanced.
+	- Release: 1.8.5
+
+2004-03-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Runtime switching of whether to use ZLIB was featured.
+	- The binary package for Win32 now features ZLIB and ICONV.
+	- The utility API was enhanced.
+	- Release: 1.8.4
+
+2004-03-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- A utility class of Java API was enhanced.
+	- Test commands were enhanced.
+	- Release: 1.8.3
+
+2004-03-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.8.2
+
+2004-02-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Processing speed of multi-thread support was improved.
+	- Release: 1.8.1
+
+2004-02-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Switch to make API for C thread-safe was added.
+	- Release: 1.8.0
+
+2004-02-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Potential bugs in APIs for C++ were fixed.
+	- Release: 1.7.34
+
+2004-01-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended API was enhanced.
+	- The inverted API was enhanced.
+	- Release: 1.7.33
+
+2004-01-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- Release: 1.7.32
+
+2004-01-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- Release: 1.7.31
+
+2004-01-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- Release: 1.7.30
+
+2004-01-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.7.29
+
+2004-01-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug in the utility API was fixed.
+	- Release: 1.7.28
+
+2004-01-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug in the advanced API was fixed.
+	- The utility API was enhanced.
+	- Release: 1.7.27
+
+2004-01-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- Release: 1.7.26
+
+2004-01-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.7.25
+
+2003-12-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C++ export was supported in header files.
+	- The utility API was enhanced.
+	- Release: 1.7.24
+
+2003-12-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Repairing utility was added to the advanced API.
+	- The basic API was enhanced.
+	- The utility API was enhanced.
+	- Release: 1.7.23
+
+2003-12-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Repairing utility was added to the extended API.
+	- The utility API was enhanced.
+	- Release: 1.7.22
+
+2003-12-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A utility to repair a broken database file was added.
+	- A ulitity command for full-text search was enhanced.
+	- Release: 1.7.21
+
+2003-12-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Character encoding converter was added.
+	- Release: 1.7.20
+
+2003-12-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Format converter for older versions than 1.7.13 was added.
+	- Tuning paramters of the inverted API were modified.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.19
+
+2003-12-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The GDBM-compatible API was enhanced.
+	- Release: 1.7.18
+
+2003-12-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.17
+
+2003-12-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A CGI script for full-text search was enhanced.
+	- A ulitity command for full-text search was enhanced.
+	- Building configuration files were modified.
+	- Release: 1.7.16
+
+2003-11-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A CGI script for full-text search was enhanced.
+	- A ulitity command for full-text search was enhanced.
+	- Release: 1.7.15
+
+2003-11-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- A ulitity command for full-text search was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.14
+
+2003-11-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Format of headers of database was modified.
+	- Supporting endian conversion was abolished.
+	- Import/export features were added to utility commands.
+	- A ulitity command for full-text search was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.13
+
+2003-11-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- The inverted API was enhanced.
+	- A ulitity command for full-text search was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.12
+
+2003-11-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API was enhanced.
+	- A ulitity command for full-text search was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- A utility class of Java API was enhanced.
+	- Release: 1.7.11
+
+2003-11-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A utility class of Java API was enhanced.
+	- Building configuration for CGI scripts was modified.
+	- Release: 1.7.10
+
+2003-11-20  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Tuning paramters of the inverted API were modified.
+	- A ulitity command for full-text search was enhanced.
+	- Release: 1.7.9
+
+2003-11-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Optional features of compressing with ZLIB were added.
+	- Release: 1.7.8
+
+2003-11-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The extended advanced API, Vista was added.
+	- Release: 1.7.7
+
+2003-11-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C API compilation using Visual C++ was supported.
+	- Odeum and its commands were enhanced.
+	- Release: 1.7.6
+
+2003-10-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A ulitity command for full-text search was enhanced.
+	- A CGI script for full-text search was enhanced.
+	- Release: 1.7.5
+
+2003-10-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A CGI script for full-text search was added.
+	- A bug of BSD support in Makefile was fixed.
+	- Release: 1.7.4
+
+2003-10-19  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Processing speed of the inverted API was improved.
+	- A ulitity command for full-text search was enhanced.
+	- Release: 1.7.3
+
+2003-10-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The license was changed to LGPL.
+	- An indexing command for the inverted API was added.
+	- Release: 1.7.2
+
+2003-10-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A test command for the inverted API was added.
+	- A bug about optimization in the inverted API was fixed.
+	- Tuning paramters of the inverted API were modified.
+	- Release: 1.7.1
+
+2003-10-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The inverted API, Odeum was added.
+	- Comments in source codes increased.
+	- Release: 1.7.0
+
+2003-10-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Executable commands were modified for RISC OS.
+	- Release: 1.6.22
+
+2003-10-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Executable commands were modified for RISC OS.
+	- Release: 1.6.21
+
+2003-09-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Naming file in RISC OS style was supported.
+	- Hash functions were enhanced.
+	- Release: 1.6.20
+
+2003-09-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Test commands were added.
+	- Release: 1.6.19
+
+2003-09-22  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefile for RISC OS was added.
+	- C++ API was enhanced.
+	- Release: 1.6.18
+
+2003-09-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Test commands were enhanced.
+	- Source codes and Makefile were modified for RISC OS.
+	- The CGI script was enhanced.
+	- Release: 1.6.17
+
+2003-09-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The CGI script for administration was added.
+	- C++ API was enhanced.
+	- Release: 1.6.16
+
+2003-08-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.6.15
+
+2003-08-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.6.14
+
+2003-08-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.6.13
+
+2003-08-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- A bug in the utility API was fixed.
+	- Test commands were enhanced.
+	- Release: 1.6.12
+
+2003-07-31  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C and Java APIs support compilation using MinGW.
+	- Release: 1.6.11
+
+2003-07-27  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Perl and Ruby APIs support transaction.
+	- Release: 1.6.10
+
+2003-07-26  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Speed of transaction was improved.
+	- Release: 1.6.9
+
+2003-07-24  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C++ and Java APIs of B+ tree support transaction.
+	- Release: 1.6.8
+
+2003-07-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C API of B+ tree supports transaction.
+	- Bugs about Mutex in C++ and Java APIs were fixed.
+	- Release: 1.6.7
+
+2003-07-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- C++ and Java APIs of database abstraction were simplified.
+	- Ruby API of B+ tree was simplified.
+	- Release: 1.6.6
+
+2003-07-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Ruby API of B+ tree was added.
+	- C, C++, Java and Perl APIs of B+ tree were enhanced.
+	- Release: 1.6.5
+
+2003-07-13  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Perl API of B+ tree was added.
+	- C, C++ and Java APIs of B+ tree were enhanced.
+	- Release: 1.6.4
+
+2003-07-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Java API of B++ tree was added.
+	- C API of B+ tree was enhanced.
+	- C++ API of B+ tree was enhanced.
+	- Release: 1.6.3
+
+2003-07-05  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Debug routines were removed and speed was improved.
+	- No locking mode was added.
+	- Endian converter of Villa was added.
+	- C++ API of B++ tree was added.
+	- Release: 1.6.2
+
+2003-07-03  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The advanced API was enhanced to improve its speed.
+	- Makefiles were enhanced for HP-UX.
+	- Release: 1.6.1
+
+2003-06-28  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The advanced API for B+ tree database is added.
+	- Release: 1.6.0
+
+2003-06-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefiles were enhanced for Mac OS X.
+	- Release: 1.5.13
+
+2003-06-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefile was enhanced for Solaris and Mac OS X.
+	- Release: 1.5.12
+
+2003-06-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.5.11
+
+2003-05-31  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was enhanced.
+	- Release: 1.5.10
+
+2003-05-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was changed.
+	- Release: 1.5.9
+
+2003-05-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Alignment mechanism was simplified.
+	- Release: 1.5.8
+
+2003-05-17  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefile was updated
+	- Release: 1.5.7
+
+2003-05-16  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Test tools were enhanced.
+	- Release: 1.5.6
+
+2003-05-14  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefile using libtool was added.
+	- Release: 1.5.5
+
+2003-05-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- API for Ruby was enhanced.
+	- Release: 1.5.4
+
+2003-05-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- API for Ruby was added.
+	- Release: 1.5.3
+
+2003-05-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- API for Perl was enhanced.
+	- Release: 1.5.2
+
+2003-04-30  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- API for Perl was enhanced.
+	- Release: 1.5.1
+
+2003-04-29  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- API for Perl was added.
+	- Release: 1.5.0
+
+2003-04-25  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The package was reorganized to be a GNU package.
+	- Release: 1.4.11
+
+2003-04-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The utility API was added.
+	- Release: 1.4.10
+
+2003-04-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Endian converters were added.
+	- Release: 1.4.9
+
+2003-04-12  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The GDBM-compatible API was enhanced.
+	- Release: 1.4.8
+
+2003-04-10  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Some bugs were fixed and C++ API was enhanced.
+	- Release: 1.4.7
+
+2003-04-09  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Coalescence of dead regions and reuse of them were featured.
+	- Release: 1.4.6
+
+2003-04-06  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The GDBM-compatible API and the C++ API were enhanced.
+	- Release: 1.4.5
+
+2003-04-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The API for C++ and the API for Java were enhanced.
+	- Release: 1.4.4
+
+2003-04-02  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Documents for C++ was enhanced.
+	- Release: 1.4.3
+
+2003-04-01  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The API for Java was enhanced.
+	- Release: 1.4.2
+
+2003-03-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Makefiles were modified.
+	- Release: 1.4.1
+
+2003-03-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- APIs for C++ and Java was enhanced.
+	- Release: 1.4.0
+
+2003-03-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The API for C++ was added.
+	- Release: 1.3.2
+
+2003-03-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The API for Java was supported on Solaris and Windows.
+	- Release: 1.3.1
+
+2003-03-04  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The API for Java was added.
+	- Release: 1.3.0
+
+2003-02-23  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The GDBM-compatible API was added.
+	- Release: 1.2.0
+
+2003-02-21  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Compatibility with NDBM was improved.
+	- Release: 1.1.3
+
+2003-02-18  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Optimizing suppoted on Windows.  DLL is supported.
+	- Release: 1.1.2
+
+2003-02-15  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- Windows is now supported.
+	- The compatible API was enhanced.
+	- Release: 1.1.1
+
+2003-02-11  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The NDBM-compatible API was added.
+	- Release: 1.1.0
+
+2003-02-08  Mikio Hirabayashi  <mikio at users.sourceforge.net>
+
+	- The initial version.
+	- Release: 1.0.0
+

Deleted: box/trunk/qdbm/LTmakefile.in
===================================================================
--- box/trunk/qdbm/LTmakefile.in	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/LTmakefile.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,318 +0,0 @@
-# Makefile to build QDBM using libtool
-
-
-
-#================================================================
-# Setting variables
-#================================================================
-
-
-# Generic settings
-SHELL = @SHELL@
-
-# Packaging
-PACKAGE = @PACKAGE_NAME@
-VERSION = @PACKAGE_VERSION@
-LIBVER = @LIBVER@
-LIBREV = @LIBREV@
-
-# Targets
-MYHEADS = depot.h curia.h relic.h hovel.h cabin.h villa.h vista.h odeum.h
-MYLIBOBJS = depot.lo curia.lo relic.lo hovel.lo cabin.lo villa.lo vista.lo odeum.lo myconf.lo
-MYLIBS = libqdbm.la
-MYBINS = dpmgr dptest dptsv crmgr crtest crtsv rlmgr rltest hvmgr hvtest \
-  cbtest cbcodec vlmgr vltest vltsv odmgr odtest odidx qmttest
-MYMAN1S = dpmgr.1 dptest.1 dptsv.1 crmgr.1 crtest.1 crtsv.1 rlmgr.1 rltest.1 hvmgr.1 hvtest.1 \
-  cbtest.1 cbcodec.1 vlmgr.1 vltest.1 vltsv.1 odmgr.1 odtest.1 odidx.1 qmttest.1
-MYMAN3S = qdbm.3 depot.3 dpopen.3 curia.3 cropen.3 relic.3 hovel.3 \
-  cabin.3 villa.3 vlopen.3 vista.3 odeum.3 odopen.3
-MYDOCS = spex.html spex-ja.html COPYING ChangeLog NEWS THANKS
-MYPCS = qdbm.pc
-
-# Install destinations
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-MYHEADDIR = @includedir@
-MYLIBDIR = @libdir@
-MYBINDIR = @bindir@
-MYMAN1DIR = @mandir@/man1
-MYMAN3DIR = @mandir@/man3
-MYSHAREDIR = $(prefix)/share/$(PACKAGE)
-MYPCDIR = @libdir@/pkgconfig
-
-# Building binaries
-LIBTOOL = libtool
-CC = gcc
-CFLAGS = -I. -I$(MYHEADDIR) -I$(HOME)/include -I/usr/local/include @MYDEFS@ \
-  -D_XOPEN_SOURCE_EXTENDED=1 -D_GNU_SOURCE=1 -D__EXTENSIONS__=1 -D_HPUX_SOURCE=1 \
-  -D_POSIX_MAPPED_FILES=1 -D_POSIX_SYNCHRONIZED_IO=1 \
-  -DPIC=1 -D_THREAD_SAFE=1 -D_REENTRANT=1 -DNDEBUG -O3
-LD = gcc
-LIBLDFLAGS = -rpath $(MYLIBDIR) -R $(MYLIBDIR) \
-  -version-info $$(($(LIBVER)+$(LIBREV))):0:$(LIBREV) @LIBS@
-LDFLAGS = -rpath $(MYLIBDIR) -R $(MYLIBDIR) -L. -lqdbm @LIBS@
-INSTALL = install
-MKDIR = mkdir -p
-CP = cp -rf
-RM = rm -rf
-
-
-
-#================================================================
-# Suffix rules
-#================================================================
-
-
-.SUFFIXES :
-.SUFFIXES : .c .lo
-
-.c.lo :
-	$(LIBTOOL) --mode=compile --tag=CC $(CC) -c $(CFLAGS) $<
-
-
-
-#================================================================
-# Actions
-#================================================================
-
-
-all : $(MYLIBS) $(MYBINS)
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Ready to install.\n'
-	@printf '#================================================================\n'
-
-
-clean :
-	$(RM) $(MYLIBS) $(MYBINS) *.o *.a *.so *.lo *.la a.out .libs \
-	  *.exe *.dll.a *.dll TAGS srcdoc gmon.out leak.log casket casket.* *~
-
-
-install :
-	$(LIBTOOL) --mode=install $(INSTALL) $(MYHEADS) $(MYHEADDIR)
-	$(LIBTOOL) --mode=install $(INSTALL) $(MYLIBS) $(MYLIBDIR)
-	$(LIBTOOL) --mode=install $(INSTALL) $(MYBINS) $(MYBINDIR)
-	$(MKDIR) $(MYMAN1DIR)
-	cd man && $(CP) $(MYMAN1S) $(MYMAN1DIR)
-	$(MKDIR) $(MYMAN3DIR)
-	cd man && $(CP) $(MYMAN3S) $(MYMAN3DIR)
-	$(MKDIR) $(MYSHAREDIR)
-	$(CP) $(MYDOCS) $(MYSHAREDIR)
-	$(MKDIR) $(MYPCDIR)
-	$(CP) $(MYPCS) $(MYPCDIR)
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Thanks for using QDBM.\n'
-	@printf '#================================================================\n'
-
-
-uninstall :
-	cd $(MYHEADDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYHEADS)
-	cd $(MYLIBDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYLIBS)
-	cd $(MYBINDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYBINS)
-	cd $(MYMAN1DIR) && $(RM) $(MYMAN1S)
-	cd $(MYMAN3DIR) && $(RM) $(MYMAN3S)
-	$(RM) $(MYSHAREDIR)
-	cd $(MYPCDIR) && $(RM) $(MYPCS)
-
-
-distclean : clean
-	$(RM) Makefile LTmakefile rpmspec config.cache config.log config.status autom4te.cache
-
-
-check :
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./dptest write -s casket 500 500000
-	$(LIBTOOL) --mode=execute ./dptest write casket 50000 5000
-	$(LIBTOOL) --mode=execute ./dptest read casket
-	$(LIBTOOL) --mode=execute ./dptest read -wb casket
-	$(LIBTOOL) --mode=execute ./dptest rcat -c casket 50000 50 500 32 8
-	$(LIBTOOL) --mode=execute ./dptest combo casket
-	$(LIBTOOL) --mode=execute ./dptest wicked -c casket 5000
-	$(LIBTOOL) --mode=execute ./dptest wicked casket 500
-	$(LIBTOOL) --mode=execute ./dpmgr repair casket
-	$(LIBTOOL) --mode=execute ./dpmgr optimize casket
-	$(LIBTOOL) --mode=execute ./dpmgr list casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./crtest write -s casket 500 100000 5
-	$(LIBTOOL) --mode=execute ./crtest write casket 50000 500 10
-	$(LIBTOOL) --mode=execute ./crtest read casket
-	$(LIBTOOL) --mode=execute ./crtest read -wb casket
-	$(LIBTOOL) --mode=execute ./crtest rcat -c casket 50000 5 10 500 32 8
-	$(LIBTOOL) --mode=execute ./crtest combo casket
-	$(LIBTOOL) --mode=execute ./crtest wicked -c casket 5000
-	$(LIBTOOL) --mode=execute ./crtest wicked casket 500
-	$(LIBTOOL) --mode=execute ./crmgr repair casket
-	$(LIBTOOL) --mode=execute ./crmgr optimize casket
-	$(LIBTOOL) --mode=execute ./crmgr list casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./crtest write -lob casket 1000 50 10
-	$(LIBTOOL) --mode=execute ./crtest read -lob casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./rltest write casket 5000
-	$(LIBTOOL) --mode=execute ./rltest read casket 5000
-	$(LIBTOOL) --mode=execute ./rlmgr list casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./hvtest write casket 5000
-	$(LIBTOOL) --mode=execute ./hvtest read casket 5000
-	$(LIBTOOL) --mode=execute ./hvmgr optimize casket
-	$(LIBTOOL) --mode=execute ./hvmgr list casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./hvtest write -qdbm -s casket 500
-	$(LIBTOOL) --mode=execute ./hvtest write -qdbm casket 5000
-	$(LIBTOOL) --mode=execute ./hvtest read -qdbm casket 5000
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./cbtest sort 5000
-	$(LIBTOOL) --mode=execute ./cbtest strstr 500
-	$(LIBTOOL) --mode=execute ./cbtest list 50000
-	$(LIBTOOL) --mode=execute ./cbtest list -d 500
-	$(LIBTOOL) --mode=execute ./cbtest map 50000 500
-	$(LIBTOOL) --mode=execute ./cbtest map -d 500 5
-	$(LIBTOOL) --mode=execute ./cbtest heap 50000 500
-	$(LIBTOOL) --mode=execute ./cbtest heap -d 500 50
-	$(LIBTOOL) --mode=execute ./cbtest wicked 5000
-	$(LIBTOOL) --mode=execute ./cbtest misc
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./vltest write -tune 32 31 32 32 casket 50000
-	$(LIBTOOL) --mode=execute ./vltest read casket
-	$(LIBTOOL) --mode=execute ./vltest rdup -tune 32 31 512 256 casket 50000 50000
-	$(LIBTOOL) --mode=execute ./vltest combo casket
-	$(LIBTOOL) --mode=execute ./vltest wicked -c casket 5000
-	$(LIBTOOL) --mode=execute ./vltest wicked casket 500
-	$(LIBTOOL) --mode=execute ./vlmgr repair casket
-	$(LIBTOOL) --mode=execute ./vlmgr optimize casket
-	$(LIBTOOL) --mode=execute ./vlmgr list casket
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./vltest write -int -cz -tune 32 31 32 32 casket 50000
-	$(LIBTOOL) --mode=execute ./vltest read -int -vc casket
-	$(LIBTOOL) --mode=execute ./vltest rdup -int -cz -cc -tune 32 31 512 256 casket 50000 50000
-	$(LIBTOOL) --mode=execute ./vltest combo -cz casket
-	$(LIBTOOL) --mode=execute ./vltest wicked -cz -c casket 5000
-	$(LIBTOOL) --mode=execute ./vltest combo -cy casket
-	$(LIBTOOL) --mode=execute ./vltest wicked -cy -c casket 5000
-	$(LIBTOOL) --mode=execute ./vltest combo -cx casket
-	$(LIBTOOL) --mode=execute ./vltest wicked -cx -c casket 5000
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./odtest write casket 500 50 5000
-	$(LIBTOOL) --mode=execute ./odtest read casket
-	$(LIBTOOL) --mode=execute ./odtest combo casket
-	$(LIBTOOL) --mode=execute ./odtest wicked casket 500
-	$(RM) casket*
-	$(LIBTOOL) --mode=execute ./qmttest casket 50000 10
-	$(RM) casket*
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Checking completed.\n'
-	@printf '#================================================================\n'
-
-
-.PHONY : all clean install check
-
-
-
-#================================================================
-# Building binaries
-#================================================================
-
-
-libqdbm.la : $(MYLIBOBJS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) $(MYLIBOBJS) -o $@ $(LIBLDFLAGS)
-
-
-dpmgr : dpmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dpmgr.lo $(LDFLAGS)
-
-
-dptest : dptest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dptest.lo $(LDFLAGS)
-
-
-dptsv : dptsv.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dptsv.lo $(LDFLAGS)
-
-
-crmgr : crmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crmgr.lo $(LDFLAGS)
-
-
-crtest : crtest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crtest.lo $(LDFLAGS)
-
-
-crtsv : crtsv.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crtsv.lo $(LDFLAGS)
-
-
-rlmgr : rlmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ rlmgr.lo $(LDFLAGS)
-
-
-rltest : rltest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ rltest.lo $(LDFLAGS)
-
-
-hvmgr : hvmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ hvmgr.lo $(LDFLAGS)
-
-
-hvtest : hvtest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ hvtest.lo $(LDFLAGS)
-
-
-cbtest : cbtest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ cbtest.lo $(LDFLAGS)
-
-
-cbcodec : cbcodec.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ cbcodec.lo $(LDFLAGS)
-
-
-vlmgr : vlmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vlmgr.lo $(LDFLAGS)
-
-
-vltest : vltest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vltest.lo $(LDFLAGS)
-
-
-vltsv : vltsv.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vltsv.lo $(LDFLAGS)
-
-
-odmgr : odmgr.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odmgr.lo $(LDFLAGS)
-
-
-odtest : odtest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odtest.lo $(LDFLAGS)
-
-
-odidx : odidx.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odidx.lo $(LDFLAGS)
-
-
-qmttest : qmttest.lo $(MYLIBS)
-	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ qmttest.lo $(LDFLAGS)
-
-
-depot.lo dpmgr.lo dptest.lo dptsv.lo : depot.h myconf.h
-
-curia.lo crmgr.lo crtest.lo crtsv.lo : curia.h depot.h myconf.h
-
-relic.lo rlmgr.lo rltest.lo : relic.h depot.h myconf.h
-
-hovel.lo hvmgr.lo hvtest.lo : hovel.h depot.h curia.h myconf.h
-
-cabin.lo cbtest.lo : cabin.h myconf.h
-
-villa.lo vlmgr.lo vltest.lo vltsv.lo : villa.h depot.h cabin.h myconf.h
-
-vista.lo : vista.h villa.h depot.h curia.h cabin.h myconf.h villa.c
-
-odeum.lo odmgr.lo odtest.lo odidx.lo : odeum.h depot.h curia.h cabin.h villa.h myconf.h
-
-myconf.lo : myconf.h
-
-
-
-# END OF FILE

Copied: box/trunk/qdbm/LTmakefile.in (from rev 2716, box/trunk/qdbm/LTmakefile.in)
===================================================================
--- box/trunk/qdbm/LTmakefile.in	                        (rev 0)
+++ box/trunk/qdbm/LTmakefile.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,318 @@
+# Makefile to build QDBM using libtool
+
+
+
+#================================================================
+# Setting variables
+#================================================================
+
+
+# Generic settings
+SHELL = @SHELL@
+
+# Packaging
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+LIBVER = @LIBVER@
+LIBREV = @LIBREV@
+
+# Targets
+MYHEADS = depot.h curia.h relic.h hovel.h cabin.h villa.h vista.h odeum.h
+MYLIBOBJS = depot.lo curia.lo relic.lo hovel.lo cabin.lo villa.lo vista.lo odeum.lo myconf.lo
+MYLIBS = libqdbm.la
+MYBINS = dpmgr dptest dptsv crmgr crtest crtsv rlmgr rltest hvmgr hvtest \
+  cbtest cbcodec vlmgr vltest vltsv odmgr odtest odidx qmttest
+MYMAN1S = dpmgr.1 dptest.1 dptsv.1 crmgr.1 crtest.1 crtsv.1 rlmgr.1 rltest.1 hvmgr.1 hvtest.1 \
+  cbtest.1 cbcodec.1 vlmgr.1 vltest.1 vltsv.1 odmgr.1 odtest.1 odidx.1 qmttest.1
+MYMAN3S = qdbm.3 depot.3 dpopen.3 curia.3 cropen.3 relic.3 hovel.3 \
+  cabin.3 villa.3 vlopen.3 vista.3 odeum.3 odopen.3
+MYDOCS = spex.html spex-ja.html COPYING ChangeLog NEWS THANKS
+MYPCS = qdbm.pc
+
+# Install destinations
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+MYHEADDIR = @includedir@
+MYLIBDIR = @libdir@
+MYBINDIR = @bindir@
+MYMAN1DIR = @mandir@/man1
+MYMAN3DIR = @mandir@/man3
+MYSHAREDIR = $(prefix)/share/$(PACKAGE)
+MYPCDIR = @libdir@/pkgconfig
+
+# Building binaries
+LIBTOOL = libtool
+CC = gcc
+CFLAGS = -I. -I$(MYHEADDIR) -I$(HOME)/include -I/usr/local/include @MYDEFS@ \
+  -D_XOPEN_SOURCE_EXTENDED=1 -D_GNU_SOURCE=1 -D__EXTENSIONS__=1 -D_HPUX_SOURCE=1 \
+  -D_POSIX_MAPPED_FILES=1 -D_POSIX_SYNCHRONIZED_IO=1 \
+  -DPIC=1 -D_THREAD_SAFE=1 -D_REENTRANT=1 -DNDEBUG -O3
+LD = gcc
+LIBLDFLAGS = -rpath $(MYLIBDIR) -R $(MYLIBDIR) \
+  -version-info $$(($(LIBVER)+$(LIBREV))):0:$(LIBREV) @LIBS@
+LDFLAGS = -rpath $(MYLIBDIR) -R $(MYLIBDIR) -L. -lqdbm @LIBS@
+INSTALL = install
+MKDIR = mkdir -p
+CP = cp -rf
+RM = rm -rf
+
+
+
+#================================================================
+# Suffix rules
+#================================================================
+
+
+.SUFFIXES :
+.SUFFIXES : .c .lo
+
+.c.lo :
+	$(LIBTOOL) --mode=compile --tag=CC $(CC) -c $(CFLAGS) $<
+
+
+
+#================================================================
+# Actions
+#================================================================
+
+
+all : $(MYLIBS) $(MYBINS)
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Ready to install.\n'
+	@printf '#================================================================\n'
+
+
+clean :
+	$(RM) $(MYLIBS) $(MYBINS) *.o *.a *.so *.lo *.la a.out .libs \
+	  *.exe *.dll.a *.dll TAGS srcdoc gmon.out leak.log casket casket.* *~
+
+
+install :
+	$(LIBTOOL) --mode=install $(INSTALL) $(MYHEADS) $(MYHEADDIR)
+	$(LIBTOOL) --mode=install $(INSTALL) $(MYLIBS) $(MYLIBDIR)
+	$(LIBTOOL) --mode=install $(INSTALL) $(MYBINS) $(MYBINDIR)
+	$(MKDIR) $(MYMAN1DIR)
+	cd man && $(CP) $(MYMAN1S) $(MYMAN1DIR)
+	$(MKDIR) $(MYMAN3DIR)
+	cd man && $(CP) $(MYMAN3S) $(MYMAN3DIR)
+	$(MKDIR) $(MYSHAREDIR)
+	$(CP) $(MYDOCS) $(MYSHAREDIR)
+	$(MKDIR) $(MYPCDIR)
+	$(CP) $(MYPCS) $(MYPCDIR)
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Thanks for using QDBM.\n'
+	@printf '#================================================================\n'
+
+
+uninstall :
+	cd $(MYHEADDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYHEADS)
+	cd $(MYLIBDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYLIBS)
+	cd $(MYBINDIR) && $(LIBTOOL) --mode=uninstall $(RM) $(MYBINS)
+	cd $(MYMAN1DIR) && $(RM) $(MYMAN1S)
+	cd $(MYMAN3DIR) && $(RM) $(MYMAN3S)
+	$(RM) $(MYSHAREDIR)
+	cd $(MYPCDIR) && $(RM) $(MYPCS)
+
+
+distclean : clean
+	$(RM) Makefile LTmakefile rpmspec config.cache config.log config.status autom4te.cache
+
+
+check :
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./dptest write -s casket 500 500000
+	$(LIBTOOL) --mode=execute ./dptest write casket 50000 5000
+	$(LIBTOOL) --mode=execute ./dptest read casket
+	$(LIBTOOL) --mode=execute ./dptest read -wb casket
+	$(LIBTOOL) --mode=execute ./dptest rcat -c casket 50000 50 500 32 8
+	$(LIBTOOL) --mode=execute ./dptest combo casket
+	$(LIBTOOL) --mode=execute ./dptest wicked -c casket 5000
+	$(LIBTOOL) --mode=execute ./dptest wicked casket 500
+	$(LIBTOOL) --mode=execute ./dpmgr repair casket
+	$(LIBTOOL) --mode=execute ./dpmgr optimize casket
+	$(LIBTOOL) --mode=execute ./dpmgr list casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./crtest write -s casket 500 100000 5
+	$(LIBTOOL) --mode=execute ./crtest write casket 50000 500 10
+	$(LIBTOOL) --mode=execute ./crtest read casket
+	$(LIBTOOL) --mode=execute ./crtest read -wb casket
+	$(LIBTOOL) --mode=execute ./crtest rcat -c casket 50000 5 10 500 32 8
+	$(LIBTOOL) --mode=execute ./crtest combo casket
+	$(LIBTOOL) --mode=execute ./crtest wicked -c casket 5000
+	$(LIBTOOL) --mode=execute ./crtest wicked casket 500
+	$(LIBTOOL) --mode=execute ./crmgr repair casket
+	$(LIBTOOL) --mode=execute ./crmgr optimize casket
+	$(LIBTOOL) --mode=execute ./crmgr list casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./crtest write -lob casket 1000 50 10
+	$(LIBTOOL) --mode=execute ./crtest read -lob casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./rltest write casket 5000
+	$(LIBTOOL) --mode=execute ./rltest read casket 5000
+	$(LIBTOOL) --mode=execute ./rlmgr list casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./hvtest write casket 5000
+	$(LIBTOOL) --mode=execute ./hvtest read casket 5000
+	$(LIBTOOL) --mode=execute ./hvmgr optimize casket
+	$(LIBTOOL) --mode=execute ./hvmgr list casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./hvtest write -qdbm -s casket 500
+	$(LIBTOOL) --mode=execute ./hvtest write -qdbm casket 5000
+	$(LIBTOOL) --mode=execute ./hvtest read -qdbm casket 5000
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./cbtest sort 5000
+	$(LIBTOOL) --mode=execute ./cbtest strstr 500
+	$(LIBTOOL) --mode=execute ./cbtest list 50000
+	$(LIBTOOL) --mode=execute ./cbtest list -d 500
+	$(LIBTOOL) --mode=execute ./cbtest map 50000 500
+	$(LIBTOOL) --mode=execute ./cbtest map -d 500 5
+	$(LIBTOOL) --mode=execute ./cbtest heap 50000 500
+	$(LIBTOOL) --mode=execute ./cbtest heap -d 500 50
+	$(LIBTOOL) --mode=execute ./cbtest wicked 5000
+	$(LIBTOOL) --mode=execute ./cbtest misc
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./vltest write -tune 32 31 32 32 casket 50000
+	$(LIBTOOL) --mode=execute ./vltest read casket
+	$(LIBTOOL) --mode=execute ./vltest rdup -tune 32 31 512 256 casket 50000 50000
+	$(LIBTOOL) --mode=execute ./vltest combo casket
+	$(LIBTOOL) --mode=execute ./vltest wicked -c casket 5000
+	$(LIBTOOL) --mode=execute ./vltest wicked casket 500
+	$(LIBTOOL) --mode=execute ./vlmgr repair casket
+	$(LIBTOOL) --mode=execute ./vlmgr optimize casket
+	$(LIBTOOL) --mode=execute ./vlmgr list casket
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./vltest write -int -cz -tune 32 31 32 32 casket 50000
+	$(LIBTOOL) --mode=execute ./vltest read -int -vc casket
+	$(LIBTOOL) --mode=execute ./vltest rdup -int -cz -cc -tune 32 31 512 256 casket 50000 50000
+	$(LIBTOOL) --mode=execute ./vltest combo -cz casket
+	$(LIBTOOL) --mode=execute ./vltest wicked -cz -c casket 5000
+	$(LIBTOOL) --mode=execute ./vltest combo -cy casket
+	$(LIBTOOL) --mode=execute ./vltest wicked -cy -c casket 5000
+	$(LIBTOOL) --mode=execute ./vltest combo -cx casket
+	$(LIBTOOL) --mode=execute ./vltest wicked -cx -c casket 5000
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./odtest write casket 500 50 5000
+	$(LIBTOOL) --mode=execute ./odtest read casket
+	$(LIBTOOL) --mode=execute ./odtest combo casket
+	$(LIBTOOL) --mode=execute ./odtest wicked casket 500
+	$(RM) casket*
+	$(LIBTOOL) --mode=execute ./qmttest casket 50000 10
+	$(RM) casket*
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Checking completed.\n'
+	@printf '#================================================================\n'
+
+
+.PHONY : all clean install check
+
+
+
+#================================================================
+# Building binaries
+#================================================================
+
+
+libqdbm.la : $(MYLIBOBJS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) $(MYLIBOBJS) -o $@ $(LIBLDFLAGS)
+
+
+dpmgr : dpmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dpmgr.lo $(LDFLAGS)
+
+
+dptest : dptest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dptest.lo $(LDFLAGS)
+
+
+dptsv : dptsv.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ dptsv.lo $(LDFLAGS)
+
+
+crmgr : crmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crmgr.lo $(LDFLAGS)
+
+
+crtest : crtest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crtest.lo $(LDFLAGS)
+
+
+crtsv : crtsv.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ crtsv.lo $(LDFLAGS)
+
+
+rlmgr : rlmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ rlmgr.lo $(LDFLAGS)
+
+
+rltest : rltest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ rltest.lo $(LDFLAGS)
+
+
+hvmgr : hvmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ hvmgr.lo $(LDFLAGS)
+
+
+hvtest : hvtest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ hvtest.lo $(LDFLAGS)
+
+
+cbtest : cbtest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ cbtest.lo $(LDFLAGS)
+
+
+cbcodec : cbcodec.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ cbcodec.lo $(LDFLAGS)
+
+
+vlmgr : vlmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vlmgr.lo $(LDFLAGS)
+
+
+vltest : vltest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vltest.lo $(LDFLAGS)
+
+
+vltsv : vltsv.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ vltsv.lo $(LDFLAGS)
+
+
+odmgr : odmgr.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odmgr.lo $(LDFLAGS)
+
+
+odtest : odtest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odtest.lo $(LDFLAGS)
+
+
+odidx : odidx.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ odidx.lo $(LDFLAGS)
+
+
+qmttest : qmttest.lo $(MYLIBS)
+	$(LIBTOOL) --mode=link --tag=CC $(LD) -o $@ qmttest.lo $(LDFLAGS)
+
+
+depot.lo dpmgr.lo dptest.lo dptsv.lo : depot.h myconf.h
+
+curia.lo crmgr.lo crtest.lo crtsv.lo : curia.h depot.h myconf.h
+
+relic.lo rlmgr.lo rltest.lo : relic.h depot.h myconf.h
+
+hovel.lo hvmgr.lo hvtest.lo : hovel.h depot.h curia.h myconf.h
+
+cabin.lo cbtest.lo : cabin.h myconf.h
+
+villa.lo vlmgr.lo vltest.lo vltsv.lo : villa.h depot.h cabin.h myconf.h
+
+vista.lo : vista.h villa.h depot.h curia.h cabin.h myconf.h villa.c
+
+odeum.lo odmgr.lo odtest.lo odidx.lo : odeum.h depot.h curia.h cabin.h villa.h myconf.h
+
+myconf.lo : myconf.h
+
+
+
+# END OF FILE

Deleted: box/trunk/qdbm/Makefile.in
===================================================================
--- box/trunk/qdbm/Makefile.in	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/Makefile.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,646 +0,0 @@
-# Makefile for QDBM
-
-
-
-#================================================================
-# Setting variables
-#================================================================
-
-
-# Generic settings
-SHELL = @SHELL@
-srcdir = @srcdir@
-VPATH = @srcdir@
-SUBDIRS = 
-
-# Packaging
-PACKAGE = @PACKAGE_NAME@
-VERSION = @PACKAGE_VERSION@
-PACKAGEDIR = $(PACKAGE)-$(VERSION)
-PACKAGETGZ = $(PACKAGE)-$(VERSION).tar.gz
-LIBVER = @LIBVER@
-LIBREV = @LIBREV@
-
-# Targets
-MYHEADS = depot.h curia.h relic.h hovel.h cabin.h villa.h vista.h odeum.h
-MYLIBOBJS = depot.o curia.o relic.o hovel.o cabin.o villa.o vista.o odeum.o myconf.o
-MYLIBS = libqdbm.a libqdbm.so.$(LIBVER).$(LIBREV).0 libqdbm.so.$(LIBVER) libqdbm.so
-MYBINS = dpmgr dptest dptsv crmgr crtest crtsv rlmgr rltest hvmgr hvtest \
-  cbtest cbcodec vlmgr vltest vltsv odmgr odtest odidx qmttest
-MYMAN1S = dpmgr.1 dptest.1 dptsv.1 crmgr.1 crtest.1 crtsv.1 rlmgr.1 rltest.1 hvmgr.1 hvtest.1 \
-  cbtest.1 cbcodec.1 vlmgr.1 vltest.1 vltsv.1 odmgr.1 odtest.1 odidx.1 qmttest.1
-MYMAN3S = qdbm.3 depot.3 dpopen.3 curia.3 cropen.3 relic.3 hovel.3 \
-  cabin.3 villa.3 vlopen.3 vista.3 odeum.3 odopen.3
-MYDOCS = spex.html spex-ja.html COPYING ChangeLog NEWS THANKS
-MYPCS = qdbm.pc
-MYWINLIBS = libqdbm.a libqdbm.dll.a
-MYMACLIBS = libqdbm.a libqdbm.$(LIBVER).$(LIBREV).0.dylib libqdbm.$(LIBVER).dylib libqdbm.dylib
-MYHPUXLIBS = libqdbm.a libqdbm.sl
-
-# Install destinations
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-MYHEADDIR = @includedir@
-MYLIBDIR = @libdir@
-MYBINDIR = @bindir@
-MYMAN1DIR = @mandir@/man1
-MYMAN3DIR = @mandir@/man3
-MYDATADIR = @datadir@/$(PACKAGE)
-MYPCDIR = @libdir@/pkgconfig
-DESTDIR =
-
-# Building binaries
-CC = @CC@
-CPPFLAGS = @CPPFLAGS@ -I$(srcdir) -I$(MYHEADDIR) \
-  -I$(HOME)/include -I/usr/local/include @MYDEFS@ \
-  -D_XOPEN_SOURCE_EXTENDED=1 -D_GNU_SOURCE=1 -D__EXTENSIONS__=1 -D_HPUX_SOURCE=1 \
-  -D_POSIX_MAPPED_FILES=1 -D_POSIX_SYNCHRONIZED_IO=1 \
-  -DPIC=1 -D_THREAD_SAFE=1 -D_REENTRANT=1 -DNDEBUG
-CFLAGS = @CFLAGS@ -Wall -pedantic -fPIC -fsigned-char -O0 -fforce-addr @MYOPTS@
-LD = @LD@
-LIBS = -lqdbm @LIBS@
-LIBLDFLAGS = @LDFLAGS@ -L. -L$(MYLIBDIR) -L$(HOME)/lib -L/usr/local/lib @LIBS@
-LDFLAGS = @LDFLAGS@ -L. -L$(MYLIBDIR) -L$(HOME)/lib -L/usr/local/lib $(LIBS)
-LDENV = LD_RUN_PATH=/lib:/usr/lib:$(MYLIBDIR):$(HOME)/lib:/usr/local/lib
-AR = @AR@
-ARFLAGS = rcsv
-RUNENV = LD_LIBRARY_PATH=.:/lib:/usr/lib:$(MYLIBDIR):$(HOME)/lib:/usr/local/lib
-
-
-
-#================================================================
-# Suffix rules
-#================================================================
-
-
-.SUFFIXES :
-.SUFFIXES : .c .o
-
-.c.o :
-	$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
-
-
-
-#================================================================
-# Actions
-#================================================================
-
-
-targets : @TARGETS@
-
-
-all : $(MYLIBS) $(MYBINS)
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Ready to install.\n'
-	@printf '#================================================================\n'
-
-
-static :
-	make MYLIBS="$(MYLIBS)" LDFLAGS="-static $(LDFLAGS)" all
-
-
-debug :
-	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
-	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -g" \
-	  LDFLAGS="-static $(LDFLAGS)" all
-
-
-devel :
-	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
-	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -g -pipe" all
-	sync ; sync
-
-
-stable :
-	make MYLIBS="$(MYLIBS)" CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2" all
-
-
-profile :
-	make MYLIBS="$(MYLIBS)" \
-	  CFLAGS="-Wall -pedantic -fPIC -fsigned-char -O3 -pg -g -Werror" \
-	  LDFLAGS="-static $(LDFLAGS)" all
-
-
-unsigned :
-	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
-	  CFLAGS="-Wall -ansi -pedantic -fPIC -funsigned-char -g -O2" all
-
-
-m64 :
-	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
-	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -m64 -g" all
-
-
-pen4 :
-	stdopt="-O3 -fomit-frame-pointer -minline-all-stringops" ; \
-	exopt="-march=pentium4 -minline-all-stringops -fprefetch-loop-arrays" ; \
-	  make MYLIBS="$(MYLIBS)" \
-	    CFLAGS="-Wall -pedantic -fPIC -fsigned-char $$stdopt $$exopt" all
-
-
-k8 :
-	stdopt="-O3 -fomit-frame-pointer -minline-all-stringops" ; \
-	exopt="-march=k8 -minline-all-stringops -fprefetch-loop-arrays" ; \
-	  make MYLIBS="$(MYLIBS)" \
-	    CFLAGS="-Wall -pedantic -fPIC -fsigned-char $$stdopt $$exopt" all
-
-
-clean :
-	rm -rf $(MYLIBS) $(MYBINS) *.o *.a *.so *.lo *.la a.out .libs \
-	  *.exe *.dll.a *.dll *.dylib *.sl TAGS srcdoc gmon.out leak.log \
-	  casket casket.* casket-* *~
-
-
-version :
-	vernum=`expr $(LIBVER)00 + $(LIBREV)` ; \
-	  sed -e 's/_QDBM_VERSION.*/_QDBM_VERSION  "$(VERSION)"/' \
-	    -e "s/_QDBM_LIBVER.*/_QDBM_LIBVER   $$vernum/" depot.h > depot.h~
-	[ -f depot.h~ ] && mv -f depot.h~ depot.h
-
-
-install :
-	mkdir -p $(DESTDIR)$(MYHEADDIR)
-	cd $(srcdir) && cp -Rf $(MYHEADS) $(DESTDIR)$(MYHEADDIR)
-	mkdir -p $(DESTDIR)$(MYLIBDIR)
-	cp -Rf $(MYLIBS) $(DESTDIR)$(MYLIBDIR)
-	mkdir -p $(DESTDIR)$(MYBINDIR)
-	cp -Rf $(MYBINS) $(DESTDIR)$(MYBINDIR)
-	mkdir -p $(DESTDIR)$(MYMAN1DIR)
-	cd $(srcdir)/man && cp -Rf $(MYMAN1S) $(DESTDIR)$(MYMAN1DIR)
-	mkdir -p $(DESTDIR)$(MYMAN3DIR)
-	cd $(srcdir)/man && cp -Rf $(MYMAN3S) $(DESTDIR)$(MYMAN3DIR)
-	mkdir -p $(DESTDIR)$(MYDATADIR)
-	cd $(srcdir) && cp -Rf $(MYDOCS) $(DESTDIR)$(MYDATADIR)
-	mkdir -p $(DESTDIR)$(MYPCDIR)
-	cd $(srcdir) && cp -Rf $(MYPCS) $(DESTDIR)$(MYPCDIR)
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Thanks for using QDBM.\n'
-	@printf '#================================================================\n'
-
-
-install-strip :
-	make DESTDIR=$(DESTDIR) install
-	cd $(DESTDIR)$(MYBINDIR) && strip $(MYBINS)
-
-
-uninstall :
-	cd $(DESTDIR)$(MYHEADDIR) && rm -f $(MYHEADS)
-	cd $(DESTDIR)$(MYLIBDIR) && rm -f $(MYLIBS)
-	cd $(DESTDIR)$(MYBINDIR) && rm -f $(MYBINS)
-	cd $(DESTDIR)$(MYMAN1DIR) && rm -f $(MYMAN1S)
-	cd $(DESTDIR)$(MYMAN3DIR) && rm -f $(MYMAN3S)
-	rm -rf $(DESTDIR)$(MYDATADIR)
-	cd $(DESTDIR)$(MYPCDIR) && rm -f $(MYPCS)
-
-
-dist :
-	sync ; sync
-	for dir in $(SUBDIRS) ; \
-	  do \
-	    if [ -d $$dir ] ; \
-	    then \
-	      echo Making $@ in $$dir ; \
-	      ( cd $$dir && if [ -f configure.in ] ; then autoconf ; ./configure ; \
-	        make dist ; fi ) ; \
-	    fi ; \
-	  done
-	make version
-	make distclean
-	cd .. && tar cvf - $(PACKAGEDIR) | gzip -c > $(PACKAGETGZ)
-	sync ; sync
-
-
-distclean : clean
-	for dir in $(SUBDIRS) ; \
-	  do \
-	    if [ -d $$dir ] ; \
-	    then \
-	      echo Making $@ in $$dir ; \
-	      ( cd $$dir && if [ -f Makefile ] ; then make distclean ; fi ) ; \
-	    fi ; \
-	  done
-	rm -rf Makefile LTmakefile qdbm.spec qdbm.pc config.cache config.log config.status \
-	  autom4te.cache rpm-tmp *-win32
-
-
-TAGS :
-	etags -o $@ *.c *.h
-
-
-sdoc :
-	rm -rf srcdoc
-	./lab/ccdoc -d srcdoc -t "Source Documents of QDBM" *.h *.c
-
-
-check :
-	sync ; sync
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./dptest write -s casket 500 500000
-	$(RUNENV) $(RUNCMD) ./dptest write casket 50000 5000
-	$(RUNENV) $(RUNCMD) ./dptest read casket
-	$(RUNENV) $(RUNCMD) ./dptest read -wb casket
-	$(RUNENV) $(RUNCMD) ./dptest rcat -c casket 50000 50 500 32 8
-	$(RUNENV) $(RUNCMD) ./dptest combo casket
-	$(RUNENV) $(RUNCMD) ./dptest wicked -c casket 5000
-	$(RUNENV) $(RUNCMD) ./dptest wicked casket 500
-	$(RUNENV) $(RUNCMD) ./dpmgr repair casket
-	$(RUNENV) $(RUNCMD) ./dpmgr optimize casket
-	$(RUNENV) $(RUNCMD) ./dpmgr list casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./crtest write -s casket 500 100000 5
-	$(RUNENV) $(RUNCMD) ./crtest write casket 50000 500 10
-	$(RUNENV) $(RUNCMD) ./crtest read casket
-	$(RUNENV) $(RUNCMD) ./crtest read -wb casket
-	$(RUNENV) $(RUNCMD) ./crtest rcat -c casket 50000 5 10 500 32 8
-	$(RUNENV) $(RUNCMD) ./crtest combo casket
-	$(RUNENV) $(RUNCMD) ./crtest wicked -c casket 5000
-	$(RUNENV) $(RUNCMD) ./crtest wicked casket 500
-	$(RUNENV) $(RUNCMD) ./crmgr repair casket
-	$(RUNENV) $(RUNCMD) ./crmgr optimize casket
-	$(RUNENV) $(RUNCMD) ./crmgr list casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./crtest write -lob casket 1000 50 10
-	$(RUNENV) $(RUNCMD) ./crtest read -lob casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./rltest write casket 5000
-	$(RUNENV) $(RUNCMD) ./rltest read casket 5000
-	$(RUNENV) $(RUNCMD) ./rlmgr list casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./hvtest write casket 5000
-	$(RUNENV) $(RUNCMD) ./hvtest read casket 5000
-	$(RUNENV) $(RUNCMD) ./hvmgr optimize casket
-	$(RUNENV) $(RUNCMD) ./hvmgr list casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./hvtest write -qdbm -s casket 500
-	$(RUNENV) $(RUNCMD) ./hvtest write -qdbm casket 5000
-	$(RUNENV) $(RUNCMD) ./hvtest read -qdbm casket 5000
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./cbtest sort 5000
-	$(RUNENV) $(RUNCMD) ./cbtest strstr 500
-	$(RUNENV) $(RUNCMD) ./cbtest list 50000
-	$(RUNENV) $(RUNCMD) ./cbtest list -d 500
-	$(RUNENV) $(RUNCMD) ./cbtest map 50000 500
-	$(RUNENV) $(RUNCMD) ./cbtest map -d 500 5
-	$(RUNENV) $(RUNCMD) ./cbtest heap 50000 500
-	$(RUNENV) $(RUNCMD) ./cbtest heap -d 500 50
-	$(RUNENV) $(RUNCMD) ./cbtest wicked 5000
-	$(RUNENV) $(RUNCMD) ./cbtest misc
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./vltest write -tune 32 31 32 32 casket 50000
-	$(RUNENV) $(RUNCMD) ./vltest read casket
-	$(RUNENV) $(RUNCMD) ./vltest rdup -tune 32 31 512 256 casket 50000 50000
-	$(RUNENV) $(RUNCMD) ./vltest combo casket
-	$(RUNENV) $(RUNCMD) ./vltest wicked -c casket 5000
-	$(RUNENV) $(RUNCMD) ./vltest wicked casket 500
-	$(RUNENV) $(RUNCMD) ./vlmgr repair casket
-	$(RUNENV) $(RUNCMD) ./vlmgr optimize casket
-	$(RUNENV) $(RUNCMD) ./vlmgr list casket
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./vltest write -int -cz -tune 32 31 32 32 casket 50000
-	$(RUNENV) $(RUNCMD) ./vltest read -int -vc casket
-	$(RUNENV) $(RUNCMD) ./vltest rdup -int -cz -cc -tune 32 31 512 256 casket 50000 50000
-	$(RUNENV) $(RUNCMD) ./vltest combo -cz casket
-	$(RUNENV) $(RUNCMD) ./vltest wicked -cz -c casket 5000
-	$(RUNENV) $(RUNCMD) ./vltest combo -cy casket
-	$(RUNENV) $(RUNCMD) ./vltest wicked -cy -c casket 5000
-	$(RUNENV) $(RUNCMD) ./vltest combo -cx casket
-	$(RUNENV) $(RUNCMD) ./vltest wicked -cx -c casket 5000
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./odtest write casket 500 50 5000
-	$(RUNENV) $(RUNCMD) ./odtest read casket
-	$(RUNENV) $(RUNCMD) ./odtest combo casket
-	$(RUNENV) $(RUNCMD) ./odtest wicked casket 500
-	rm -rf casket*
-	$(RUNENV) $(RUNCMD) ./qmttest casket 50000 10
-	rm -rf casket*
-	@printf '\n'
-	@printf '#================================================================\n'
-	@printf '# Checking completed.\n'
-	@printf '#================================================================\n'
-
-
-check-valgrind :
-	make RUNCMD="valgrind --tool=memcheck --log-fd=1" check | tee leak.log
-	grep ERROR leak.log
-	grep 'at exit' leak.log
-
-
-world :
-	make clean ; make
-	cd plus ; [ -f Makefile ] || ./configure ; make clean ; make
-	cd java ; [ -f Makefile ] || ./configure ; make clean ; make
-	cd perl ; [ -f Makefile ] || ./configure ; make clean ; make
-	cd ruby ; [ -f Makefile ] || ./configure ; make clean ; make
-	cd cgi ; [ -f Makefile ] || ./configure ; make clean ; make
-
-
-install-world :
-	make install
-	cd plus ; [ -f Makefile ] || ./configure ; make install
-	cd java ; [ -f Makefile ] || ./configure ; make install
-	cd perl ; [ -f Makefile ] || ./configure ; make install
-	cd ruby ; [ -f Makefile ] || ./configure ; make install
-	cd cgi ; [ -f Makefile ] || ./configure ; make install
-
-
-uninstall-world :
-	make uninstall
-	cd plus ; [ -f Makefile ] || ./configure ; make uninstall
-	cd java ; [ -f Makefile ] || ./configure ; make uninstall
-	cd perl ; [ -f Makefile ] || ./configure ; make uninstall
-	cd ruby ; [ -f Makefile ] || ./configure ; make uninstall
-	cd cgi ; [ -f Makefile ] || ./configure ; make uninstall
-
-
-check-world :
-	make check
-	cd plus ; [ -f Makefile ] || ./configure ; make check
-	cd java ; [ -f Makefile ] || ./configure ; make check
-	cd perl ; [ -f Makefile ] || ./configure ; make check
-	cd ruby ; [ -f Makefile ] || ./configure ; make check
-
-
-rpm : ../$(PACKAGETGZ) qdbm.spec
-	mkdir -p rpm-tmp/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
-	mkdir -p rpm-tmp/RPMS/i386
-	cp ../$(PACKAGETGZ) rpm-tmp/SOURCES
-	rpmbuild -bb --target i386 --define "_topdir `pwd`/rpm-tmp" qdbm.spec
-	mv -f rpm-tmp/RPMS/i386/$(PACKAGE)-*$(VERSION)*.rpm ..
-	rm -rf rpm-tmp
-
-
-win32pkg :
-	test -f /bin/mgwz.dll
-	test -f /bin/libiconv-2.dll
-	make uninstall && make uninstall-win && make clean
-	make mingw && strip *.exe && make install-win
-	cd java && ./configure
-	cd java && make uninstall && make uninstall-win && make clean
-	cd java && make mingw
-	cd cgi && ./configure
-	cd cgi && make clean
-	cd cgi && make mingw && strip *.cgi
-	mkdir -p $(PACKAGE)-$(VERSION)-win32
-	cp -Rf $(MYHEADS) libqdbm.dll.a qdbm.dll *.exe *.html \
-	  misc/README-win32.txt misc/COPYING.txt misc/win32check.bat \
-	  /bin/mgwz.dll /bin/libiconv-2.dll \
-	  $(PACKAGE)-$(VERSION)-win32
-	cp -Rf java/jqdbm.dll java/qdbm.jar java/*.html java/japidoc $(PACKAGE)-$(VERSION)-win32
-	mkdir -p $(PACKAGE)-$(VERSION)-win32/cgi
-	cp -Rf cgi/*.cgi cgi/*.conf cgi/*.html $(PACKAGE)-$(VERSION)-win32/cgi
-	zip -r $(PACKAGE)-$(VERSION)-win32.zip $(PACKAGE)-$(VERSION)-win32
-	mv -f $(PACKAGE)-$(VERSION)-win32.zip ..
-	rm -rf $(PACKAGE)-$(VERSION)-win32
-	make uninstall && make uninstall-win && make clean
-	cd java ; make uninstall && make uninstall-win && make clean
-
-
-win :
-	make MYLIBS="$(MYWINLIBS)" CFLAGS="-Wall -ansi -pedantic -fsigned-char -O2"
-
-
-mingw :
-	make CC="gcc -mno-cygwin" MYLIBS="$(MYWINLIBS)" \
-	  CFLAGS="-Wall -fsigned-char -O2" LIBLDFLAGS="@MGWLIBS@" LDFLAGS="-L. -lqdbm @MGWLIBS@"
-
-
-check-win :
-	make check
-
-
-install-win :
-	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
-	  MYLIBS="$(MYWINLIBS)" install
-	cp -Rf qdbm.dll $(DESTDIR)$(MYBINDIR)
-
-
-uninstall-win :
-	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
-	  MYLIBS="$(MYWINLIBS)" uninstall
-	rm -f $(DESTDIR)$(MYBINDIR)/qdbm.dll
-
-
-def : libqdbm.a
-	./misc/makevcdef libqdbm.a > qdbm.def
-
-
-mac :
-	make MYLIBS="$(MYMACLIBS)" CFLAGS="-Wall -fsigned-char -fno-common -O2"
-
-
-check-mac :
-	make RUNENV="DYLD_LIBRARY_PATH=." check
-
-
-install-mac :
-	make MYLIBS="$(MYMACLIBS)" install
-
-
-uninstall-mac :
-	make MYLIBS="$(MYMACLIBS)" uninstall
-
-
-hpux :
-	make MYLIBS="$(MYHPUXLIBS)"
-
-
-check-hpux :
-	make RUNENV="SHLIB_PATH=." check
-
-
-install-hpux :
-	make MYLIBS="$(MYHPUXLIBS)" install
-
-
-uninstall-hpux :
-	make MYLIBS="$(MYHPUXLIBS)" uninstall
-
-
-no-so :
-	make MYLIBS="libqdbm.a" all
-
-
-install-no-so :
-	make MYLIBS="libqdbm.a" install
-
-
-uninstall-no-so :
-	make MYLIBS="libqdbm.a" uninstall
-
-
-.PHONY : all clean install check
-
-
-
-#================================================================
-# Building binaries
-#================================================================
-
-
-libqdbm.a : $(MYLIBOBJS)
-	$(AR) $(ARFLAGS) $@ $(MYLIBOBJS)
-
-
-libqdbm.so.$(LIBVER).$(LIBREV).0 : $(MYLIBOBJS)
-	if uname -a | egrep -i 'SunOS' > /dev/null ; \
-	  then \
-	    $(CC) -shared -Wl,-G,-h,libqdbm.so.$(LIBVER) -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
-	  else \
-	    $(CC) -shared -Wl,-soname,libqdbm.so.$(LIBVER) -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
-	  fi
-
-
-libqdbm.so.$(LIBVER) : libqdbm.so.$(LIBVER).$(LIBREV).0
-	ln -f -s libqdbm.so.$(LIBVER).$(LIBREV).0 $@
-
-
-libqdbm.so : libqdbm.so.$(LIBVER).$(LIBREV).0
-	ln -f -s libqdbm.so.$(LIBVER).$(LIBREV).0 $@
-
-
-libqdbm.dll.a : qdbm.dll
-
-
-qdbm.dll : $(MYLIBOBJS)
-	$(CC) -shared -o $@ \
-	  -Wl,--out-implib=lib$@.a \
-	  -Wl,--export-all-symbols \
-	  -Wl,--enable-auto-import \
-	  -Wl,--add-stdcall-alias \
-	  -Wl,--whole-archive \
-	  -Wl,--no-whole-archive $(MYLIBOBJS) $(LIBLDFLAGS)
-
-
-libqdbm.$(LIBVER).$(LIBREV).0.dylib : $(MYLIBOBJS)
-	$(CC) -dynamiclib -o $@ \
-	  -install_name $(MYLIBDIR)/libqdbm.$(LIBVER).dylib \
-	  -current_version $(LIBVER).$(LIBREV).0 \
-	  -compatibility_version $(LIBVER) \
-	  $(MYLIBOBJS) $(LIBLDFLAGS)
-
-
-libqdbm.$(LIBVER).dylib : libqdbm.$(LIBVER).$(LIBREV).0.dylib
-	ln -f -s libqdbm.$(LIBVER).$(LIBREV).0.dylib $@
-
-
-libqdbm.dylib : libqdbm.$(LIBVER).$(LIBREV).0.dylib
-	ln -f -s libqdbm.$(LIBVER).$(LIBREV).0.dylib $@
-
-
-libqdbm.sl : $(MYLIBOBJS)
-	$(CC) -shared -Wl,-b -o $@ $(MYLIBOBJS) $(LIBLDFLAGS)
-
-
-dpmgr : dpmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ dpmgr.o $(LDFLAGS)
-
-
-dptest : dptest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ dptest.o $(LDFLAGS)
-
-
-dptsv : dptsv.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ dptsv.o $(LDFLAGS)
-
-
-crmgr : crmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ crmgr.o $(LDFLAGS)
-
-
-crtest : crtest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ crtest.o $(LDFLAGS)
-
-
-crtsv : crtsv.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ crtsv.o $(LDFLAGS)
-
-
-rlmgr : rlmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ rlmgr.o $(LDFLAGS)
-
-
-rltest : rltest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ rltest.o $(LDFLAGS)
-
-
-hvmgr : hvmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ hvmgr.o $(LDFLAGS)
-
-
-hvtest : hvtest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ hvtest.o $(LDFLAGS)
-
-
-cbtest : cbtest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ cbtest.o $(LDFLAGS)
-
-
-cbcodec : cbcodec.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ cbcodec.o $(LDFLAGS)
-
-
-vlmgr : vlmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ vlmgr.o $(LDFLAGS)
-
-
-vltest : vltest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ vltest.o $(LDFLAGS)
-
-
-vltsv : vltsv.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ vltsv.o $(LDFLAGS)
-
-
-odmgr : odmgr.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ odmgr.o $(LDFLAGS)
-
-
-odtest : odtest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ odtest.o $(LDFLAGS)
-
-
-odidx : odidx.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ odidx.o $(LDFLAGS)
-
-
-qmttest : qmttest.o $(MYLIBS)
-	$(LDENV) $(CC) $(CFLAGS) -o $@ qmttest.o $(LDFLAGS)
-
-
-depot.o : depot.h myconf.h
-
-curia.o : depot.h curia.h myconf.h
-
-relic.o : depot.h relic.h myconf.h
-
-hovel.o : depot.h curia.h hovel.h myconf.h
-
-cabin.o : cabin.h myconf.h
-
-villa.o : depot.h cabin.h villa.h myconf.h
-
-vista.o : depot.h curia.h cabin.h villa.h vista.h myconf.h villa.c
-
-odeum.o : depot.h curia.h cabin.h villa.h myconf.h
-
-myconf.o : myconf.h
-
-dpmgr.o dptest.o dptsv.o : depot.h cabin.h
-
-crmgr.o crtest.o crtsv.o : depot.h curia.h cabin.h
-
-rlmgr.o rltest.o : depot.h relic.h cabin.h
-
-hvmgr.o hvtest.o : depot.h curia.h hovel.h cabin.h
-
-cbtest.o cbcodec.o : cabin.h
-
-vlmgr.o vltest.o vltsv.o : depot.h cabin.h villa.h
-
-odmgr.o odtest.o odidx.o : depot.h curia.h cabin.h villa.h odeum.h
-
-
-
-# END OF FILE

Copied: box/trunk/qdbm/Makefile.in (from rev 2716, box/trunk/qdbm/Makefile.in)
===================================================================
--- box/trunk/qdbm/Makefile.in	                        (rev 0)
+++ box/trunk/qdbm/Makefile.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,646 @@
+# Makefile for QDBM
+
+
+
+#================================================================
+# Setting variables
+#================================================================
+
+
+# Generic settings
+SHELL = @SHELL@
+srcdir = @srcdir@
+VPATH = @srcdir@
+SUBDIRS = 
+
+# Packaging
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+PACKAGEDIR = $(PACKAGE)-$(VERSION)
+PACKAGETGZ = $(PACKAGE)-$(VERSION).tar.gz
+LIBVER = @LIBVER@
+LIBREV = @LIBREV@
+
+# Targets
+MYHEADS = depot.h curia.h relic.h hovel.h cabin.h villa.h vista.h odeum.h
+MYLIBOBJS = depot.o curia.o relic.o hovel.o cabin.o villa.o vista.o odeum.o myconf.o
+MYLIBS = libqdbm.a libqdbm.so.$(LIBVER).$(LIBREV).0 libqdbm.so.$(LIBVER) libqdbm.so
+MYBINS = dpmgr dptest dptsv crmgr crtest crtsv rlmgr rltest hvmgr hvtest \
+  cbtest cbcodec vlmgr vltest vltsv odmgr odtest odidx qmttest
+MYMAN1S = dpmgr.1 dptest.1 dptsv.1 crmgr.1 crtest.1 crtsv.1 rlmgr.1 rltest.1 hvmgr.1 hvtest.1 \
+  cbtest.1 cbcodec.1 vlmgr.1 vltest.1 vltsv.1 odmgr.1 odtest.1 odidx.1 qmttest.1
+MYMAN3S = qdbm.3 depot.3 dpopen.3 curia.3 cropen.3 relic.3 hovel.3 \
+  cabin.3 villa.3 vlopen.3 vista.3 odeum.3 odopen.3
+MYDOCS = spex.html spex-ja.html COPYING ChangeLog NEWS THANKS
+MYPCS = qdbm.pc
+MYWINLIBS = libqdbm.a libqdbm.dll.a
+MYMACLIBS = libqdbm.a libqdbm.$(LIBVER).$(LIBREV).0.dylib libqdbm.$(LIBVER).dylib libqdbm.dylib
+MYHPUXLIBS = libqdbm.a libqdbm.sl
+
+# Install destinations
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+MYHEADDIR = @includedir@
+MYLIBDIR = @libdir@
+MYBINDIR = @bindir@
+MYMAN1DIR = @mandir@/man1
+MYMAN3DIR = @mandir@/man3
+MYDATADIR = @datadir@/$(PACKAGE)
+MYPCDIR = @libdir@/pkgconfig
+DESTDIR =
+
+# Building binaries
+CC = @CC@
+CPPFLAGS = @CPPFLAGS@ -I$(srcdir) -I$(MYHEADDIR) \
+  -I$(HOME)/include -I/usr/local/include @MYDEFS@ \
+  -D_XOPEN_SOURCE_EXTENDED=1 -D_GNU_SOURCE=1 -D__EXTENSIONS__=1 -D_HPUX_SOURCE=1 \
+  -D_POSIX_MAPPED_FILES=1 -D_POSIX_SYNCHRONIZED_IO=1 \
+  -DPIC=1 -D_THREAD_SAFE=1 -D_REENTRANT=1 -DNDEBUG
+CFLAGS = @CFLAGS@ -Wall -pedantic -fPIC -fsigned-char -O0 -fforce-addr @MYOPTS@
+LD = @LD@
+LIBS = -lqdbm @LIBS@
+LIBLDFLAGS = @LDFLAGS@ -L. -L$(MYLIBDIR) -L$(HOME)/lib -L/usr/local/lib @LIBS@
+LDFLAGS = @LDFLAGS@ -L. -L$(MYLIBDIR) -L$(HOME)/lib -L/usr/local/lib $(LIBS)
+LDENV = LD_RUN_PATH=/lib:/usr/lib:$(MYLIBDIR):$(HOME)/lib:/usr/local/lib
+AR = @AR@
+ARFLAGS = rcsv
+RUNENV = LD_LIBRARY_PATH=.:/lib:/usr/lib:$(MYLIBDIR):$(HOME)/lib:/usr/local/lib
+
+
+
+#================================================================
+# Suffix rules
+#================================================================
+
+
+.SUFFIXES :
+.SUFFIXES : .c .o
+
+.c.o :
+	$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
+
+
+
+#================================================================
+# Actions
+#================================================================
+
+
+targets : @TARGETS@
+
+
+all : $(MYLIBS) $(MYBINS)
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Ready to install.\n'
+	@printf '#================================================================\n'
+
+
+static :
+	make MYLIBS="$(MYLIBS)" LDFLAGS="-static $(LDFLAGS)" all
+
+
+debug :
+	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
+	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -g" \
+	  LDFLAGS="-static $(LDFLAGS)" all
+
+
+devel :
+	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
+	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -g -pipe" all
+	sync ; sync
+
+
+stable :
+	make MYLIBS="$(MYLIBS)" CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2" all
+
+
+profile :
+	make MYLIBS="$(MYLIBS)" \
+	  CFLAGS="-Wall -pedantic -fPIC -fsigned-char -O3 -pg -g -Werror" \
+	  LDFLAGS="-static $(LDFLAGS)" all
+
+
+unsigned :
+	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
+	  CFLAGS="-Wall -ansi -pedantic -fPIC -funsigned-char -g -O2" all
+
+
+m64 :
+	make MYLIBS="$(MYLIBS)" CPPFLAGS="$(CPPFLAGS) -UNDEBUG" \
+	  CFLAGS="-Wall -ansi -pedantic -fPIC -fsigned-char -O2 -m64 -g" all
+
+
+pen4 :
+	stdopt="-O3 -fomit-frame-pointer -minline-all-stringops" ; \
+	exopt="-march=pentium4 -minline-all-stringops -fprefetch-loop-arrays" ; \
+	  make MYLIBS="$(MYLIBS)" \
+	    CFLAGS="-Wall -pedantic -fPIC -fsigned-char $$stdopt $$exopt" all
+
+
+k8 :
+	stdopt="-O3 -fomit-frame-pointer -minline-all-stringops" ; \
+	exopt="-march=k8 -minline-all-stringops -fprefetch-loop-arrays" ; \
+	  make MYLIBS="$(MYLIBS)" \
+	    CFLAGS="-Wall -pedantic -fPIC -fsigned-char $$stdopt $$exopt" all
+
+
+clean :
+	rm -rf $(MYLIBS) $(MYBINS) *.o *.a *.so *.lo *.la a.out .libs \
+	  *.exe *.dll.a *.dll *.dylib *.sl TAGS srcdoc gmon.out leak.log \
+	  casket casket.* casket-* *~
+
+
+version :
+	vernum=`expr $(LIBVER)00 + $(LIBREV)` ; \
+	  sed -e 's/_QDBM_VERSION.*/_QDBM_VERSION  "$(VERSION)"/' \
+	    -e "s/_QDBM_LIBVER.*/_QDBM_LIBVER   $$vernum/" depot.h > depot.h~
+	[ -f depot.h~ ] && mv -f depot.h~ depot.h
+
+
+install :
+	mkdir -p $(DESTDIR)$(MYHEADDIR)
+	cd $(srcdir) && cp -Rf $(MYHEADS) $(DESTDIR)$(MYHEADDIR)
+	mkdir -p $(DESTDIR)$(MYLIBDIR)
+	cp -Rf $(MYLIBS) $(DESTDIR)$(MYLIBDIR)
+	mkdir -p $(DESTDIR)$(MYBINDIR)
+	cp -Rf $(MYBINS) $(DESTDIR)$(MYBINDIR)
+	mkdir -p $(DESTDIR)$(MYMAN1DIR)
+	cd $(srcdir)/man && cp -Rf $(MYMAN1S) $(DESTDIR)$(MYMAN1DIR)
+	mkdir -p $(DESTDIR)$(MYMAN3DIR)
+	cd $(srcdir)/man && cp -Rf $(MYMAN3S) $(DESTDIR)$(MYMAN3DIR)
+	mkdir -p $(DESTDIR)$(MYDATADIR)
+	cd $(srcdir) && cp -Rf $(MYDOCS) $(DESTDIR)$(MYDATADIR)
+	mkdir -p $(DESTDIR)$(MYPCDIR)
+	cd $(srcdir) && cp -Rf $(MYPCS) $(DESTDIR)$(MYPCDIR)
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Thanks for using QDBM.\n'
+	@printf '#================================================================\n'
+
+
+install-strip :
+	make DESTDIR=$(DESTDIR) install
+	cd $(DESTDIR)$(MYBINDIR) && strip $(MYBINS)
+
+
+uninstall :
+	cd $(DESTDIR)$(MYHEADDIR) && rm -f $(MYHEADS)
+	cd $(DESTDIR)$(MYLIBDIR) && rm -f $(MYLIBS)
+	cd $(DESTDIR)$(MYBINDIR) && rm -f $(MYBINS)
+	cd $(DESTDIR)$(MYMAN1DIR) && rm -f $(MYMAN1S)
+	cd $(DESTDIR)$(MYMAN3DIR) && rm -f $(MYMAN3S)
+	rm -rf $(DESTDIR)$(MYDATADIR)
+	cd $(DESTDIR)$(MYPCDIR) && rm -f $(MYPCS)
+
+
+dist :
+	sync ; sync
+	for dir in $(SUBDIRS) ; \
+	  do \
+	    if [ -d $$dir ] ; \
+	    then \
+	      echo Making $@ in $$dir ; \
+	      ( cd $$dir && if [ -f configure.in ] ; then autoconf ; ./configure ; \
+	        make dist ; fi ) ; \
+	    fi ; \
+	  done
+	make version
+	make distclean
+	cd .. && tar cvf - $(PACKAGEDIR) | gzip -c > $(PACKAGETGZ)
+	sync ; sync
+
+
+distclean : clean
+	for dir in $(SUBDIRS) ; \
+	  do \
+	    if [ -d $$dir ] ; \
+	    then \
+	      echo Making $@ in $$dir ; \
+	      ( cd $$dir && if [ -f Makefile ] ; then make distclean ; fi ) ; \
+	    fi ; \
+	  done
+	rm -rf Makefile LTmakefile qdbm.spec qdbm.pc config.cache config.log config.status \
+	  autom4te.cache rpm-tmp *-win32
+
+
+TAGS :
+	etags -o $@ *.c *.h
+
+
+sdoc :
+	rm -rf srcdoc
+	./lab/ccdoc -d srcdoc -t "Source Documents of QDBM" *.h *.c
+
+
+check :
+	sync ; sync
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./dptest write -s casket 500 500000
+	$(RUNENV) $(RUNCMD) ./dptest write casket 50000 5000
+	$(RUNENV) $(RUNCMD) ./dptest read casket
+	$(RUNENV) $(RUNCMD) ./dptest read -wb casket
+	$(RUNENV) $(RUNCMD) ./dptest rcat -c casket 50000 50 500 32 8
+	$(RUNENV) $(RUNCMD) ./dptest combo casket
+	$(RUNENV) $(RUNCMD) ./dptest wicked -c casket 5000
+	$(RUNENV) $(RUNCMD) ./dptest wicked casket 500
+	$(RUNENV) $(RUNCMD) ./dpmgr repair casket
+	$(RUNENV) $(RUNCMD) ./dpmgr optimize casket
+	$(RUNENV) $(RUNCMD) ./dpmgr list casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./crtest write -s casket 500 100000 5
+	$(RUNENV) $(RUNCMD) ./crtest write casket 50000 500 10
+	$(RUNENV) $(RUNCMD) ./crtest read casket
+	$(RUNENV) $(RUNCMD) ./crtest read -wb casket
+	$(RUNENV) $(RUNCMD) ./crtest rcat -c casket 50000 5 10 500 32 8
+	$(RUNENV) $(RUNCMD) ./crtest combo casket
+	$(RUNENV) $(RUNCMD) ./crtest wicked -c casket 5000
+	$(RUNENV) $(RUNCMD) ./crtest wicked casket 500
+	$(RUNENV) $(RUNCMD) ./crmgr repair casket
+	$(RUNENV) $(RUNCMD) ./crmgr optimize casket
+	$(RUNENV) $(RUNCMD) ./crmgr list casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./crtest write -lob casket 1000 50 10
+	$(RUNENV) $(RUNCMD) ./crtest read -lob casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./rltest write casket 5000
+	$(RUNENV) $(RUNCMD) ./rltest read casket 5000
+	$(RUNENV) $(RUNCMD) ./rlmgr list casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./hvtest write casket 5000
+	$(RUNENV) $(RUNCMD) ./hvtest read casket 5000
+	$(RUNENV) $(RUNCMD) ./hvmgr optimize casket
+	$(RUNENV) $(RUNCMD) ./hvmgr list casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./hvtest write -qdbm -s casket 500
+	$(RUNENV) $(RUNCMD) ./hvtest write -qdbm casket 5000
+	$(RUNENV) $(RUNCMD) ./hvtest read -qdbm casket 5000
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./cbtest sort 5000
+	$(RUNENV) $(RUNCMD) ./cbtest strstr 500
+	$(RUNENV) $(RUNCMD) ./cbtest list 50000
+	$(RUNENV) $(RUNCMD) ./cbtest list -d 500
+	$(RUNENV) $(RUNCMD) ./cbtest map 50000 500
+	$(RUNENV) $(RUNCMD) ./cbtest map -d 500 5
+	$(RUNENV) $(RUNCMD) ./cbtest heap 50000 500
+	$(RUNENV) $(RUNCMD) ./cbtest heap -d 500 50
+	$(RUNENV) $(RUNCMD) ./cbtest wicked 5000
+	$(RUNENV) $(RUNCMD) ./cbtest misc
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./vltest write -tune 32 31 32 32 casket 50000
+	$(RUNENV) $(RUNCMD) ./vltest read casket
+	$(RUNENV) $(RUNCMD) ./vltest rdup -tune 32 31 512 256 casket 50000 50000
+	$(RUNENV) $(RUNCMD) ./vltest combo casket
+	$(RUNENV) $(RUNCMD) ./vltest wicked -c casket 5000
+	$(RUNENV) $(RUNCMD) ./vltest wicked casket 500
+	$(RUNENV) $(RUNCMD) ./vlmgr repair casket
+	$(RUNENV) $(RUNCMD) ./vlmgr optimize casket
+	$(RUNENV) $(RUNCMD) ./vlmgr list casket
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./vltest write -int -cz -tune 32 31 32 32 casket 50000
+	$(RUNENV) $(RUNCMD) ./vltest read -int -vc casket
+	$(RUNENV) $(RUNCMD) ./vltest rdup -int -cz -cc -tune 32 31 512 256 casket 50000 50000
+	$(RUNENV) $(RUNCMD) ./vltest combo -cz casket
+	$(RUNENV) $(RUNCMD) ./vltest wicked -cz -c casket 5000
+	$(RUNENV) $(RUNCMD) ./vltest combo -cy casket
+	$(RUNENV) $(RUNCMD) ./vltest wicked -cy -c casket 5000
+	$(RUNENV) $(RUNCMD) ./vltest combo -cx casket
+	$(RUNENV) $(RUNCMD) ./vltest wicked -cx -c casket 5000
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./odtest write casket 500 50 5000
+	$(RUNENV) $(RUNCMD) ./odtest read casket
+	$(RUNENV) $(RUNCMD) ./odtest combo casket
+	$(RUNENV) $(RUNCMD) ./odtest wicked casket 500
+	rm -rf casket*
+	$(RUNENV) $(RUNCMD) ./qmttest casket 50000 10
+	rm -rf casket*
+	@printf '\n'
+	@printf '#================================================================\n'
+	@printf '# Checking completed.\n'
+	@printf '#================================================================\n'
+
+
+check-valgrind :
+	make RUNCMD="valgrind --tool=memcheck --log-fd=1" check | tee leak.log
+	grep ERROR leak.log
+	grep 'at exit' leak.log
+
+
+world :
+	make clean ; make
+	cd plus ; [ -f Makefile ] || ./configure ; make clean ; make
+	cd java ; [ -f Makefile ] || ./configure ; make clean ; make
+	cd perl ; [ -f Makefile ] || ./configure ; make clean ; make
+	cd ruby ; [ -f Makefile ] || ./configure ; make clean ; make
+	cd cgi ; [ -f Makefile ] || ./configure ; make clean ; make
+
+
+install-world :
+	make install
+	cd plus ; [ -f Makefile ] || ./configure ; make install
+	cd java ; [ -f Makefile ] || ./configure ; make install
+	cd perl ; [ -f Makefile ] || ./configure ; make install
+	cd ruby ; [ -f Makefile ] || ./configure ; make install
+	cd cgi ; [ -f Makefile ] || ./configure ; make install
+
+
+uninstall-world :
+	make uninstall
+	cd plus ; [ -f Makefile ] || ./configure ; make uninstall
+	cd java ; [ -f Makefile ] || ./configure ; make uninstall
+	cd perl ; [ -f Makefile ] || ./configure ; make uninstall
+	cd ruby ; [ -f Makefile ] || ./configure ; make uninstall
+	cd cgi ; [ -f Makefile ] || ./configure ; make uninstall
+
+
+check-world :
+	make check
+	cd plus ; [ -f Makefile ] || ./configure ; make check
+	cd java ; [ -f Makefile ] || ./configure ; make check
+	cd perl ; [ -f Makefile ] || ./configure ; make check
+	cd ruby ; [ -f Makefile ] || ./configure ; make check
+
+
+rpm : ../$(PACKAGETGZ) qdbm.spec
+	mkdir -p rpm-tmp/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
+	mkdir -p rpm-tmp/RPMS/i386
+	cp ../$(PACKAGETGZ) rpm-tmp/SOURCES
+	rpmbuild -bb --target i386 --define "_topdir `pwd`/rpm-tmp" qdbm.spec
+	mv -f rpm-tmp/RPMS/i386/$(PACKAGE)-*$(VERSION)*.rpm ..
+	rm -rf rpm-tmp
+
+
+win32pkg :
+	test -f /bin/mgwz.dll
+	test -f /bin/libiconv-2.dll
+	make uninstall && make uninstall-win && make clean
+	make mingw && strip *.exe && make install-win
+	cd java && ./configure
+	cd java && make uninstall && make uninstall-win && make clean
+	cd java && make mingw
+	cd cgi && ./configure
+	cd cgi && make clean
+	cd cgi && make mingw && strip *.cgi
+	mkdir -p $(PACKAGE)-$(VERSION)-win32
+	cp -Rf $(MYHEADS) libqdbm.dll.a qdbm.dll *.exe *.html \
+	  misc/README-win32.txt misc/COPYING.txt misc/win32check.bat \
+	  /bin/mgwz.dll /bin/libiconv-2.dll \
+	  $(PACKAGE)-$(VERSION)-win32
+	cp -Rf java/jqdbm.dll java/qdbm.jar java/*.html java/japidoc $(PACKAGE)-$(VERSION)-win32
+	mkdir -p $(PACKAGE)-$(VERSION)-win32/cgi
+	cp -Rf cgi/*.cgi cgi/*.conf cgi/*.html $(PACKAGE)-$(VERSION)-win32/cgi
+	zip -r $(PACKAGE)-$(VERSION)-win32.zip $(PACKAGE)-$(VERSION)-win32
+	mv -f $(PACKAGE)-$(VERSION)-win32.zip ..
+	rm -rf $(PACKAGE)-$(VERSION)-win32
+	make uninstall && make uninstall-win && make clean
+	cd java ; make uninstall && make uninstall-win && make clean
+
+
+win :
+	make MYLIBS="$(MYWINLIBS)" CFLAGS="-Wall -ansi -pedantic -fsigned-char -O2"
+
+
+mingw :
+	make CC="gcc -mno-cygwin" MYLIBS="$(MYWINLIBS)" \
+	  CFLAGS="-Wall -fsigned-char -O2" LIBLDFLAGS="@MGWLIBS@" LDFLAGS="-L. -lqdbm @MGWLIBS@"
+
+
+check-win :
+	make check
+
+
+install-win :
+	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
+	  MYLIBS="$(MYWINLIBS)" install
+	cp -Rf qdbm.dll $(DESTDIR)$(MYBINDIR)
+
+
+uninstall-win :
+	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
+	  MYLIBS="$(MYWINLIBS)" uninstall
+	rm -f $(DESTDIR)$(MYBINDIR)/qdbm.dll
+
+
+def : libqdbm.a
+	./misc/makevcdef libqdbm.a > qdbm.def
+
+
+mac :
+	make MYLIBS="$(MYMACLIBS)" CFLAGS="-Wall -fsigned-char -fno-common -O2"
+
+
+check-mac :
+	make RUNENV="DYLD_LIBRARY_PATH=." check
+
+
+install-mac :
+	make MYLIBS="$(MYMACLIBS)" install
+
+
+uninstall-mac :
+	make MYLIBS="$(MYMACLIBS)" uninstall
+
+
+hpux :
+	make MYLIBS="$(MYHPUXLIBS)"
+
+
+check-hpux :
+	make RUNENV="SHLIB_PATH=." check
+
+
+install-hpux :
+	make MYLIBS="$(MYHPUXLIBS)" install
+
+
+uninstall-hpux :
+	make MYLIBS="$(MYHPUXLIBS)" uninstall
+
+
+no-so :
+	make MYLIBS="libqdbm.a" all
+
+
+install-no-so :
+	make MYLIBS="libqdbm.a" install
+
+
+uninstall-no-so :
+	make MYLIBS="libqdbm.a" uninstall
+
+
+.PHONY : all clean install check
+
+
+
+#================================================================
+# Building binaries
+#================================================================
+
+
+libqdbm.a : $(MYLIBOBJS)
+	$(AR) $(ARFLAGS) $@ $(MYLIBOBJS)
+
+
+libqdbm.so.$(LIBVER).$(LIBREV).0 : $(MYLIBOBJS)
+	if uname -a | egrep -i 'SunOS' > /dev/null ; \
+	  then \
+	    $(CC) -shared -Wl,-G,-h,libqdbm.so.$(LIBVER) -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
+	  else \
+	    $(CC) -shared -Wl,-soname,libqdbm.so.$(LIBVER) -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
+	  fi
+
+
+libqdbm.so.$(LIBVER) : libqdbm.so.$(LIBVER).$(LIBREV).0
+	ln -f -s libqdbm.so.$(LIBVER).$(LIBREV).0 $@
+
+
+libqdbm.so : libqdbm.so.$(LIBVER).$(LIBREV).0
+	ln -f -s libqdbm.so.$(LIBVER).$(LIBREV).0 $@
+
+
+libqdbm.dll.a : qdbm.dll
+
+
+qdbm.dll : $(MYLIBOBJS)
+	$(CC) -shared -o $@ \
+	  -Wl,--out-implib=lib$@.a \
+	  -Wl,--export-all-symbols \
+	  -Wl,--enable-auto-import \
+	  -Wl,--add-stdcall-alias \
+	  -Wl,--whole-archive \
+	  -Wl,--no-whole-archive $(MYLIBOBJS) $(LIBLDFLAGS)
+
+
+libqdbm.$(LIBVER).$(LIBREV).0.dylib : $(MYLIBOBJS)
+	$(CC) -dynamiclib -o $@ \
+	  -install_name $(MYLIBDIR)/libqdbm.$(LIBVER).dylib \
+	  -current_version $(LIBVER).$(LIBREV).0 \
+	  -compatibility_version $(LIBVER) \
+	  $(MYLIBOBJS) $(LIBLDFLAGS)
+
+
+libqdbm.$(LIBVER).dylib : libqdbm.$(LIBVER).$(LIBREV).0.dylib
+	ln -f -s libqdbm.$(LIBVER).$(LIBREV).0.dylib $@
+
+
+libqdbm.dylib : libqdbm.$(LIBVER).$(LIBREV).0.dylib
+	ln -f -s libqdbm.$(LIBVER).$(LIBREV).0.dylib $@
+
+
+libqdbm.sl : $(MYLIBOBJS)
+	$(CC) -shared -Wl,-b -o $@ $(MYLIBOBJS) $(LIBLDFLAGS)
+
+
+dpmgr : dpmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ dpmgr.o $(LDFLAGS)
+
+
+dptest : dptest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ dptest.o $(LDFLAGS)
+
+
+dptsv : dptsv.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ dptsv.o $(LDFLAGS)
+
+
+crmgr : crmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ crmgr.o $(LDFLAGS)
+
+
+crtest : crtest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ crtest.o $(LDFLAGS)
+
+
+crtsv : crtsv.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ crtsv.o $(LDFLAGS)
+
+
+rlmgr : rlmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ rlmgr.o $(LDFLAGS)
+
+
+rltest : rltest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ rltest.o $(LDFLAGS)
+
+
+hvmgr : hvmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ hvmgr.o $(LDFLAGS)
+
+
+hvtest : hvtest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ hvtest.o $(LDFLAGS)
+
+
+cbtest : cbtest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ cbtest.o $(LDFLAGS)
+
+
+cbcodec : cbcodec.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ cbcodec.o $(LDFLAGS)
+
+
+vlmgr : vlmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ vlmgr.o $(LDFLAGS)
+
+
+vltest : vltest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ vltest.o $(LDFLAGS)
+
+
+vltsv : vltsv.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ vltsv.o $(LDFLAGS)
+
+
+odmgr : odmgr.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ odmgr.o $(LDFLAGS)
+
+
+odtest : odtest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ odtest.o $(LDFLAGS)
+
+
+odidx : odidx.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ odidx.o $(LDFLAGS)
+
+
+qmttest : qmttest.o $(MYLIBS)
+	$(LDENV) $(CC) $(CFLAGS) -o $@ qmttest.o $(LDFLAGS)
+
+
+depot.o : depot.h myconf.h
+
+curia.o : depot.h curia.h myconf.h
+
+relic.o : depot.h relic.h myconf.h
+
+hovel.o : depot.h curia.h hovel.h myconf.h
+
+cabin.o : cabin.h myconf.h
+
+villa.o : depot.h cabin.h villa.h myconf.h
+
+vista.o : depot.h curia.h cabin.h villa.h vista.h myconf.h villa.c
+
+odeum.o : depot.h curia.h cabin.h villa.h myconf.h
+
+myconf.o : myconf.h
+
+dpmgr.o dptest.o dptsv.o : depot.h cabin.h
+
+crmgr.o crtest.o crtsv.o : depot.h curia.h cabin.h
+
+rlmgr.o rltest.o : depot.h relic.h cabin.h
+
+hvmgr.o hvtest.o : depot.h curia.h hovel.h cabin.h
+
+cbtest.o cbcodec.o : cabin.h
+
+vlmgr.o vltest.o vltsv.o : depot.h cabin.h villa.h
+
+odmgr.o odtest.o odidx.o : depot.h curia.h cabin.h villa.h odeum.h
+
+
+
+# END OF FILE

Deleted: box/trunk/qdbm/NEWS
===================================================================
--- box/trunk/qdbm/NEWS	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/NEWS	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,43 +0,0 @@
-== Thu, 08 Sep 2005 13:13:58 +0900 ==
-
-Compressing options of ZLIB was changed.  If you use villa with the option
-`VL_OZCOMP', databases of the earlier versions are not compatible with the
-current version of QDBM.  To convert the old database to new format,
-export endian independent data by "vlmgr exportdb" with the old version,
-and then import it by "vlmgr importdb" with the latest version.
-
-
-
-== Wed, 10 Mar 2004 23:24:24 +0900 ==
-
-API of B+ tree was changed a bit.  Even if you build QDBM with ZLIB
-enabled, records are not compressed.  Instead of it, the function `vlopen'
-has the option `VL_OZCOMP'.  If it is specified, records are compressed.
-So, you can switch whether to compress records or not, on runtime.
-
-Users who have used ZLIB feature should modify their source codes to
-specify that option.
-
-
-
-== Wed, 10 Dec 2003 09:24:12 +0900 ==
-
-The database format was changed with QDBM 1.7.13.  Newer versions do not
-have backward compatibility to old format.  You can convert old databases
-with the command `fmtcnv031127' in the sub directory `lab'.  To build it,
-perform the following steps.
-
-  cd lab
-  make fmtcnv031127
-
-About usage of it, see the file `README' in `lab'.  Typically, to convert
-a Depot database named as `old' and create a database named as `new',
-perform the following step.
-
-  ./fmtcnv031127 < old > new
-
-I'm sorry for bothering you.
-
-
-
-== END OF FILE ==

Copied: box/trunk/qdbm/NEWS (from rev 2716, box/trunk/qdbm/NEWS)
===================================================================
--- box/trunk/qdbm/NEWS	                        (rev 0)
+++ box/trunk/qdbm/NEWS	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,43 @@
+== Thu, 08 Sep 2005 13:13:58 +0900 ==
+
+Compressing options of ZLIB was changed.  If you use villa with the option
+`VL_OZCOMP', databases of the earlier versions are not compatible with the
+current version of QDBM.  To convert the old database to new format,
+export endian independent data by "vlmgr exportdb" with the old version,
+and then import it by "vlmgr importdb" with the latest version.
+
+
+
+== Wed, 10 Mar 2004 23:24:24 +0900 ==
+
+API of B+ tree was changed a bit.  Even if you build QDBM with ZLIB
+enabled, records are not compressed.  Instead of it, the function `vlopen'
+has the option `VL_OZCOMP'.  If it is specified, records are compressed.
+So, you can switch whether to compress records or not, on runtime.
+
+Users who have used ZLIB feature should modify their source codes to
+specify that option.
+
+
+
+== Wed, 10 Dec 2003 09:24:12 +0900 ==
+
+The database format was changed with QDBM 1.7.13.  Newer versions do not
+have backward compatibility to old format.  You can convert old databases
+with the command `fmtcnv031127' in the sub directory `lab'.  To build it,
+perform the following steps.
+
+  cd lab
+  make fmtcnv031127
+
+About usage of it, see the file `README' in `lab'.  Typically, to convert
+a Depot database named as `old' and create a database named as `new',
+perform the following step.
+
+  ./fmtcnv031127 < old > new
+
+I'm sorry for bothering you.
+
+
+
+== END OF FILE ==

Deleted: box/trunk/qdbm/README
===================================================================
--- box/trunk/qdbm/README	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/README	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,50 +0,0 @@
-================================================================
- QDBM: Quick Database Manager
- Copyright (C) 2000-2007 Mikio Hirabayashi
-================================================================
-
-
-Please read the following documents with a WWW browser.
-How to install QDBM is explained in the specification.
-
-  README         - this file
-  COPYING        - license
-  ChangeLog      - history of enhancement
-  NEWS           - news for users
-  THANKS         - list of contributors
-  spex.html      - specification
-  spex-ja.html   - specification in Japanese
-
-
-Contents of the directory tree is below.
-
-  ./             - sources of QDBM
-  ./plus/        - API for C++ (read `./plus/xspex.html')
-  ./java/        - API for Java (read `./java/jspex.html')
-  ./perl/        - API for Perl (read `./perl/plspex.html')
-  ./ruby/        - API for Ruby (read `./ruby/rbspex.html')
-  ./cgi/         - CGI scripts (read `./cgi/cgispex.html')
-  ./man1/        - manual pages for commands
-  ./man3/        - manual pages for C API
-  ./lab/         - for test and experiment
-  ./bros/        - for comparison with other database managers
-  ./misc/        - miscellaneous files
-
-
-QDBM is released under the terms of the GNU Lesser General Public
-License.  See the file `COPYING' for details.
-
-QDBM was written by Mikio Hirabayashi.  You can contact the author
-by e-mail to `mikio at users.sourceforge.net'.  However, as for
-topics which can be shared among other users, pleae send it to
-the mailing list. To join the mailing list, refer to the following
-URL.
-
-  http://lists.sourceforge.net/lists/listinfo/qdbm-users
-
-
-Thanks.
-
-
-
-== END OF FILE ==

Copied: box/trunk/qdbm/README (from rev 2716, box/trunk/qdbm/README)
===================================================================
--- box/trunk/qdbm/README	                        (rev 0)
+++ box/trunk/qdbm/README	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,50 @@
+================================================================
+ QDBM: Quick Database Manager
+ Copyright (C) 2000-2007 Mikio Hirabayashi
+================================================================
+
+
+Please read the following documents with a WWW browser.
+How to install QDBM is explained in the specification.
+
+  README         - this file
+  COPYING        - license
+  ChangeLog      - history of enhancement
+  NEWS           - news for users
+  THANKS         - list of contributors
+  spex.html      - specification
+  spex-ja.html   - specification in Japanese
+
+
+Contents of the directory tree is below.
+
+  ./             - sources of QDBM
+  ./plus/        - API for C++ (read `./plus/xspex.html')
+  ./java/        - API for Java (read `./java/jspex.html')
+  ./perl/        - API for Perl (read `./perl/plspex.html')
+  ./ruby/        - API for Ruby (read `./ruby/rbspex.html')
+  ./cgi/         - CGI scripts (read `./cgi/cgispex.html')
+  ./man1/        - manual pages for commands
+  ./man3/        - manual pages for C API
+  ./lab/         - for test and experiment
+  ./bros/        - for comparison with other database managers
+  ./misc/        - miscellaneous files
+
+
+QDBM is released under the terms of the GNU Lesser General Public
+License.  See the file `COPYING' for details.
+
+QDBM was written by Mikio Hirabayashi.  You can contact the author
+by e-mail to `mikio at users.sourceforge.net'.  However, as for
+topics which can be shared among other users, pleae send it to
+the mailing list. To join the mailing list, refer to the following
+URL.
+
+  http://lists.sourceforge.net/lists/listinfo/qdbm-users
+
+
+Thanks.
+
+
+
+== END OF FILE ==

Deleted: box/trunk/qdbm/RISCmakefile
===================================================================
--- box/trunk/qdbm/RISCmakefile	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/RISCmakefile	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,140 +0,0 @@
-# Makefile for the RISC OS version of QDBM
-
-
-# Define which compiler to use:
-
-CC = cc
-#CC = gcc
-
-
-#########################################
-# DO NOT EDIT ANYTHING BELOW THIS LINE! #
-#########################################
-
-ifeq (${CC},cc)
-CC = cc
-LD = link
-AR = libfile
-DEPEND = -depend !Depend
-CC_FLAGS = -Wdp -throwback -Otime -I@,Unix: -JUnix
-UNIXLIB = Unix:o.UnixLib
-else
-ifeq (${CC},gcc)
-CC = gcc
-LD = gcc
-AR = ar
-CC_FLAGS = -mthrowback -O3 -I.
-else
-# No other compiler supported!
-endif
-endif
-
-QDBM_OBJS = o.depot o.curia o.relic o.hovel o.cabin o.villa o.vista o.odeum o.myconf
-
-.INIT :
-	@cdir o
-
-## Rule Patterns ##
-
-.SUFFIXES : .c .o
-
-.c.o :
-	$(CC) $(CC_FLAGS) $(DEPEND) -c -o $@ $<
-
-# Static dependencies:
-
-all : libqdbm testcases managers converters
-
-libqdbm : $(QDBM_OBJS)
-	$(AR) $(AR_FLAGS) -c -o libqdbm $(QDBM_OBJS)
-
-testcases : dptest crtest rltest hvtest cbtest vltest odtest
-	create testcases
-
-managers : dpmgr crmgr rlmgr hvmgr vlmgr odmgr
-	create managers
-
-converters : dptsv crtsv cbcodec vltsv odidx
-	create converters
-
-dptest : o.dptest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-crtest : o.crtest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-rltest : o.rltest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-hvtest : o.hvtest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-cbtest : o.cbtest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-vltest : o.vltest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-odtest : o.odtest libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-dpmgr : o.dpmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-crmgr : o.crmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-rlmgr : o.rlmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-hvmgr : o.hvmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-vlmgr : o.vlmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-odmgr : o.odmgr libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-dptsv : o.dptsv libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-crtsv : o.crtsv libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-cbcodec : o.cbcodec libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-vltsv : o.vltsv libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-odidx : o.odidx libqdbm
-	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
-
-clean:
-	-ifthere libqdbm then wipe libqdbm ~CFR~V
-	-ifthere dptest then wipe dptest ~CFR~V
-	-ifthere crtest then wipe crtest ~CFR~V
-	-ifthere rltest then wipe rltest ~CFR~V
-	-ifthere hvtest then wipe hvtest ~CFR~V
-	-ifthere cbtest then wipe cbtest ~CFR~V
-	-ifthere vltest then wipe vltest ~CFR~V
-	-ifthere odtest then wipe odtest ~CFR~V
-	-ifthere dpmgr then wipe dpmgr ~CFR~V
-	-ifthere crmgr then wipe crmgr ~CFR~V
-	-ifthere rlmgr then wipe rlmgr ~CFR~V
-	-ifthere hvmgr then wipe hvmgr ~CFR~V
-	-ifthere cbmgr then wipe cbmgr ~CFR~V
-	-ifthere vlmgr then wipe vlmgr ~CFR~V
-	-ifthere odmgr then wipe odmgr ~CFR~V
-	-ifthere dptsv then wipe dptsv ~CFR~V
-	-ifthere crtsv then wipe crtsv ~CFR~V
-	-ifthere cbcodec then wipe cbcodec ~CFR~V
-	-ifthere vltsv then wipe vltsv ~CFR~V
-	-ifthere odidx then wipe odidx ~CFR~V
-	-ifthere testcases then wipe testcases ~CFR~V
-	-ifthere managers then wipe managers ~CFR~V
-	-ifthere converters then wipe converters ~CFR~V
-	-ifthere o.* then wipe o.* ~CFR~V
-
-# Dynamic dependencies:

Copied: box/trunk/qdbm/RISCmakefile (from rev 2716, box/trunk/qdbm/RISCmakefile)
===================================================================
--- box/trunk/qdbm/RISCmakefile	                        (rev 0)
+++ box/trunk/qdbm/RISCmakefile	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,140 @@
+# Makefile for the RISC OS version of QDBM
+
+
+# Define which compiler to use:
+
+CC = cc
+#CC = gcc
+
+
+#########################################
+# DO NOT EDIT ANYTHING BELOW THIS LINE! #
+#########################################
+
+ifeq (${CC},cc)
+CC = cc
+LD = link
+AR = libfile
+DEPEND = -depend !Depend
+CC_FLAGS = -Wdp -throwback -Otime -I@,Unix: -JUnix
+UNIXLIB = Unix:o.UnixLib
+else
+ifeq (${CC},gcc)
+CC = gcc
+LD = gcc
+AR = ar
+CC_FLAGS = -mthrowback -O3 -I.
+else
+# No other compiler supported!
+endif
+endif
+
+QDBM_OBJS = o.depot o.curia o.relic o.hovel o.cabin o.villa o.vista o.odeum o.myconf
+
+.INIT :
+	@cdir o
+
+## Rule Patterns ##
+
+.SUFFIXES : .c .o
+
+.c.o :
+	$(CC) $(CC_FLAGS) $(DEPEND) -c -o $@ $<
+
+# Static dependencies:
+
+all : libqdbm testcases managers converters
+
+libqdbm : $(QDBM_OBJS)
+	$(AR) $(AR_FLAGS) -c -o libqdbm $(QDBM_OBJS)
+
+testcases : dptest crtest rltest hvtest cbtest vltest odtest
+	create testcases
+
+managers : dpmgr crmgr rlmgr hvmgr vlmgr odmgr
+	create managers
+
+converters : dptsv crtsv cbcodec vltsv odidx
+	create converters
+
+dptest : o.dptest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+crtest : o.crtest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+rltest : o.rltest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+hvtest : o.hvtest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+cbtest : o.cbtest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+vltest : o.vltest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+odtest : o.odtest libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+dpmgr : o.dpmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+crmgr : o.crmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+rlmgr : o.rlmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+hvmgr : o.hvmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+vlmgr : o.vlmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+odmgr : o.odmgr libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+dptsv : o.dptsv libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+crtsv : o.crtsv libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+cbcodec : o.cbcodec libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+vltsv : o.vltsv libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+odidx : o.odidx libqdbm
+	$(LD) $(LD_FLAGS) -o $@ o.$* libqdbm $(UNIXLIB)
+
+clean:
+	-ifthere libqdbm then wipe libqdbm ~CFR~V
+	-ifthere dptest then wipe dptest ~CFR~V
+	-ifthere crtest then wipe crtest ~CFR~V
+	-ifthere rltest then wipe rltest ~CFR~V
+	-ifthere hvtest then wipe hvtest ~CFR~V
+	-ifthere cbtest then wipe cbtest ~CFR~V
+	-ifthere vltest then wipe vltest ~CFR~V
+	-ifthere odtest then wipe odtest ~CFR~V
+	-ifthere dpmgr then wipe dpmgr ~CFR~V
+	-ifthere crmgr then wipe crmgr ~CFR~V
+	-ifthere rlmgr then wipe rlmgr ~CFR~V
+	-ifthere hvmgr then wipe hvmgr ~CFR~V
+	-ifthere cbmgr then wipe cbmgr ~CFR~V
+	-ifthere vlmgr then wipe vlmgr ~CFR~V
+	-ifthere odmgr then wipe odmgr ~CFR~V
+	-ifthere dptsv then wipe dptsv ~CFR~V
+	-ifthere crtsv then wipe crtsv ~CFR~V
+	-ifthere cbcodec then wipe cbcodec ~CFR~V
+	-ifthere vltsv then wipe vltsv ~CFR~V
+	-ifthere odidx then wipe odidx ~CFR~V
+	-ifthere testcases then wipe testcases ~CFR~V
+	-ifthere managers then wipe managers ~CFR~V
+	-ifthere converters then wipe converters ~CFR~V
+	-ifthere o.* then wipe o.* ~CFR~V
+
+# Dynamic dependencies:

Deleted: box/trunk/qdbm/THANKS
===================================================================
--- box/trunk/qdbm/THANKS	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/THANKS	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,45 +0,0 @@
-================================================================
- Thanks to all of the following for their valuable suggestions
- or contributions.
-================================================================
-
-
-Kang-Jin Lee
-  - suggestions about the GDBM-compatible API
-  - contributions about Makefile
-
-Pat Podenski
-  - suggestions about porting to Mac OS X, Solaris, and HP-UX 
-
-BERO
-  - contributions about supporting MinGW
-
-Stefan Bellon
-  - contributions about porting to RISC OS
-
-Donald Gobin
-  - contributions about supporting Visual C++
-
-Emanuel Dejanu
-  - contributions about supporting Visual C++
-
-Keith Bostic
-  - suggestions about the performance test suite
-
-William Lachance
-  - contributions about RPM spec file
-
-Zed A. Shaw
-  - contributions about a text analyzer in Odeum
-  - contributions about a query language in Odeum
-
-Chris Bilderback
-  - contributions about cursor functions in Villa.
-
-Fumitoshi Ukai
-  - contributions of troff manuals
-  - making Debian packages
-
-
-
-== END OF FILE ==

Copied: box/trunk/qdbm/THANKS (from rev 2716, box/trunk/qdbm/THANKS)
===================================================================
--- box/trunk/qdbm/THANKS	                        (rev 0)
+++ box/trunk/qdbm/THANKS	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,45 @@
+================================================================
+ Thanks to all of the following for their valuable suggestions
+ or contributions.
+================================================================
+
+
+Kang-Jin Lee
+  - suggestions about the GDBM-compatible API
+  - contributions about Makefile
+
+Pat Podenski
+  - suggestions about porting to Mac OS X, Solaris, and HP-UX 
+
+BERO
+  - contributions about supporting MinGW
+
+Stefan Bellon
+  - contributions about porting to RISC OS
+
+Donald Gobin
+  - contributions about supporting Visual C++
+
+Emanuel Dejanu
+  - contributions about supporting Visual C++
+
+Keith Bostic
+  - suggestions about the performance test suite
+
+William Lachance
+  - contributions about RPM spec file
+
+Zed A. Shaw
+  - contributions about a text analyzer in Odeum
+  - contributions about a query language in Odeum
+
+Chris Bilderback
+  - contributions about cursor functions in Villa.
+
+Fumitoshi Ukai
+  - contributions of troff manuals
+  - making Debian packages
+
+
+
+== END OF FILE ==

Deleted: box/trunk/qdbm/VCmakefile
===================================================================
--- box/trunk/qdbm/VCmakefile	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/VCmakefile	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,248 +0,0 @@
-# Makefile to build QDBM using Microsoft Visual C++
-
-
-
-#================================================================
-# Setting variables
-#================================================================
-
-
-# VC++ directory
-VCPATH = C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7
-
-# User options
-YOUR_CLFLAGS =
-YOUR_LIBFLAGS =
-YOUR_LINKFLAGS=
-
-# Configurations
-!IF "$(CFG)" == "ld"
-!MESSAGE Build using static debug configuration
-BASE_FLAGS = /MLd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-BASE_DEFS = /D_DEBUG /D__DEBUG__
-OUTDIR = .\tmp_ld
-LIB_APPEND = _ld
-EXE_APPEND = _ld
-!ELSEIF "$(CFG)" == "l"
-!MESSAGE Build using static release configuration
-BASE_DEFS = /DNDEBUG
-BASE_FLAGS = /ML /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-OUTDIR = .\tmp_l
-LIB_APPEND = _l
-EXE_APPEND = _l
-!ELSEIF "$(CFG)" == "td"
-!MESSAGE Build using static threaded debug configuration
-BASE_FLAGS = /MTd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-BASE_DEFS = /D_DEBUG /D__DEBUG__
-OUTDIR = .\tmp_td
-LIB_APPEND = _td
-EXE_APPEND = _td
-!ELSEIF "$(CFG)" == "t"
-!MESSAGE Build using static threaded release configuration
-BASE_DEFS = /DNDEBUG
-BASE_FLAGS = /MT /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-OUTDIR = .\tmp_t
-LIB_APPEND = _t
-EXE_APPEND = _t
-!ELSEIF "$(CFG)" == "dd"
-!MESSAGE Build using dynamic threaded debug configuration
-BASE_FLAGS = /MDd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-BASE_DEFS = /D_DEBUG /D__DEBUG__
-OUTDIR = .\tmp_dd
-LIB_APPEND = _dd
-EXE_APPEND = _dd
-!ELSE
-!MESSAGE Build using dynamic threaded release configuration
-BASE_DEFS = /DNDEBUG
-BASE_FLAGS = /MD /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
-OUTDIR = .\tmp
-LIB_APPEND =
-EXE_APPEND =
-!ENDIF
-
-# Building binaries
-CLFLAGS = /I "$(VCPATH)\Include" /I "$(VCPATH)\PlatformSDK\Include" /I "." \
-  /nologo $(YOUR_CLFLAGS) $(BASE_FLAGS) $(BASE_DEFS) /D_CRT_SECURE_NO_DEPRECATE=1
-LIBFLAGS = /libpath:"$(VCPATH)\lib" /libpath:"$(VCPATH)\PlatformSDK\Lib" /libpath:"." \
-  /nologo $(YOUR_LIBFLAGS)
-LINKFLAGS = /libpath:"$(VCPATH)\lib" /libpath:"$(VCPATH)\PlatformSDK\Lib" /libpath:"." \
-  /nologo $(YOUR_LINKFLAGS)
-
-# Targets
-MYLIBS = qdbm$(LIB_APPEND).dll qdbm$(LIB_APPEND).lib qdbm$(LIB_APPEND)_static.lib
-LIBOBJS = $(OUTDIR)\depot.obj $(OUTDIR)\curia.obj $(OUTDIR)\relic.obj \
-  $(OUTDIR)\hovel.obj $(OUTDIR)\cabin.obj $(OUTDIR)\villa.obj \
-  $(OUTDIR)\vista.obj $(OUTDIR)\odeum.obj $(OUTDIR)\myconf.obj
-MYBINS = dpmgr$(EXE_APPEND).exe dptest$(EXE_APPEND).exe dptsv$(EXE_APPEND).exe \
-  crmgr$(EXE_APPEND).exe crtest$(EXE_APPEND).exe crtsv$(EXE_APPEND).exe \
-  rlmgr$(EXE_APPEND).exe rltest$(EXE_APPEND).exe hvmgr$(EXE_APPEND).exe \
-  hvtest$(EXE_APPEND).exe cbtest$(EXE_APPEND).exe cbcodec$(EXE_APPEND).exe \
-  vlmgr$(EXE_APPEND).exe vltest$(EXE_APPEND).exe vltsv$(EXE_APPEND).exe \
-  odmgr$(EXE_APPEND).exe odtest$(EXE_APPEND).exe odidx$(EXE_APPEND).exe
-
-
-
-#================================================================
-# Suffix rules
-#================================================================
-
-
-.SUFFIXES :
-.SUFFIXES : .c .obj
-
-.c{$(OUTDIR)}.obj :
-	cl /c $(CLFLAGS) $<
-
-.c.obj:
-	cl /c $(CLFLAGS) $<
-
-
-
-#================================================================
-# Actions
-#================================================================
-
-
-all : $(OUTDIR) $(MYLIBS) $(MYBINS)
-
-
-allcfg:
-	nmake /NOLOGO /f VCmakefile CFG=ld
-	nmake /NOLOGO /f VCmakefile CFG=l
-	nmake /NOLOGO /f VCmakefile CFG=td
-	nmake /NOLOGO /f VCmakefile CFG=t
-	nmake /NOLOGO /f VCmakefile CFG=dd
-	nmake /NOLOGO /f VCmakefile
-
-
-clean :
-	-rd tmp_ld /S /Q > NUL: 2>&1
-	-rd tmp_l /S /Q > NUL: 2>&1
-	-rd tmp_td /S /Q > NUL: 2>&1
-	-rd tmp_t /S /Q > NUL: 2>&1
-	-rd tmp_dd /S /Q > NUL: 2>&1
-	-rd tmp /S /Q > NUL: 2>&1
-	-del *.obj *.lib *.dll *.exp *.exe casket /F /Q > NUL: 2>&1
-
-
-"$(OUTDIR)" :
-	if not exist "$(OUTDIR)/" mkdir "$(OUTDIR)"
-
-
-
-#================================================================
-# Building binaries
-#================================================================
-
-
-qdbm$(LIB_APPEND).dll : $(LIBOBJS) qdbm.def
-	link /DLL /DEF:qdbm.def $(LINKFLAGS) /OUT:$@ /IMPLIB:qdbm$(LIB_APPEND).lib $(LIBOBJS)
-
-
-qdbm$(LIB_APPEND).lib : qdbm$(LIB_APPEND).dll
-
-
-qdbm$(LIB_APPEND)_static.lib : $(LIBOBJS)
-	lib $(LIBFLAGS) /OUT:$@ $(LIBOBJS)
-
-
-dpmgr$(EXE_APPEND).exe : $(OUTDIR)\dpmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dpmgr.obj qdbm$(LIB_APPEND).lib
-
-
-dptest$(EXE_APPEND).exe : $(OUTDIR)\dptest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dptest.obj qdbm$(LIB_APPEND).lib
-
-
-dptsv$(EXE_APPEND).exe : $(OUTDIR)\dptsv.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dptsv.obj qdbm$(LIB_APPEND).lib
-
-
-crmgr$(EXE_APPEND).exe : $(OUTDIR)\crmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crmgr.obj qdbm$(LIB_APPEND).lib
-
-
-crtest$(EXE_APPEND).exe : $(OUTDIR)\crtest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crtest.obj qdbm$(LIB_APPEND).lib
-
-
-crtsv$(EXE_APPEND).exe : $(OUTDIR)\crtsv.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crtsv.obj qdbm$(LIB_APPEND).lib
-
-
-rlmgr$(EXE_APPEND).exe : $(OUTDIR)\rlmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\rlmgr.obj qdbm$(LIB_APPEND).lib
-
-
-rltest$(EXE_APPEND).exe : $(OUTDIR)\rltest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\rltest.obj qdbm$(LIB_APPEND).lib
-
-
-hvmgr$(EXE_APPEND).exe : $(OUTDIR)\hvmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\hvmgr.obj qdbm$(LIB_APPEND).lib
-
-
-hvtest$(EXE_APPEND).exe : $(OUTDIR)\hvtest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\hvtest.obj qdbm$(LIB_APPEND).lib
-
-
-cbtest$(EXE_APPEND).exe : $(OUTDIR)\cbtest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\cbtest.obj qdbm$(LIB_APPEND).lib
-
-
-cbcodec$(EXE_APPEND).exe : $(OUTDIR)\cbcodec.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\cbcodec.obj qdbm$(LIB_APPEND).lib
-
-
-vlmgr$(EXE_APPEND).exe : $(OUTDIR)\vlmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vlmgr.obj qdbm$(LIB_APPEND).lib
-
-
-vltest$(EXE_APPEND).exe : $(OUTDIR)\vltest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vltest.obj qdbm$(LIB_APPEND).lib
-
-
-vltsv$(EXE_APPEND).exe : $(OUTDIR)\vltsv.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vltsv.obj qdbm$(LIB_APPEND).lib
-
-
-odmgr$(EXE_APPEND).exe : $(OUTDIR)\odmgr.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odmgr.obj qdbm$(LIB_APPEND).lib
-
-
-odtest$(EXE_APPEND).exe : $(OUTDIR)\odtest.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odtest.obj qdbm$(LIB_APPEND).lib
-
-
-odidx$(EXE_APPEND).exe : $(OUTDIR)\odidx.obj qdbm$(LIB_APPEND).lib
-	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odidx.obj qdbm$(LIB_APPEND).lib
-
-
-$(OUTDIR)\depot.obj $(OUTDIR)\dpmgr.obj $(OUTDIR)\dptest.obj $(OUTDIR)\dptsv.obj : \
-  depot.h myconf.h
-
-$(OUTDIR)\curia.obj $(OUTDIR)\crmgr.obj $(OUTDIR)\crtest.obj $(OUTDIR)\crtsv.obj : \
-  curia.h depot.h myconf.h
-
-$(OUTDIR)\relic.obj $(OUTDIR)\rlmgr.obj $(OUTDIR)\rltest.obj : \
-  relic.h depot.h myconf.h
-
-$(OUTDIR)\hovel.obj $(OUTDIR)\hvmgr.obj $(OUTDIR)\hvtest.obj : \
-  hovel.h depot.h curia.h myconf.h
-
-$(OUTDIR)\cabin.obj $(OUTDIR)\cbtest.obj $(OUTDIR)\cbcodec.obj : \
-  cabin.h myconf.h
-
-$(OUTDIR)\villa.obj $(OUTDIR)\vlmgr.obj $(OUTDIR)\vltest.obj $(OUTDIR)\vltsv.obj : \
-  villa.h depot.h cabin.h myconf.h
-
-$(OUTDIR)\vista.obj : vista.h villa.h depot.h curia.h cabin.h myconf.h
-
-$(OUTDIR)\odeum.obj $(OUTDIR)\odmgr.obj $(OUTDIR)\odtest.obj $(OUTDIR)\odidx.obj : \
-  odeum.h depot.h curia.h cabin.h villa.h myconf.h
-
-$(OUTDIR)\myconf.obj : myconf.h
-
-
-
-# END OF FILE

Copied: box/trunk/qdbm/VCmakefile (from rev 2716, box/trunk/qdbm/VCmakefile)
===================================================================
--- box/trunk/qdbm/VCmakefile	                        (rev 0)
+++ box/trunk/qdbm/VCmakefile	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,248 @@
+# Makefile to build QDBM using Microsoft Visual C++
+
+
+
+#================================================================
+# Setting variables
+#================================================================
+
+
+# VC++ directory
+VCPATH = C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7
+
+# User options
+YOUR_CLFLAGS =
+YOUR_LIBFLAGS =
+YOUR_LINKFLAGS=
+
+# Configurations
+!IF "$(CFG)" == "ld"
+!MESSAGE Build using static debug configuration
+BASE_FLAGS = /MLd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+BASE_DEFS = /D_DEBUG /D__DEBUG__
+OUTDIR = .\tmp_ld
+LIB_APPEND = _ld
+EXE_APPEND = _ld
+!ELSEIF "$(CFG)" == "l"
+!MESSAGE Build using static release configuration
+BASE_DEFS = /DNDEBUG
+BASE_FLAGS = /ML /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+OUTDIR = .\tmp_l
+LIB_APPEND = _l
+EXE_APPEND = _l
+!ELSEIF "$(CFG)" == "td"
+!MESSAGE Build using static threaded debug configuration
+BASE_FLAGS = /MTd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+BASE_DEFS = /D_DEBUG /D__DEBUG__
+OUTDIR = .\tmp_td
+LIB_APPEND = _td
+EXE_APPEND = _td
+!ELSEIF "$(CFG)" == "t"
+!MESSAGE Build using static threaded release configuration
+BASE_DEFS = /DNDEBUG
+BASE_FLAGS = /MT /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+OUTDIR = .\tmp_t
+LIB_APPEND = _t
+EXE_APPEND = _t
+!ELSEIF "$(CFG)" == "dd"
+!MESSAGE Build using dynamic threaded debug configuration
+BASE_FLAGS = /MDd /W3 /ZI /Od /FD /GZ /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+BASE_DEFS = /D_DEBUG /D__DEBUG__
+OUTDIR = .\tmp_dd
+LIB_APPEND = _dd
+EXE_APPEND = _dd
+!ELSE
+!MESSAGE Build using dynamic threaded release configuration
+BASE_DEFS = /DNDEBUG
+BASE_FLAGS = /MD /W3 /O2 /FD /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\"
+OUTDIR = .\tmp
+LIB_APPEND =
+EXE_APPEND =
+!ENDIF
+
+# Building binaries
+CLFLAGS = /I "$(VCPATH)\Include" /I "$(VCPATH)\PlatformSDK\Include" /I "." \
+  /nologo $(YOUR_CLFLAGS) $(BASE_FLAGS) $(BASE_DEFS) /D_CRT_SECURE_NO_DEPRECATE=1
+LIBFLAGS = /libpath:"$(VCPATH)\lib" /libpath:"$(VCPATH)\PlatformSDK\Lib" /libpath:"." \
+  /nologo $(YOUR_LIBFLAGS)
+LINKFLAGS = /libpath:"$(VCPATH)\lib" /libpath:"$(VCPATH)\PlatformSDK\Lib" /libpath:"." \
+  /nologo $(YOUR_LINKFLAGS)
+
+# Targets
+MYLIBS = qdbm$(LIB_APPEND).dll qdbm$(LIB_APPEND).lib qdbm$(LIB_APPEND)_static.lib
+LIBOBJS = $(OUTDIR)\depot.obj $(OUTDIR)\curia.obj $(OUTDIR)\relic.obj \
+  $(OUTDIR)\hovel.obj $(OUTDIR)\cabin.obj $(OUTDIR)\villa.obj \
+  $(OUTDIR)\vista.obj $(OUTDIR)\odeum.obj $(OUTDIR)\myconf.obj
+MYBINS = dpmgr$(EXE_APPEND).exe dptest$(EXE_APPEND).exe dptsv$(EXE_APPEND).exe \
+  crmgr$(EXE_APPEND).exe crtest$(EXE_APPEND).exe crtsv$(EXE_APPEND).exe \
+  rlmgr$(EXE_APPEND).exe rltest$(EXE_APPEND).exe hvmgr$(EXE_APPEND).exe \
+  hvtest$(EXE_APPEND).exe cbtest$(EXE_APPEND).exe cbcodec$(EXE_APPEND).exe \
+  vlmgr$(EXE_APPEND).exe vltest$(EXE_APPEND).exe vltsv$(EXE_APPEND).exe \
+  odmgr$(EXE_APPEND).exe odtest$(EXE_APPEND).exe odidx$(EXE_APPEND).exe
+
+
+
+#================================================================
+# Suffix rules
+#================================================================
+
+
+.SUFFIXES :
+.SUFFIXES : .c .obj
+
+.c{$(OUTDIR)}.obj :
+	cl /c $(CLFLAGS) $<
+
+.c.obj:
+	cl /c $(CLFLAGS) $<
+
+
+
+#================================================================
+# Actions
+#================================================================
+
+
+all : $(OUTDIR) $(MYLIBS) $(MYBINS)
+
+
+allcfg:
+	nmake /NOLOGO /f VCmakefile CFG=ld
+	nmake /NOLOGO /f VCmakefile CFG=l
+	nmake /NOLOGO /f VCmakefile CFG=td
+	nmake /NOLOGO /f VCmakefile CFG=t
+	nmake /NOLOGO /f VCmakefile CFG=dd
+	nmake /NOLOGO /f VCmakefile
+
+
+clean :
+	-rd tmp_ld /S /Q > NUL: 2>&1
+	-rd tmp_l /S /Q > NUL: 2>&1
+	-rd tmp_td /S /Q > NUL: 2>&1
+	-rd tmp_t /S /Q > NUL: 2>&1
+	-rd tmp_dd /S /Q > NUL: 2>&1
+	-rd tmp /S /Q > NUL: 2>&1
+	-del *.obj *.lib *.dll *.exp *.exe casket /F /Q > NUL: 2>&1
+
+
+"$(OUTDIR)" :
+	if not exist "$(OUTDIR)/" mkdir "$(OUTDIR)"
+
+
+
+#================================================================
+# Building binaries
+#================================================================
+
+
+qdbm$(LIB_APPEND).dll : $(LIBOBJS) qdbm.def
+	link /DLL /DEF:qdbm.def $(LINKFLAGS) /OUT:$@ /IMPLIB:qdbm$(LIB_APPEND).lib $(LIBOBJS)
+
+
+qdbm$(LIB_APPEND).lib : qdbm$(LIB_APPEND).dll
+
+
+qdbm$(LIB_APPEND)_static.lib : $(LIBOBJS)
+	lib $(LIBFLAGS) /OUT:$@ $(LIBOBJS)
+
+
+dpmgr$(EXE_APPEND).exe : $(OUTDIR)\dpmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dpmgr.obj qdbm$(LIB_APPEND).lib
+
+
+dptest$(EXE_APPEND).exe : $(OUTDIR)\dptest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dptest.obj qdbm$(LIB_APPEND).lib
+
+
+dptsv$(EXE_APPEND).exe : $(OUTDIR)\dptsv.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\dptsv.obj qdbm$(LIB_APPEND).lib
+
+
+crmgr$(EXE_APPEND).exe : $(OUTDIR)\crmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crmgr.obj qdbm$(LIB_APPEND).lib
+
+
+crtest$(EXE_APPEND).exe : $(OUTDIR)\crtest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crtest.obj qdbm$(LIB_APPEND).lib
+
+
+crtsv$(EXE_APPEND).exe : $(OUTDIR)\crtsv.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\crtsv.obj qdbm$(LIB_APPEND).lib
+
+
+rlmgr$(EXE_APPEND).exe : $(OUTDIR)\rlmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\rlmgr.obj qdbm$(LIB_APPEND).lib
+
+
+rltest$(EXE_APPEND).exe : $(OUTDIR)\rltest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\rltest.obj qdbm$(LIB_APPEND).lib
+
+
+hvmgr$(EXE_APPEND).exe : $(OUTDIR)\hvmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\hvmgr.obj qdbm$(LIB_APPEND).lib
+
+
+hvtest$(EXE_APPEND).exe : $(OUTDIR)\hvtest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\hvtest.obj qdbm$(LIB_APPEND).lib
+
+
+cbtest$(EXE_APPEND).exe : $(OUTDIR)\cbtest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\cbtest.obj qdbm$(LIB_APPEND).lib
+
+
+cbcodec$(EXE_APPEND).exe : $(OUTDIR)\cbcodec.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\cbcodec.obj qdbm$(LIB_APPEND).lib
+
+
+vlmgr$(EXE_APPEND).exe : $(OUTDIR)\vlmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vlmgr.obj qdbm$(LIB_APPEND).lib
+
+
+vltest$(EXE_APPEND).exe : $(OUTDIR)\vltest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vltest.obj qdbm$(LIB_APPEND).lib
+
+
+vltsv$(EXE_APPEND).exe : $(OUTDIR)\vltsv.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\vltsv.obj qdbm$(LIB_APPEND).lib
+
+
+odmgr$(EXE_APPEND).exe : $(OUTDIR)\odmgr.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odmgr.obj qdbm$(LIB_APPEND).lib
+
+
+odtest$(EXE_APPEND).exe : $(OUTDIR)\odtest.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odtest.obj qdbm$(LIB_APPEND).lib
+
+
+odidx$(EXE_APPEND).exe : $(OUTDIR)\odidx.obj qdbm$(LIB_APPEND).lib
+	link $(LINKFLAGS) /OUT:$@ $(OUTDIR)\odidx.obj qdbm$(LIB_APPEND).lib
+
+
+$(OUTDIR)\depot.obj $(OUTDIR)\dpmgr.obj $(OUTDIR)\dptest.obj $(OUTDIR)\dptsv.obj : \
+  depot.h myconf.h
+
+$(OUTDIR)\curia.obj $(OUTDIR)\crmgr.obj $(OUTDIR)\crtest.obj $(OUTDIR)\crtsv.obj : \
+  curia.h depot.h myconf.h
+
+$(OUTDIR)\relic.obj $(OUTDIR)\rlmgr.obj $(OUTDIR)\rltest.obj : \
+  relic.h depot.h myconf.h
+
+$(OUTDIR)\hovel.obj $(OUTDIR)\hvmgr.obj $(OUTDIR)\hvtest.obj : \
+  hovel.h depot.h curia.h myconf.h
+
+$(OUTDIR)\cabin.obj $(OUTDIR)\cbtest.obj $(OUTDIR)\cbcodec.obj : \
+  cabin.h myconf.h
+
+$(OUTDIR)\villa.obj $(OUTDIR)\vlmgr.obj $(OUTDIR)\vltest.obj $(OUTDIR)\vltsv.obj : \
+  villa.h depot.h cabin.h myconf.h
+
+$(OUTDIR)\vista.obj : vista.h villa.h depot.h curia.h cabin.h myconf.h
+
+$(OUTDIR)\odeum.obj $(OUTDIR)\odmgr.obj $(OUTDIR)\odtest.obj $(OUTDIR)\odidx.obj : \
+  odeum.h depot.h curia.h cabin.h villa.h myconf.h
+
+$(OUTDIR)\myconf.obj : myconf.h
+
+
+
+# END OF FILE

Deleted: box/trunk/qdbm/cabin.c
===================================================================
--- box/trunk/qdbm/cabin.c	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/cabin.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,3529 +0,0 @@
-/*************************************************************************************************
- * Implementation of Cabin
- *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#define QDBM_INTERNAL  1
-
-#include "cabin.h"
-#include "myconf.h"
-
-#define CB_GCUNIT      64                /* allocation unit size of a buffer in gc */
-#define CB_SPBUFSIZ    32                /* size of a buffer for sprintf */
-#define CB_SPMAXWIDTH  128               /* max width of a column for sprintf */
-#define CB_MAPPBNUM    251               /* bucket size of a petit map handle */
-#define CB_MAPCSUNIT   52                /* small allocation unit size of map concatenation */
-#define CB_MAPCBUNIT   252               /* big allocation unit size of map concatenation */
-#define CB_MSGBUFSIZ   256               /* size of a buffer for log message */
-#define CB_IOBUFSIZ    8192              /* size of an I/O buffer */
-#define CB_FILEMODE    00644             /* permission of a creating file */
-#define CB_NUMBUFSIZ   32                /* size of a buffer for a number */
-#define CB_ENCBUFSIZ   32                /* size of a buffer for encoding name */
-#define CB_DATEBUFSIZ  64                /* size of a buffer for date expression */
-#define CB_VNUMBUFSIZ  8                 /* size of a buffer for variable length number */
-
-/* set a buffer for a variable length number */
-#define CB_SETVNUMBUF(CB_len, CB_buf, CB_num) \
-  do { \
-    int _CB_num; \
-    _CB_num = (CB_num); \
-    if(_CB_num == 0){ \
-      ((signed char *)(CB_buf))[0] = 0; \
-      (CB_len) = 1; \
-    } else { \
-      (CB_len) = 0; \
-      while(_CB_num > 0){ \
-        int _CB_rem = _CB_num & 0x7f; \
-        _CB_num >>= 7; \
-        if(_CB_num > 0){ \
-          ((signed char *)(CB_buf))[(CB_len)] = -_CB_rem - 1; \
-        } else { \
-          ((signed char *)(CB_buf))[(CB_len)] = _CB_rem; \
-        } \
-        (CB_len)++; \
-      } \
-    } \
-  } while(FALSE)
-
-/* read a variable length buffer */
-#define CB_READVNUMBUF(CB_buf, CB_size, CB_num, CB_step) \
-  do { \
-    int _CB_i, _CB_base; \
-    CB_num = 0; \
-    _CB_base = 1; \
-    if((size) < 2){ \
-      CB_num = ((signed char *)(CB_buf))[0]; \
-      (CB_step) = 1; \
-    } else { \
-      for(_CB_i = 0; _CB_i < (size); _CB_i++){ \
-        if(((signed char *)(CB_buf))[_CB_i] >= 0){ \
-          CB_num += ((signed char *)(CB_buf))[_CB_i] * _CB_base; \
-          break; \
-        } \
-        CB_num += _CB_base * (((signed char *)(CB_buf))[_CB_i] + 1) * -1; \
-        _CB_base *= 128; \
-      } \
-      (CB_step) = _CB_i + 1; \
-    } \
-  } while(FALSE)
-
-/* get the first hash value */
-#define CB_FIRSTHASH(CB_res, CB_kbuf, CB_ksiz) \
-  do { \
-    const unsigned char *_CB_p; \
-    int _CB_ksiz; \
-    _CB_p = (const unsigned char *)(CB_kbuf); \
-    _CB_ksiz = CB_ksiz; \
-    for((CB_res) = 19780211; _CB_ksiz--;){ \
-      (CB_res) = (CB_res) * 37 + *(_CB_p)++; \
-    } \
-    (CB_res) &= INT_MAX; \
-  } while(FALSE)
-
-/* get the second hash value */
-#define CB_SECONDHASH(CB_res, CB_kbuf, CB_ksiz) \
-  do { \
-    const unsigned char *_CB_p; \
-    int _CB_ksiz; \
-    _CB_p = (const unsigned char *)(CB_kbuf) + CB_ksiz - 1; \
-    _CB_ksiz = CB_ksiz; \
-    for((CB_res) = 0x13579bdf; _CB_ksiz--;){ \
-      (CB_res) = (CB_res) * 31 + *(_CB_p)--; \
-    } \
-    (CB_res) &= INT_MAX; \
-  } while(FALSE)
-
-
-/* private function prototypes */
-static void cbggchandler(void);
-static void cbggckeeper(void *ptr, void (*func)(void *));
-static void cbqsortsub(char *bp, int nmemb, int size, char *pswap, char *vswap,
-                       int(*compar)(const void *, const void *));
-static int cblistelemcmp(const void *a, const void *b);
-static int cbkeycmp(const char *abuf, int asiz, const char *bbuf, int bsiz);
-
-
-
-/*************************************************************************************************
- * public objects
- *************************************************************************************************/
-
-
-/* Call back function for handling a fatal error. */
-void (*cbfatalfunc)(const char *message) = NULL;
-
-
-/* Allocate a region on memory. */
-void *cbmalloc(size_t size){
-  char *p;
-  assert(size > 0 && size < INT_MAX);
-  if(!(p = malloc(size))) cbmyfatal("out of memory");
-  return p;
-}
-
-
-/* Re-allocate a region on memory. */
-void *cbrealloc(void *ptr, size_t size){
-  char *p;
-  assert(size > 0);
-  if(!(p = realloc(ptr, size))) cbmyfatal("out of memory");
-  return p;
-}
-
-
-/* Duplicate a region on memory. */
-char *cbmemdup(const char *ptr, int size){
-  char *p;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  CB_MALLOC(p, size + 1);
-  memcpy(p, ptr, size);
-  p[size] = '\0';
-  return p;
-}
-
-
-/* Free a region on memory. */
-void cbfree(void *ptr){
-  free(ptr);
-}
-
-
-/* Register the pointer or handle of an object to the global garbage collector. */
-void cbglobalgc(void *ptr, void (*func)(void *)){
-  assert(ptr && func);
-  cbggckeeper(ptr, func);
-}
-
-
-/* Exercise the global garbage collector explicitly. */
-void cbggcsweep(void){
-  cbggckeeper(NULL, NULL);
-}
-
-
-/* Check availability of allocation of the virtual memory. */
-int cbvmemavail(size_t size){
-  assert(size >= 0);
-  return _qdbm_vmemavail(size);
-}
-
-
-/* Sort an array using insert sort. */
-void cbisort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
-  char *bp, *swap;
-  int i, j;
-  assert(base && nmemb >= 0 && size > 0 && compar);
-  bp = (char *)base;
-  CB_MALLOC(swap, size);
-  for(i = 1; i < nmemb; i++){
-    if(compar(bp + (i - 1) * size, bp + i * size) > 0){
-      memcpy(swap, bp + i * size, size);
-      for(j = i; j > 0; j--){
-        if(compar(bp + (j - 1) * size, swap) < 0) break;
-        memcpy(bp + j * size, bp + (j - 1) * size, size);
-      }
-      memcpy(bp + j * size, swap, size);
-    }
-  }
-  free(swap);
-}
-
-
-/* Sort an array using shell sort. */
-void cbssort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
-  char *bp, *swap;
-  int step, bottom, i, j;
-  assert(base && nmemb >= 0 && size > 0 && compar);
-  bp = (char *)base;
-  CB_MALLOC(swap, size);
-  for(step = (nmemb - 1) / 3; step >= 0; step = (step - 1) / 3){
-    if(step < 5) step = 1;
-    for(bottom = 0; bottom < step; bottom++){
-      for(i = bottom + step; i < nmemb; i += step){
-        if(compar(bp + (i - step) * size, bp + i * size) > 0){
-          memcpy(swap, bp + i * size, size);
-          for(j = i; j > step - 1; j -= step){
-            if(compar(bp + (j - step) * size, swap) < 0) break;
-            memcpy(bp + j * size, bp + (j - step) * size, size);
-          }
-          memcpy(bp + j * size, swap, size);
-        }
-      }
-    }
-    if(step < 2) break;
-  }
-  free(swap);
-}
-
-
-/* Sort an array using heap sort. */
-void cbhsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
-  char *bp, *swap;
-  int top, bottom, mybot, i;
-  assert(base && nmemb >= 0 && size > 0 && compar);
-  bp = (char *)base;
-  nmemb--;
-  bottom = nmemb / 2 + 1;
-  top = nmemb;
-  CB_MALLOC(swap, size);
-  while(bottom > 0){
-    bottom--;
-    mybot = bottom;
-    i = 2 * mybot;
-    while(i <= top) {
-      if(i < top && compar(bp + (i + 1) * size, bp + i * size) > 0) i++;
-      if(compar(bp + mybot * size, bp + i * size) >= 0) break;
-      memcpy(swap, bp + mybot * size, size);
-      memcpy(bp + mybot * size, bp + i * size, size);
-      memcpy(bp + i * size, swap, size);
-      mybot = i;
-      i = 2 * mybot;
-    }
-  }
-  while(top > 0){
-    memcpy(swap, bp, size);
-    memcpy(bp, bp + top * size, size);
-    memcpy(bp + top * size, swap, size);
-    top--;
-    mybot = bottom;
-    i = 2 * mybot;
-    while(i <= top){
-      if(i < top && compar(bp + (i + 1) * size, bp + i * size) > 0) i++;
-      if(compar(bp + mybot * size, bp + i * size) >= 0) break;
-      memcpy(swap, bp + mybot * size, size);
-      memcpy(bp + mybot * size, bp + i * size, size);
-      memcpy(bp + i * size, swap, size);
-      mybot = i;
-      i = 2 * mybot;
-    }
-  }
-  free(swap);
-}
-
-
-/* Sort an array using quick sort. */
-void cbqsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
-  char *pswap, *vswap;
-  assert(base && nmemb >= 0 && size > 0 && compar);
-  CB_MALLOC(pswap, size);
-  CB_MALLOC(vswap, size);
-  cbqsortsub(base, nmemb, size, pswap, vswap, compar);
-  free(vswap);
-  free(pswap);
-}
-
-
-/* Compare two strings with case insensitive evaluation. */
-int cbstricmp(const char *astr, const char *bstr){
-  int ac, bc;
-  assert(astr && bstr);
-  while(*astr != '\0'){
-    if(*bstr == '\0') return 1;
-    ac = (*astr >= 'A' && *astr <= 'Z') ? *astr + ('a' - 'A') : *(unsigned char *)astr;
-    bc = (*bstr >= 'A' && *bstr <= 'Z') ? *bstr + ('a' - 'A') : *(unsigned char *)bstr;
-    if(ac != bc) return ac - bc;
-    astr++;
-    bstr++;
-  }
-  return *bstr == '\0' ? 0 : -1;
-}
-
-
-/* Check whether a string begins with a key. */
-int cbstrfwmatch(const char *str, const char *key){
-  assert(str && key);
-  while(*key != '\0'){
-    if(*str != *key || *str == '\0') return FALSE;
-    key++;
-    str++;
-  }
-  return TRUE;
-}
-
-
-/* Check whether a string begins with a key, with case insensitive evaluation. */
-int cbstrfwimatch(const char *str, const char *key){
-  int sc, kc;
-  assert(str && key);
-  while(*key != '\0'){
-    if(*str == '\0') return FALSE;
-    sc = *str;
-    if(sc >= 'A' && sc <= 'Z') sc += 'a' - 'A';
-    kc = *key;
-    if(kc >= 'A' && kc <= 'Z') kc += 'a' - 'A';
-    if(sc != kc) return FALSE;
-    key++;
-    str++;
-  }
-  return TRUE;
-}
-
-
-/* Check whether a string ends with a key. */
-int cbstrbwmatch(const char *str, const char *key){
-  int slen, klen, i;
-  assert(str && key);
-  slen = strlen(str);
-  klen = strlen(key);
-  for(i = 1; i <= klen; i++){
-    if(i > slen || str[slen-i] != key[klen-i]) return FALSE;
-  }
-  return TRUE;
-}
-
-
-/* Check whether a string ends with a key, with case insensitive evaluation. */
-int cbstrbwimatch(const char *str, const char *key){
-  int slen, klen, i, sc, kc;
-  assert(str && key);
-  slen = strlen(str);
-  klen = strlen(key);
-  for(i = 1; i <= klen; i++){
-    if(i > slen) return FALSE;
-    sc = str[slen-i];
-    if(sc >= 'A' && sc <= 'Z') sc += 'a' - 'A';
-    kc = key[klen-i];
-    if(kc >= 'A' && kc <= 'Z') kc += 'a' - 'A';
-    if(sc != kc) return FALSE;
-  }
-  return TRUE;
-}
-
-
-/* Locate a substring in a string using KMP method. */
-char *cbstrstrkmp(const char *haystack, const char *needle){
-  int i, j, hlen, nlen;
-  signed char tbl[0x100];
-  assert(haystack && needle);
-  nlen = strlen(needle);
-  if(nlen >= 0x100) return strstr(haystack, needle);
-  tbl[0] = -1;
-  i = 0;
-  j = -1;
-  while(i < nlen){
-    while((j >= 0) && (needle[i] != needle[j])){
-      j = tbl[j];
-    }
-    i++;
-    j++;
-    tbl[i] = j;
-  }
-  hlen = strlen(haystack);
-  i = 0;
-  j = 0;
-  while(i < hlen && j < nlen){
-    while((j >= 0) && (haystack[i] != needle[j])){
-      j = tbl[j];
-    }
-    i++;
-    j++;
-  }
-  if(j == nlen) return (char *)(haystack + i - nlen);
-  return NULL;
-}
-
-
-/* Locate a substring in a string using BM method. */
-char *cbstrstrbm(const char *haystack, const char *needle){
-  const unsigned char *rp;
-  const char *ep;
-  unsigned char tbl[0x100];
-  int i, j, nlen, len, idx;
-  assert(haystack && needle);
-  nlen = strlen(needle);
-  if(nlen < 3 || nlen >= 0x100) return strstr(haystack, needle);
-  for(i = 0; i < 0x100; i++){
-    tbl[i] = nlen;
-  }
-  len = nlen;
-  rp = (const unsigned char *)needle;
-  while(len > 0){
-    tbl[*rp++] = --len;
-  }
-  nlen--;
-  ep = haystack + strlen(haystack) - nlen;
-  while(haystack < ep){
-    for(i = nlen; haystack[i] == needle[i]; i--){
-      if(i == 0) return (char *)haystack;
-    }
-    idx = ((unsigned char *)haystack)[i];
-    j = tbl[idx] - nlen + i;
-    haystack += j > 0 ? j : 2;
-  }
-  return NULL;
-}
-
-
-/* Convert the letters of a string to upper case. */
-char *cbstrtoupper(char *str){
-  int i;
-  assert(str);
-  for(i = 0; str[i] != '\0'; i++){
-    if(str[i] >= 'a' && str[i] <= 'z') str[i] -= 'a' - 'A';
-  }
-  return str;
-}
-
-
-/* Convert the letters of a string to lower case. */
-char *cbstrtolower(char *str){
-  int i;
-  assert(str);
-  for(i = 0; str[i] != '\0'; i++){
-    if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 'a' - 'A';
-  }
-  return str;
-}
-
-
-/* Cut space characters at head or tail of a string. */
-char *cbstrtrim(char *str){
-  char *wp;
-  int i, head;
-  assert(str);
-  wp = str;
-  head = TRUE;
-  for(i = 0; str[i] != '\0'; i++){
-    if((str[i] >= 0x07 && str[i] <= 0x0d) || str[i] == 0x20){
-      if(!head) *(wp++) = str[i];
-    } else {
-      *(wp++) = str[i];
-      head = FALSE;
-    }
-  }
-  *wp = '\0';
-  while(wp > str && ((wp[-1] >= 0x07 && wp[-1] <= 0x0d) || wp[-1] == 0x20)){
-    *(--wp) = '\0';
-  }
-  return str;
-}
-
-
-/* Squeeze space characters in a string and trim it. */
-char *cbstrsqzspc(char *str){
-  char *wp;
-  int i, spc;
-  assert(str);
-  wp = str;
-  spc = TRUE;
-  for(i = 0; str[i] != '\0'; i++){
-    if(str[i] > 0 && str[i] <= ' '){
-      if(!spc) *(wp++) = str[i];
-      spc = TRUE;
-    } else {
-      *(wp++) = str[i];
-      spc = FALSE;
-    }
-  }
-  *wp = '\0';
-  for(wp--; wp >= str; wp--){
-    if(*wp > 0 && *wp <= ' '){
-      *wp = '\0';
-    } else {
-      break;
-    }
-  }
-  return str;
-}
-
-
-/* Count the number of characters in a string of UTF-8. */
-int cbstrcountutf(const char *str){
-  const unsigned char *rp;
-  int cnt;
-  assert(str);
-  rp = (unsigned char *)str;
-  cnt = 0;
-  while(*rp != '\0'){
-    if((*rp & 0x80) == 0x00 || (*rp & 0xe0) == 0xc0 ||
-       (*rp & 0xf0) == 0xe0 || (*rp & 0xf8) == 0xf0) cnt++;
-    rp++;
-  }
-  return cnt;
-}
-
-
-/* Cut a string of UTF-8 at the specified number of characters. */
-char *cbstrcututf(char *str, int num){
-  unsigned char *wp;
-  int cnt;
-  assert(str && num >= 0);
-  wp = (unsigned char *)str;
-  cnt = 0;
-  while(*wp != '\0'){
-    if((*wp & 0x80) == 0x00 || (*wp & 0xe0) == 0xc0 ||
-       (*wp & 0xf0) == 0xe0 || (*wp & 0xf8) == 0xf0){
-      cnt++;
-      if(cnt > num){
-        *wp = '\0';
-        break;
-      }
-    }
-    wp++;
-  }
-  return str;
-}
-
-
-/* Get a datum handle. */
-CBDATUM *cbdatumopen(const char *ptr, int size){
-  CBDATUM *datum;
-  CB_MALLOC(datum, sizeof(*datum));
-  CB_MALLOC(datum->dptr, CB_DATUMUNIT);
-  datum->dptr[0] = '\0';
-  datum->dsize = 0;
-  datum->asize = CB_DATUMUNIT;
-  if(ptr) CB_DATUMCAT(datum, ptr, (size >= 0 ? size : strlen(ptr)));
-  return datum;
-}
-
-
-/* Copy a datum. */
-CBDATUM *cbdatumdup(const CBDATUM *datum){
-  assert(datum);
-  return cbdatumopen(datum->dptr, datum->dsize);
-}
-
-
-/* Free a datum handle. */
-void cbdatumclose(CBDATUM *datum){
-  assert(datum);
-  free(datum->dptr);
-  free(datum);
-}
-
-
-/* Concatenate a datum and a region. */
-void cbdatumcat(CBDATUM *datum, const char *ptr, int size){
-  assert(datum && ptr);
-  if(size < 0) size = strlen(ptr);
-  if(datum->dsize + size >= datum->asize){
-    datum->asize = datum->asize * 2 + size + 1;
-    CB_REALLOC(datum->dptr, datum->asize);
-  }
-  memcpy(datum->dptr + datum->dsize, ptr, size);
-  datum->dsize += size;
-  datum->dptr[datum->dsize] = '\0';
-}
-
-
-/* Get the pointer of the region of a datum. */
-const char *cbdatumptr(const CBDATUM *datum){
-  assert(datum);
-  return datum->dptr;
-}
-
-
-/* Get the size of the region of a datum. */
-int cbdatumsize(const CBDATUM *datum){
-  assert(datum);
-  return datum->dsize;
-}
-
-
-/* Set the size of the region of a datum. */
-void cbdatumsetsize(CBDATUM *datum, int size){
-  assert(datum && size >= 0);
-  if(size <= datum->dsize){
-    datum->dsize = size;
-    datum->dptr[size] = '\0';
-  } else {
-    if(size >= datum->asize){
-      datum->asize = datum->asize * 2 + size + 1;
-      CB_REALLOC(datum->dptr, datum->asize);
-    }
-    memset(datum->dptr + datum->dsize, 0, (size - datum->dsize) + 1);
-    datum->dsize = size;
-  }
-}
-
-
-/* Perform formatted output into a datum. */
-void cbdatumprintf(CBDATUM *datum, const char *format, ...){
-  va_list ap;
-  char *tmp, cbuf[CB_NUMBUFSIZ], tbuf[CB_NUMBUFSIZ*2];
-  unsigned char c;
-  int cblen, tlen;
-  assert(datum && format);
-  va_start(ap, format);
-  while(*format != '\0'){
-    if(*format == '%'){
-      cbuf[0] = '%';
-      cblen = 1;
-      format++;
-      while(strchr("0123456789 .+-", *format) && *format != '\0' && cblen < CB_NUMBUFSIZ - 1){
-        cbuf[cblen++] = *format;
-        format++;
-      }
-      cbuf[cblen++] = *format;
-      cbuf[cblen] = '\0';
-      switch(*format){
-      case 's':
-        tmp = va_arg(ap, char *);
-        if(!tmp) tmp = "(null)";
-        cbdatumcat(datum, tmp, -1);
-        break;
-      case 'd':
-        tlen = sprintf(tbuf, cbuf, va_arg(ap, int));
-        cbdatumcat(datum, tbuf, tlen);
-        break;
-      case 'o': case 'u': case 'x': case 'X': case 'c':
-        tlen = sprintf(tbuf, cbuf, va_arg(ap, unsigned int));
-        cbdatumcat(datum, tbuf, tlen);
-        break;
-      case 'e': case 'E': case 'f': case 'g': case 'G':
-        tlen = sprintf(tbuf, cbuf, va_arg(ap, double));
-        cbdatumcat(datum, tbuf, tlen);
-        break;
-      case '@':
-        tmp = va_arg(ap, char *);
-        if(!tmp) tmp = "(null)";
-        while(*tmp){
-          switch(*tmp){
-          case '&': cbdatumcat(datum, "&", 5); break;
-          case '<': cbdatumcat(datum, "<", 4); break;
-          case '>': cbdatumcat(datum, ">", 4); break;
-          case '"': cbdatumcat(datum, """, 6); break;
-          default:
-            if(!((*tmp >= 0 && *tmp <= 0x8) || (*tmp >= 0x0e && *tmp <= 0x1f)))
-              cbdatumcat(datum, tmp, 1);
-            break;
-          }
-          tmp++;
-        }
-        break;
-      case '?':
-        tmp = va_arg(ap, char *);
-        if(!tmp) tmp = "(null)";
-        while(*tmp){
-          c = *(unsigned char *)tmp;
-          if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-             (c >= '0' && c <= '9') || (c != '\0' && strchr("_-.", c))){
-            cbdatumcat(datum, tmp, 1);
-          } else {
-            tlen = sprintf(tbuf, "%%%02X", c);
-            cbdatumcat(datum, tbuf, tlen);
-          }
-          tmp++;
-        }
-        break;
-      case ':':
-        tmp = va_arg(ap, char *);
-        if(!tmp) tmp = "";
-        tmp = cbmimeencode(tmp, "UTF-8", TRUE);
-        cbdatumcat(datum, tmp, -1);
-        free(tmp);
-        break;
-      case '%':
-        cbdatumcat(datum, "%", 1);
-        break;
-      }
-    } else {
-      cbdatumcat(datum, format, 1);
-    }
-    format++;
-  }
-  va_end(ap);
-}
-
-
-/* Convert a datum to an allocated region. */
-char *cbdatumtomalloc(CBDATUM *datum, int *sp){
-  char *ptr;
-  assert(datum);
-  ptr = datum->dptr;
-  if(sp) *sp = datum->dsize;
-  free(datum);
-  return ptr;
-}
-
-
-/* Get a list handle. */
-CBLIST *cblistopen(void){
-  CBLIST *list;
-  CB_MALLOC(list, sizeof(*list));
-  list->anum = CB_LISTUNIT;
-  CB_MALLOC(list->array, sizeof(list->array[0]) * list->anum);
-  list->start = 0;
-  list->num = 0;
-  return list;
-}
-
-
-/* Copy a list. */
-CBLIST *cblistdup(const CBLIST *list){
-  CBLIST *newlist;
-  int i, size;
-  const char *val;
-  assert(list);
-  CB_LISTOPEN2(newlist, CB_LISTNUM(list));
-  for(i = 0; i < CB_LISTNUM(list); i++){
-    val = CB_LISTVAL2(list, i, size);
-    CB_LISTPUSH(newlist, val, size);
-  }
-  return newlist;
-}
-
-
-/* Close a list handle. */
-void cblistclose(CBLIST *list){
-  int i, end;
-  assert(list);
-  end = list->start + list->num;
-  for(i = list->start; i < end; i++){
-    free(list->array[i].dptr);
-  }
-  free(list->array);
-  free(list);
-}
-
-
-/* Get the number of elements of a list. */
-int cblistnum(const CBLIST *list){
-  assert(list);
-  return list->num;
-}
-
-
-/* Get the pointer to the region of an element. */
-const char *cblistval(const CBLIST *list, int index, int *sp){
-  assert(list && index >= 0);
-  if(index >= list->num) return NULL;
-  index += list->start;
-  if(sp) *sp = list->array[index].dsize;
-  return list->array[index].dptr;
-}
-
-
-/* Add an element at the end of a list. */
-void cblistpush(CBLIST *list, const char *ptr, int size){
-  int index;
-  assert(list && ptr);
-  if(size < 0) size = strlen(ptr);
-  index = list->start + list->num;
-  if(index >= list->anum){
-    list->anum *= 2;
-    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
-  }
-  CB_MALLOC(list->array[index].dptr, (size < CB_DATUMUNIT ? CB_DATUMUNIT : size) + 1);
-  memcpy(list->array[index].dptr, ptr, size);
-  list->array[index].dptr[size] = '\0';
-  list->array[index].dsize = size;
-  list->num++;
-}
-
-
-/* Remove an element of the end of a list. */
-char *cblistpop(CBLIST *list, int *sp){
-  int index;
-  assert(list);
-  if(list->num < 1) return NULL;
-  index = list->start + list->num - 1;
-  list->num--;
-  if(sp) *sp = list->array[index].dsize;
-  return list->array[index].dptr;
-}
-
-
-/* Add an element at the top of a list. */
-void cblistunshift(CBLIST *list, const char *ptr, int size){
-  int index;
-  assert(list && ptr);
-  if(size < 0) size = strlen(ptr);
-  if(list->start < 1){
-    if(list->start + list->num >= list->anum){
-      list->anum *= 2;
-      CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
-    }
-    list->start = list->anum - list->num;
-    memmove(list->array + list->start, list->array, list->num * sizeof(list->array[0]));
-  }
-  index = list->start - 1;
-  CB_MALLOC(list->array[index].dptr, (size < CB_DATUMUNIT ? CB_DATUMUNIT : size) + 1);
-  memcpy(list->array[index].dptr, ptr, size);
-  list->array[index].dptr[size] = '\0';
-  list->array[index].dsize = size;
-  list->start--;
-  list->num++;
-}
-
-
-/* Remove an element of the top of a list. */
-char *cblistshift(CBLIST *list, int *sp){
-  int index;
-  assert(list);
-  if(list->num < 1) return NULL;
-  index = list->start;
-  list->start++;
-  list->num--;
-  if(sp) *sp = list->array[index].dsize;
-  return list->array[index].dptr;
-}
-
-
-/* Add an element at the specified location of a list. */
-void cblistinsert(CBLIST *list, int index, const char *ptr, int size){
-  assert(list && index >= 0);
-  if(index > list->num) return;
-  if(size < 0) size = strlen(ptr);
-  index += list->start;
-  if(list->start + list->num >= list->anum){
-    list->anum *= 2;
-    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
-  }
-  memmove(list->array + index + 1, list->array + index,
-          sizeof(list->array[0]) * (list->start + list->num - index));
-  CB_MEMDUP(list->array[index].dptr, ptr, size);
-  list->array[index].dsize = size;
-  list->num++;
-}
-
-
-/* Remove an element at the specified location of a list. */
-char *cblistremove(CBLIST *list, int index, int *sp){
-  char *dptr;
-  assert(list && index >= 0);
-  if(index >= list->num) return NULL;
-  index += list->start;
-  dptr = list->array[index].dptr;
-  if(sp) *sp = list->array[index].dsize;
-  list->num--;
-  memmove(list->array + index, list->array + index + 1,
-          sizeof(list->array[0]) * (list->start + list->num - index));
-  return dptr;
-}
-
-
-/* Overwrite an element at the specified location of a list. */
-void cblistover(CBLIST *list, int index, const char *ptr, int size){
-  assert(list && index >= 0);
-  if(index >= list->num) return;
-  if(size < 0) size = strlen(ptr);
-  index += list->start;
-  if(size > list->array[index].dsize)
-    CB_REALLOC(list->array[index].dptr, size + 1);
-  memcpy(list->array[index].dptr, ptr, size);
-  list->array[index].dsize = size;
-  list->array[index].dptr[size] = '\0';
-}
-
-
-/* Sort elements of a list in lexical order. */
-void cblistsort(CBLIST *list){
-  assert(list);
-  qsort(list->array + list->start, list->num, sizeof(list->array[0]), cblistelemcmp);
-}
-
-
-/* Search a list for an element using liner search. */
-int cblistlsearch(const CBLIST *list, const char *ptr, int size){
-  int i, end;
-  assert(list && ptr);
-  if(size < 0) size = strlen(ptr);
-  end = list->start + list->num;
-  for(i = list->start; i < end; i++){
-    if(list->array[i].dsize == size && !memcmp(list->array[i].dptr, ptr, size))
-      return i - list->start;
-  }
-  return -1;
-}
-
-
-/* Search a list for an element using binary search. */
-int cblistbsearch(const CBLIST *list, const char *ptr, int size){
-  CBLISTDATUM key, *res;
-  assert(list && ptr);
-  if(size < 0) size = strlen(ptr);
-  CB_MEMDUP(key.dptr, ptr, size);
-  key.dsize = size;
-  res = bsearch(&key, list->array + list->start, list->num, sizeof(list->array[0]), cblistelemcmp);
-  free(key.dptr);
-  return res ? (res - list->array - list->start) : -1;
-}
-
-
-/* Serialize a list into a byte array. */
-char *cblistdump(const CBLIST *list, int *sp){
-  char *buf, vnumbuf[CB_VNUMBUFSIZ];
-  const char *vbuf;
-  int i, bsiz, vnumsiz, ln, vsiz;
-  assert(list && sp);
-  ln = CB_LISTNUM(list);
-  CB_SETVNUMBUF(vnumsiz, vnumbuf, ln);
-  CB_MALLOC(buf, vnumsiz + 1);
-  memcpy(buf, vnumbuf, vnumsiz);
-  bsiz = vnumsiz;
-  for(i = 0; i < ln; i++){
-    vbuf = CB_LISTVAL2(list, i, vsiz);
-    CB_SETVNUMBUF(vnumsiz, vnumbuf, vsiz);
-    CB_REALLOC(buf, bsiz + vnumsiz + vsiz + 1);
-    memcpy(buf + bsiz, vnumbuf, vnumsiz);
-    bsiz += vnumsiz;
-    memcpy(buf + bsiz, vbuf, vsiz);
-    bsiz += vsiz;
-  }
-  *sp = bsiz;
-  return buf;
-}
-
-
-/* Redintegrate a serialized list. */
-CBLIST *cblistload(const char *ptr, int size){
-  CBLIST *list;
-  const char *rp;
-  int i, anum, step, ln, vsiz;
-  assert(ptr && size >= 0);
-  anum = size / (sizeof(CBLISTDATUM) + 1);
-  CB_LISTOPEN2(list, anum);
-  rp = ptr;
-  CB_READVNUMBUF(rp, size, ln, step);
-  rp += step;
-  size -= step;
-  if(ln > size) return list;
-  for(i = 0; i < ln; i++){
-    if(size < 1) break;
-    CB_READVNUMBUF(rp, size, vsiz, step);
-    rp += step;
-    size -= step;
-    if(vsiz > size) break;
-    CB_LISTPUSH(list, rp, vsiz);
-    rp += vsiz;
-  }
-  return list;
-}
-
-
-/* Get a map handle. */
-CBMAP *cbmapopen(void){
-  return cbmapopenex(CB_MAPBNUM);
-}
-
-
-/* Copy a map. */
-CBMAP *cbmapdup(CBMAP *map){
-  CBMAP *newmap;
-  const char *kbuf, *vbuf;
-  int ksiz, vsiz;
-  assert(map);
-  cbmapiterinit(map);
-  newmap = map->rnum > CB_MAPPBNUM ? cbmapopen() : cbmapopenex(CB_MAPPBNUM);
-  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
-    CB_MAPITERVAL(vbuf, kbuf, vsiz);
-    cbmapput(newmap, kbuf, ksiz, vbuf, vsiz, FALSE);
-  }
-  cbmapiterinit(map);
-  return newmap;
-}
-
-
-/* Close a map handle. */
-void cbmapclose(CBMAP *map){
-  CBMAPDATUM *datum, *next;
-  datum = map->first;
-  while(datum){
-    next = datum->next;
-    free(datum);
-    datum = next;
-  }
-  free(map->buckets);
-  free(map);
-}
-
-
-/* Store a record. */
-int cbmapput(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int over){
-  CBMAPDATUM *datum, **entp, *old;
-  char *dbuf;
-  int bidx, hash, kcmp, psiz;
-  assert(map && kbuf && vbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  if(vsiz < 0) vsiz = strlen(vbuf);
-  CB_FIRSTHASH(hash, kbuf, ksiz);
-  bidx = hash % map->bnum;
-  datum = map->buckets[bidx];
-  entp = map->buckets + bidx;
-  CB_SECONDHASH(hash, kbuf, ksiz);
-  while(datum){
-    if(hash > datum->hash){
-      entp = &(datum->left);
-      datum = datum->left;
-    } else if(hash < datum->hash){
-      entp = &(datum->right);
-      datum = datum->right;
-    } else {
-      dbuf = (char *)datum + sizeof(*datum);
-      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-      if(kcmp < 0){
-        entp = &(datum->left);
-        datum = datum->left;
-      } else if(kcmp > 0){
-        entp = &(datum->right);
-        datum = datum->right;
-      } else {
-        if(!over) return FALSE;
-        psiz = CB_ALIGNPAD(ksiz);
-        if(vsiz > datum->vsiz){
-          old = datum;
-          CB_REALLOC(datum, sizeof(*datum) + ksiz + psiz + vsiz + 1);
-          if(datum != old){
-            if(map->first == old) map->first = datum;
-            if(map->last == old) map->last = datum;
-            if(*entp == old) *entp = datum;
-            if(datum->prev) datum->prev->next = datum;
-            if(datum->next) datum->next->prev = datum;
-            dbuf = (char *)datum + sizeof(*datum);
-          }
-        }
-        memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
-        dbuf[ksiz+psiz+vsiz] = '\0';
-        datum->vsiz = vsiz;
-        return TRUE;
-      }
-    }
-  }
-  psiz = CB_ALIGNPAD(ksiz);
-  CB_MALLOC(datum, sizeof(*datum) + ksiz + psiz + vsiz + 1);
-  dbuf = (char *)datum + sizeof(*datum);
-  memcpy(dbuf, kbuf, ksiz);
-  dbuf[ksiz] = '\0';
-  datum->ksiz = ksiz;
-  memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
-  dbuf[ksiz+psiz+vsiz] = '\0';
-  datum->vsiz = vsiz;
-  datum->hash = hash;
-  datum->left = NULL;
-  datum->right = NULL;
-  datum->prev = map->last;
-  datum->next = NULL;
-  *entp = datum;
-  if(!map->first) map->first = datum;
-  if(map->last) map->last->next = datum;
-  map->last = datum;
-  map->rnum++;
-  return TRUE;
-}
-
-
-/* Concatenate a value at the end of the value of the existing record. */
-void cbmapputcat(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz){
-  CBMAPDATUM *datum, **entp, *old;
-  char *dbuf;
-  int bidx, hash, kcmp, psiz, asiz, unit;
-  assert(map && kbuf && vbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  if(vsiz < 0) vsiz = strlen(vbuf);
-  CB_FIRSTHASH(hash, kbuf, ksiz);
-  bidx = hash % map->bnum;
-  datum = map->buckets[bidx];
-  entp = map->buckets + bidx;
-  CB_SECONDHASH(hash, kbuf, ksiz);
-  while(datum){
-    if(hash > datum->hash){
-      entp = &(datum->left);
-      datum = datum->left;
-    } else if(hash < datum->hash){
-      entp = &(datum->right);
-      datum = datum->right;
-    } else {
-      dbuf = (char *)datum + sizeof(*datum);
-      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-      if(kcmp < 0){
-        entp = &(datum->left);
-        datum = datum->left;
-      } else if(kcmp > 0){
-        entp = &(datum->right);
-        datum = datum->right;
-      } else {
-        psiz = CB_ALIGNPAD(ksiz);
-        asiz = sizeof(*datum) + ksiz + psiz + datum->vsiz + vsiz + 1;
-        unit = asiz <= CB_MAPCSUNIT ? CB_MAPCSUNIT : CB_MAPCBUNIT;
-        asiz = (asiz - 1) + unit - (asiz - 1) % unit;
-        old = datum;
-        CB_REALLOC(datum, asiz);
-        if(datum != old){
-          if(map->first == old) map->first = datum;
-          if(map->last == old) map->last = datum;
-          if(*entp == old) *entp = datum;
-          if(datum->prev) datum->prev->next = datum;
-          if(datum->next) datum->next->prev = datum;
-          dbuf = (char *)datum + sizeof(*datum);
-        }
-        memcpy(dbuf + ksiz + psiz + datum->vsiz, vbuf, vsiz);
-        dbuf[ksiz+psiz+datum->vsiz+vsiz] = '\0';
-        datum->vsiz += vsiz;
-        return;
-      }
-    }
-  }
-  psiz = CB_ALIGNPAD(ksiz);
-  asiz = sizeof(*datum) + ksiz + psiz + vsiz + 1;
-  unit = asiz <= CB_MAPCSUNIT ? CB_MAPCSUNIT : CB_MAPCBUNIT;
-  asiz = (asiz - 1) + unit - (asiz - 1) % unit;
-  CB_MALLOC(datum, asiz);
-  dbuf = (char *)datum + sizeof(*datum);
-  memcpy(dbuf, kbuf, ksiz);
-  dbuf[ksiz] = '\0';
-  datum->ksiz = ksiz;
-  memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
-  dbuf[ksiz+psiz+vsiz] = '\0';
-  datum->vsiz = vsiz;
-  datum->hash = hash;
-  datum->left = NULL;
-  datum->right = NULL;
-  datum->prev = map->last;
-  datum->next = NULL;
-  *entp = datum;
-  if(!map->first) map->first = datum;
-  if(map->last) map->last->next = datum;
-  map->last = datum;
-  map->rnum++;
-}
-
-
-/* Delete a record. */
-int cbmapout(CBMAP *map, const char *kbuf, int ksiz){
-  CBMAPDATUM *datum, **entp, *tmp;
-  char *dbuf;
-  int bidx, hash, kcmp;
-  assert(map && kbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  CB_FIRSTHASH(hash, kbuf, ksiz);
-  bidx = hash % map->bnum;
-  datum = map->buckets[bidx];
-  entp = map->buckets + bidx;
-  CB_SECONDHASH(hash, kbuf, ksiz);
-  while(datum){
-    if(hash > datum->hash){
-      entp = &(datum->left);
-      datum = datum->left;
-    } else if(hash < datum->hash){
-      entp = &(datum->right);
-      datum = datum->right;
-    } else {
-      dbuf = (char *)datum + sizeof(*datum);
-      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-      if(kcmp < 0){
-        entp = &(datum->left);
-        datum = datum->left;
-      } else if(kcmp > 0){
-        entp = &(datum->right);
-        datum = datum->right;
-      } else {
-        if(datum->prev) datum->prev->next = datum->next;
-        if(datum->next) datum->next->prev = datum->prev;
-        if(datum == map->first) map->first = datum->next;
-        if(datum == map->last) map->last = datum->prev;
-        if(datum->left && !datum->right){
-          *entp = datum->left;
-        } else if(!datum->left && datum->right){
-          *entp = datum->right;
-        } else if(!datum->left && !datum->left){
-          *entp = NULL;
-        } else {
-          *entp = datum->left;
-          tmp = *entp;
-          while(TRUE){
-            if(hash > tmp->hash){
-              if(tmp->left){
-                tmp = tmp->left;
-              } else {
-                tmp->left = datum->right;
-                break;
-              }
-            } else if(hash < tmp->hash){
-              if(tmp->right){
-                tmp = tmp->right;
-              } else {
-                tmp->right = datum->right;
-                break;
-              }
-            } else {
-              kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-              if(kcmp < 0){
-                if(tmp->left){
-                  tmp = tmp->left;
-                } else {
-                  tmp->left = datum->right;
-                  break;
-                }
-              } else {
-                if(tmp->right){
-                  tmp = tmp->right;
-                } else {
-                  tmp->right = datum->right;
-                  break;
-                }
-              }
-            }
-          }
-        }
-        free(datum);
-        map->rnum--;
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
-
-
-/* Retrieve a record. */
-const char *cbmapget(const CBMAP *map, const char *kbuf, int ksiz, int *sp){
-  CBMAPDATUM *datum;
-  char *dbuf;
-  int hash, kcmp;
-  assert(map && kbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  CB_FIRSTHASH(hash, kbuf, ksiz);
-  datum = map->buckets[hash%map->bnum];
-  CB_SECONDHASH(hash, kbuf, ksiz);
-  while(datum){
-    if(hash > datum->hash){
-      datum = datum->left;
-    } else if(hash < datum->hash){
-      datum = datum->right;
-    } else {
-      dbuf = (char *)datum + sizeof(*datum);
-      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-      if(kcmp < 0){
-        datum = datum->left;
-      } else if(kcmp > 0){
-        datum = datum->right;
-      } else {
-        if(sp) *sp = datum->vsiz;
-        return dbuf + datum->ksiz + CB_ALIGNPAD(datum->ksiz);
-      }
-    }
-  }
-  return NULL;
-}
-
-
-/* Move a record to the edge. */
-int cbmapmove(CBMAP *map, const char *kbuf, int ksiz, int head){
-  CBMAPDATUM *datum;
-  char *dbuf;
-  int hash, kcmp;
-  assert(map && kbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  CB_FIRSTHASH(hash, kbuf, ksiz);
-  datum = map->buckets[hash%map->bnum];
-  CB_SECONDHASH(hash, kbuf, ksiz);
-  while(datum){
-    if(hash > datum->hash){
-      datum = datum->left;
-    } else if(hash < datum->hash){
-      datum = datum->right;
-    } else {
-      dbuf = (char *)datum + sizeof(*datum);
-      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
-      if(kcmp < 0){
-        datum = datum->left;
-      } else if(kcmp > 0){
-        datum = datum->right;
-      } else {
-        if(head){
-          if(map->first == datum) return TRUE;
-          if(map->last == datum) map->last = datum->prev;
-          if(datum->prev) datum->prev->next = datum->next;
-          if(datum->next) datum->next->prev = datum->prev;
-          datum->prev = NULL;
-          datum->next = map->first;
-          map->first->prev = datum;
-          map->first = datum;
-        } else {
-          if(map->last == datum) return TRUE;
-          if(map->first == datum) map->first = datum->next;
-          if(datum->prev) datum->prev->next = datum->next;
-          if(datum->next) datum->next->prev = datum->prev;
-          datum->prev = map->last;
-          datum->next = NULL;
-          map->last->next = datum;
-          map->last = datum;
-        }
-        return TRUE;
-      }
-    }
-  }
-  return FALSE;
-}
-
-
-/* Initialize the iterator of a map handle. */
-void cbmapiterinit(CBMAP *map){
-  assert(map);
-  map->cur = map->first;
-}
-
-
-/* Get the next key of the iterator. */
-const char *cbmapiternext(CBMAP *map, int *sp){
-  CBMAPDATUM *datum;
-  assert(map);
-  if(!map->cur) return NULL;
-  datum = map->cur;
-  map->cur = datum->next;
-  if(sp) *sp = datum->ksiz;
-  return (char *)datum + sizeof(*datum);
-}
-
-
-/* Get the value binded to the key fetched from the iterator. */
-const char *cbmapiterval(const char *kbuf, int *sp){
-  CBMAPDATUM *datum;
-  assert(kbuf);
-  datum = (CBMAPDATUM *)(kbuf - sizeof(*datum));
-  if(sp) *sp = datum->vsiz;
-  return (char *)datum + sizeof(*datum) + datum->ksiz + CB_ALIGNPAD(datum->ksiz);
-}
-
-
-/* Get the number of the records stored in a map. */
-int cbmaprnum(const CBMAP *map){
-  assert(map);
-  return map->rnum;
-}
-
-
-/* Get the list handle contains all keys in a map. */
-CBLIST *cbmapkeys(CBMAP *map){
-  CBLIST *list;
-  const char *kbuf;
-  int anum, ksiz;
-  assert(map);
-  anum = cbmaprnum(map);
-  CB_LISTOPEN2(list, anum);
-  cbmapiterinit(map);
-  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
-    CB_LISTPUSH(list, kbuf, ksiz);
-  }
-  return list;
-}
-
-
-/* Get the list handle contains all values in a map. */
-CBLIST *cbmapvals(CBMAP *map){
-  CBLIST *list;
-  const char *kbuf, *vbuf;
-  int anum, ksiz, vsiz;
-  assert(map);
-  anum = cbmaprnum(map);
-  CB_LISTOPEN2(list, anum);
-  cbmapiterinit(map);
-  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
-    CB_MAPITERVAL(vbuf, kbuf, vsiz);
-    CB_LISTPUSH(list, vbuf, vsiz);
-  }
-  return list;
-}
-
-
-/* Serialize a map into a byte array. */
-char *cbmapdump(CBMAP *map, int *sp){
-  char *buf, vnumbuf[CB_VNUMBUFSIZ];
-  const char *kbuf, *vbuf;
-  int bsiz, vnumsiz, rn, ksiz, vsiz;
-  assert(map && sp);
-  rn = cbmaprnum(map);
-  CB_SETVNUMBUF(vnumsiz, vnumbuf, rn);
-  CB_MALLOC(buf, vnumsiz + 1);
-  memcpy(buf, vnumbuf, vnumsiz);
-  bsiz = vnumsiz;
-  cbmapiterinit(map);
-  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
-    CB_MAPITERVAL(vbuf, kbuf, vsiz);
-    CB_SETVNUMBUF(vnumsiz, vnumbuf, ksiz);
-    CB_REALLOC(buf, bsiz + vnumsiz + ksiz + 1);
-    memcpy(buf + bsiz, vnumbuf, vnumsiz);
-    bsiz += vnumsiz;
-    memcpy(buf + bsiz, kbuf, ksiz);
-    bsiz += ksiz;
-    CB_SETVNUMBUF(vnumsiz, vnumbuf, vsiz);
-    CB_REALLOC(buf, bsiz + vnumsiz + vsiz + 1);
-    memcpy(buf + bsiz, vnumbuf, vnumsiz);
-    bsiz += vnumsiz;
-    memcpy(buf + bsiz, vbuf, vsiz);
-    bsiz += vsiz;
-  }
-  *sp = bsiz;
-  return buf;
-}
-
-
-/* Redintegrate a serialized map. */
-CBMAP *cbmapload(const char *ptr, int size){
-  CBMAP *map;
-  const char *rp, *kbuf, *vbuf;
-  int i, step, rn, ksiz, vsiz;
-  assert(ptr && size >= 0);
-  map = cbmapopenex(CB_MAPPBNUM);
-  rp = ptr;
-  CB_READVNUMBUF(rp, size, rn, step);
-  rp += step;
-  size -= step;
-  if(rn > size) return map;
-  for(i = 0; i < rn; i++){
-    if(size < 1) break;
-    CB_READVNUMBUF(rp, size, ksiz, step);
-    rp += step;
-    size -= step;
-    if(ksiz > size) break;
-    kbuf = rp;
-    rp += ksiz;
-    if(size < 1) break;
-    CB_READVNUMBUF(rp, size, vsiz, step);
-    rp += step;
-    size -= step;
-    if(vsiz > size) break;
-    vbuf = rp;
-    rp += vsiz;
-    cbmapput(map, kbuf, ksiz, vbuf, vsiz, TRUE);
-  }
-  return map;
-}
-
-
-/* Redintegrate a serialized map and get one of the records. */
-char *cbmaploadone(const char *ptr, int size, const char *kbuf, int ksiz, int *sp){
-  const char *rp, *tkbuf, *vbuf;
-  char *rv;
-  int i, step, rn, tksiz, vsiz;
-  assert(ptr && size >= 0 && kbuf);
-  if(ksiz < 0) ksiz = strlen(kbuf);
-  rp = ptr;
-  CB_READVNUMBUF(rp, size, rn, step);
-  rp += step;
-  size -= step;
-  if(rn > size) return NULL;
-  for(i = 0; i < rn; i++){
-    if(size < 1) break;
-    CB_READVNUMBUF(rp, size, tksiz, step);
-    rp += step;
-    size -= step;
-    if(tksiz > size) break;
-    tkbuf = rp;
-    rp += tksiz;
-    if(size < 1) break;
-    CB_READVNUMBUF(rp, size, vsiz, step);
-    rp += step;
-    size -= step;
-    if(vsiz > size) break;
-    vbuf = rp;
-    rp += vsiz;
-    if(tksiz == ksiz && !memcmp(tkbuf, kbuf, ksiz)){
-      if(sp) *sp = vsiz;
-      CB_MEMDUP(rv, vbuf, vsiz);
-      return rv;
-    }
-  }
-  return NULL;
-}
-
-
-/* Get a heap handle. */
-CBHEAP *cbheapopen(int size, int max, int(*compar)(const void *, const void *)){
-  CBHEAP *heap;
-  assert(size > 0 && max >= 0 && compar);
-  CB_MALLOC(heap, sizeof(*heap));
-  CB_MALLOC(heap->base, size * max + 1);
-  CB_MALLOC(heap->swap, size);
-  heap->size = size;
-  heap->num = 0;
-  heap->max = max;
-  heap->compar = compar;
-  return heap;
-}
-
-
-/* Copy a heap. */
-CBHEAP *cbheapdup(CBHEAP *heap){
-  CBHEAP *newheap;
-  assert(heap);
-  CB_MALLOC(newheap, sizeof(*newheap));
-  CB_MEMDUP(newheap->base, heap->base, heap->size * heap->max);
-  CB_MALLOC(newheap->swap, heap->size);
-  newheap->size = heap->size;
-  newheap->num = heap->num;
-  newheap->max = heap->max;
-  newheap->compar = heap->compar;
-  return newheap;
-}
-
-
-/* Close a heap handle. */
-void cbheapclose(CBHEAP *heap){
-  assert(heap);
-  free(heap->swap);
-  free(heap->base);
-  free(heap);
-}
-
-
-/* Get the number of the records stored in a heap. */
-int cbheapnum(CBHEAP *heap){
-  assert(heap);
-  return heap->num;
-}
-
-
-/* Insert a record into a heap. */
-int cbheapinsert(CBHEAP *heap, const void *ptr){
-  char *base;
-  int size, pidx, cidx, bot;
-  assert(heap && ptr);
-  if(heap->max < 1) return FALSE;
-  base = heap->base;
-  size = heap->size;
-  if(heap->num >= heap->max){
-    if(heap->compar(ptr, base) > 0) return FALSE;
-    memcpy(base, ptr, size);
-    pidx = 0;
-    bot = heap->num / 2;
-    while(pidx < bot){
-      cidx = pidx * 2 + 1;
-      if(cidx < heap->num - 1 && heap->compar(base + cidx * size, base + (cidx + 1) * size) < 0)
-        cidx++;
-      if(heap->compar(base + pidx * size, base + cidx * size) > 0) break;
-      memcpy(heap->swap, base + pidx * size, size);
-      memcpy(base + pidx * size, base + cidx * size, size);
-      memcpy(base + cidx * size, heap->swap, size);
-      pidx = cidx;
-    }
-  } else {
-    memcpy(base + size * heap->num, ptr, size);
-    cidx = heap->num;
-    while(cidx > 0){
-      pidx = (cidx - 1) / 2;
-      if(heap->compar(base + cidx * size, base + pidx * size) <= 0) break;
-      memcpy(heap->swap, base + cidx * size, size);
-      memcpy(base + cidx * size, base + pidx * size, size);
-      memcpy(base + pidx * size, heap->swap, size);
-      cidx = pidx;
-    }
-    heap->num++;
-  }
-  return TRUE;
-}
-
-
-/* Get the pointer to the region of a record in a heap. */
-const void *cbheapval(CBHEAP *heap, int index){
-  assert(heap && index >= 0);
-  if(index >= heap->num) return NULL;
-  return heap->base + index * heap->size;
-}
-
-
-/* Convert a heap to an allocated region. */
-void *cbheaptomalloc(CBHEAP *heap, int *np){
-  char *ptr;
-  assert(heap);
-  qsort(heap->base, heap->num, heap->size, heap->compar);
-  ptr = heap->base;
-  if(np) *np = heap->num;
-  free(heap->swap);
-  free(heap);
-  return ptr;
-}
-
-
-/* Allocate a formatted string on memory. */
-char *cbsprintf(const char *format, ...){
-  va_list ap;
-  char *buf, cbuf[CB_SPBUFSIZ], *str;
-  int len, cblen, num, slen;
-  unsigned int unum;
-  double dnum;
-  va_start(ap, format);
-  assert(format);
-  CB_MALLOC(buf, 1);
-  len = 0;
-  while(*format != '\0'){
-    if(*format == '%'){
-      cbuf[0] = '%';
-      cblen = 1;
-      format++;
-      while(strchr("0123456789 .+-", *format) && *format != '\0' && cblen < CB_SPBUFSIZ - 1){
-        cbuf[cblen++] = *format;
-        format++;
-      }
-      cbuf[cblen] = '\0';
-      if(atoi(cbuf + 1) > CB_SPMAXWIDTH - 16){
-        sprintf(cbuf, "(err)");
-      } else {
-        cbuf[cblen++] = *format;
-        cbuf[cblen] = '\0';
-      }
-      switch(*format){
-      case 'd':
-        num = va_arg(ap, int);
-        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
-        len += sprintf(buf + len, cbuf, num);
-        break;
-      case 'o': case 'u': case 'x': case 'X': case 'c':
-        unum = va_arg(ap, unsigned int);
-        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
-        len += sprintf(buf + len, cbuf, unum);
-        break;
-      case 'e': case 'E': case 'f': case 'g': case 'G':
-        dnum = va_arg(ap, double);
-        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
-        len += sprintf(buf + len, cbuf, dnum);
-        break;
-      case 's':
-        str = va_arg(ap, char *);
-        slen = strlen(str);
-        CB_REALLOC(buf, len + slen + 2);
-        memcpy(buf + len, str, slen);
-        len += slen;
-        break;
-      case '%':
-        CB_REALLOC(buf, len + 2);
-        buf[len++] = '%';
-        break;
-      default:
-        break;
-      }
-    } else {
-      CB_REALLOC(buf, len + 2);
-      buf[len++] = *format;
-    }
-    format++;
-  }
-  buf[len] = '\0';
-  va_end(ap);
-  return buf;
-}
-
-
-/* Replace some patterns in a string. */
-char *cbreplace(const char *str, CBMAP *pairs){
-  int i, bsiz, wi, rep, ksiz, vsiz;
-  char *buf;
-  const char *key, *val;
-  assert(str && pairs);
-  bsiz = CB_DATUMUNIT;
-  CB_MALLOC(buf, bsiz);
-  wi = 0;
-  while(*str != '\0'){
-    rep = FALSE;
-    cbmapiterinit(pairs);
-    while((key = cbmapiternext(pairs, &ksiz)) != NULL){
-      for(i = 0; i < ksiz; i++){
-        if(str[i] == '\0' || str[i] != key[i]) break;
-      }
-      if(i == ksiz){
-        CB_MAPITERVAL(val, key, vsiz);
-        if(wi + vsiz >= bsiz){
-          bsiz = bsiz * 2 + vsiz;
-          CB_REALLOC(buf, bsiz);
-        }
-        memcpy(buf + wi, val, vsiz);
-        wi += vsiz;
-        str += ksiz;
-        rep = TRUE;
-        break;
-      }
-    }
-    if(!rep){
-      if(wi + 1 >= bsiz){
-        bsiz = bsiz * 2 + 1;
-        CB_REALLOC(buf, bsiz);
-      }
-      buf[wi++] = *str;
-      str++;
-    }
-  }
-  CB_REALLOC(buf, wi + 1);
-  buf[wi] = '\0';
-  return buf;
-}
-
-
-/* Make a list by split a serial datum. */
-CBLIST *cbsplit(const char *ptr, int size, const char *delim){
-  CBLIST *list;
-  int bi, step;
-  assert(ptr);
-  CB_LISTOPEN(list);
-  if(size < 0) size = strlen(ptr);
-  if(delim){
-    for(bi = 0; bi < size; bi += step){
-      step = 0;
-      while(bi + step < size && !strchr(delim, ptr[bi+step])){
-        step++;
-      }
-      cblistpush(list, ptr + bi, step);
-      step++;
-    }
-    if(size > 0 && strchr(delim, ptr[size-1])) cblistpush(list, "", 0);
-  } else {
-    for(bi = 0; bi < size; bi += step){
-      step = 0;
-      while(bi + step < size && ptr[bi+step]){
-        step++;
-      }
-      cblistpush(list, ptr + bi, step);
-      step++;
-    }
-    if(size > 0 && ptr[size-1] == 0) cblistpush(list, "", 0);
-  }
-  return list;
-}
-
-
-/* Read whole data of a file. */
-char *cbreadfile(const char *name, int *sp){
-  struct stat sbuf;
-  char iobuf[CB_IOBUFSIZ], *buf;
-  int fd, size, asiz, rv;
-  asiz = CB_IOBUFSIZ * 2;
-  if(name){
-    if((fd = open(name, O_RDONLY, 0)) == -1) return NULL;
-    if(fstat(fd, &sbuf) != -1) asiz = sbuf.st_size + 1;
-  } else {
-    fd = 0;
-  }
-  CB_MALLOC(buf, asiz + 1);
-  size = 0;
-  while((rv = read(fd, iobuf, CB_IOBUFSIZ)) > 0){
-    if(size + rv >= asiz){
-      asiz = asiz * 2 + size;
-      CB_REALLOC(buf, asiz + 1);
-    }
-    memcpy(buf + size, iobuf, rv);
-    size += rv;
-  }
-  buf[size] = '\0';
-  if(close(fd) == -1 || rv == -1){
-    free(buf);
-    return NULL;
-  }
-  if(sp) *sp = size;
-  return buf;
-}
-
-
-/* Write data of a region into a file. */
-int cbwritefile(const char *name, const char *ptr, int size){
-  int fd, err, wb;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  if(name){
-    if((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, CB_FILEMODE)) == -1) return FALSE;
-  } else {
-    fd = 1;
-  }
-  err = FALSE;
-  wb = 0;
-  do {
-    wb = write(fd, ptr, size);
-    switch(wb){
-    case -1: err = errno != EINTR ? TRUE : FALSE; break;
-    case 0: break;
-    default:
-      ptr += wb;
-      size -= wb;
-      break;
-    }
-  } while(size > 0);
-  if(close(fd) == -1) err = TRUE;
-  return err ? FALSE : TRUE;
-}
-
-
-/* Read every line of a file. */
-CBLIST *cbreadlines(const char *name){
-  char *buf, *tmp;
-  int vsiz;
-  CBMAP *pairs;
-  CBLIST *list;
-  if(!(buf = cbreadfile(name, NULL))) return NULL;
-  pairs = cbmapopenex(3);
-  cbmapput(pairs, "\r\n", 2, "\n", 1, TRUE);
-  cbmapput(pairs, "\r", 1, "\n", 1, TRUE);
-  tmp = cbreplace(buf, pairs);
-  list = cbsplit(tmp, strlen(tmp), "\n");
-  free(tmp);
-  cbmapclose(pairs);
-  free(buf);
-  if(CB_LISTNUM(list) > 0){
-    cblistval(list, CB_LISTNUM(list) - 1, &vsiz);
-    if(vsiz < 1) CB_LISTDROP(list);
-  }
-  return list;
-}
-
-
-/* Read names of files in a directory. */
-CBLIST *cbdirlist(const char *name){
-  DIR *DD;
-  struct dirent *dp;
-  CBLIST *list;
-  assert(name);
-  if(!(DD = opendir(name))) return NULL;
-  CB_LISTOPEN(list);
-  while((dp = readdir(DD)) != NULL){
-    CB_LISTPUSH(list, dp->d_name, strlen(dp->d_name));
-  }
-  if(closedir(DD) == -1){
-    CB_LISTCLOSE(list);
-    return NULL;
-  }
-  return list;
-}
-
-
-/* Get the status of a file or a directory. */
-int cbfilestat(const char *name, int *isdirp, int *sizep, time_t *mtimep){
-  struct stat sbuf;
-  assert(name);
-  if(lstat(name, &sbuf) == -1) return FALSE;
-  if(isdirp) *isdirp = S_ISDIR(sbuf.st_mode);
-  if(sizep) *sizep = (int)sbuf.st_size;
-  if(mtimep) *mtimep = sbuf.st_mtime;
-  return TRUE;
-}
-
-
-/* Remove a file or a directory and its sub ones recursively. */
-int cbremove(const char *name){
-  CBLIST *list;
-  const char *elem;
-  char *path;
-  int i, err, tail;
-  struct stat sbuf;
-  assert(name);
-  if(lstat(name, &sbuf) == -1) return FALSE;
-  if(unlink(name) == 0) return TRUE;
-  if(!S_ISDIR(sbuf.st_mode) || !(list = cbdirlist(name))) return FALSE;
-  err = FALSE;
-  tail = name[0] != '\0' && name[strlen(name)-1] == MYPATHCHR;
-  for(i = 0; i < CB_LISTNUM(list); i++){
-    elem = CB_LISTVAL(list, i);
-    if(!strcmp(MYCDIRSTR, elem) || !strcmp(MYPDIRSTR, elem)) continue;
-    if(tail){
-      path = cbsprintf("%s%s", name, elem);
-    } else {
-      path = cbsprintf("%s%c%s", name, MYPATHCHR, elem);
-    }
-    if(!cbremove(path)) err = TRUE;
-    free(path);
-  }
-  CB_LISTCLOSE(list);
-  return rmdir(name) == 0 ? TRUE : FALSE;
-}
-
-
-/* Break up a URL into elements. */
-CBMAP *cburlbreak(const char *str){
-  CBMAP *map;
-  char *tmp, *ep;
-  const char *rp;
-  int serv;
-  assert(str);
-  map = cbmapopenex(CB_MAPPBNUM);
-  CB_MEMDUP(tmp, str, strlen(str));
-  rp = cbstrtrim(tmp);
-  cbmapput(map, "self", -1, rp, -1, TRUE);
-  serv = FALSE;
-  if(cbstrfwimatch(rp, "http://")){
-    cbmapput(map, "scheme", -1, "http", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "https://")){
-    cbmapput(map, "scheme", -1, "https", -1, TRUE);
-    rp += 8;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "ftp://")){
-    cbmapput(map, "scheme", -1, "ftp", -1, TRUE);
-    rp += 6;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "sftp://")){
-    cbmapput(map, "scheme", -1, "sftp", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "ftps://")){
-    cbmapput(map, "scheme", -1, "ftps", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "tftp://")){
-    cbmapput(map, "scheme", -1, "tftp", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "ldap://")){
-    cbmapput(map, "scheme", -1, "ldap", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "ldaps://")){
-    cbmapput(map, "scheme", -1, "ldaps", -1, TRUE);
-    rp += 8;
-    serv = TRUE;
-  } else if(cbstrfwimatch(rp, "file://")){
-    cbmapput(map, "scheme", -1, "file", -1, TRUE);
-    rp += 7;
-    serv = TRUE;
-  }
-  if((ep = strchr(rp, '#')) != NULL){
-    cbmapput(map, "fragment", -1, ep + 1, -1, TRUE);
-    *ep = '\0';
-  }
-  if((ep = strchr(rp, '?')) != NULL){
-    cbmapput(map, "query", -1, ep + 1, -1, TRUE);
-    *ep = '\0';
-  }
-  if(serv){
-    if((ep = strchr(rp, '/')) != NULL){
-      cbmapput(map, "path", -1, ep, -1, TRUE);
-      *ep = '\0';
-    } else {
-      cbmapput(map, "path", -1, "/", -1, TRUE);
-    }
-    if((ep = strchr(rp, '@')) != NULL){
-      *ep = '\0';
-      if(rp[0] != '\0') cbmapput(map, "authority", -1, rp, -1, TRUE);
-      rp = ep + 1;
-    }
-    if((ep = strchr(rp, ':')) != NULL){
-      if(ep[1] != '\0') cbmapput(map, "port", -1, ep + 1, -1, TRUE);
-      *ep = '\0';
-    }
-    if(rp[0] != '\0') cbmapput(map, "host", -1, rp, -1, TRUE);
-  } else {
-    cbmapput(map, "path", -1, rp, -1, TRUE);
-  }
-  free(tmp);
-  if((rp = cbmapget(map, "path", -1, NULL)) != NULL){
-    if((ep = strrchr(rp, '/')) != NULL){
-      if(ep[1] != '\0') cbmapput(map, "file", -1, ep + 1, -1, TRUE);
-    } else {
-      cbmapput(map, "file", -1, rp, -1, TRUE);
-    }
-  }
-  if((rp = cbmapget(map, "file", -1, NULL)) != NULL && (!strcmp(rp, ".") || !strcmp(rp, "..")))
-    cbmapout(map, "file", -1);
-  return map;
-}
-
-
-/* Resolve a relative URL with another absolute URL. */
-char *cburlresolve(const char *base, const char *target){
-  CBMAP *telems, *belems;
-  CBLIST *bpaths, *opaths, *qelems;
-  CBDATUM *rbuf;
-  const char *vbuf, *path;
-  char *tmp, *wp, *enc, numbuf[CB_NUMBUFSIZ];
-  int i, vsiz, port, num;
-  assert(base && target);
-  while(*base > '\0' && *base <= ' '){
-    base++;
-  }
-  while(*target > '\0' && *target <= ' '){
-    target++;
-  }
-  if(*target == '\0') target = base;
-  CB_DATUMOPEN(rbuf);
-  telems = cburlbreak(target);
-  port = 80;
-  belems = cburlbreak(cbmapget(telems, "scheme", -1, &vsiz) ? target : base);
-  if((vbuf = cbmapget(belems, "scheme", -1, &vsiz)) != NULL){
-    CB_DATUMCAT(rbuf, vbuf, vsiz);
-    CB_DATUMCAT(rbuf, "://", 3);
-    if(!cbstricmp(vbuf, "https")){
-      port = 443;
-    } else if(!cbstricmp(vbuf, "ftp")){
-      port = 21;
-    } else if(!cbstricmp(vbuf, "sftp")){
-      port = 115;
-    } else if(!cbstricmp(vbuf, "ftps")){
-      port = 22;
-    } else if(!cbstricmp(vbuf, "tftp")){
-      port = 69;
-    } else if(!cbstricmp(vbuf, "ldap")){
-      port = 389;
-    } else if(!cbstricmp(vbuf, "ldaps")){
-      port = 636;
-    }
-  } else {
-    CB_DATUMCAT(rbuf, "http://", 7);
-  }
-  if((vbuf = cbmapget(belems, "authority", -1, &vsiz)) != NULL){
-    if((wp = strchr(vbuf, ':')) != NULL){
-      *wp = '\0';
-      tmp = cburldecode(vbuf, NULL);
-      enc = cburlencode(tmp, -1);
-      CB_DATUMCAT(rbuf, enc, strlen(enc));
-      free(enc);
-      free(tmp);
-      CB_DATUMCAT(rbuf, ":", 1);
-      wp++;
-      tmp = cburldecode(wp, NULL);
-      enc = cburlencode(tmp, -1);
-      CB_DATUMCAT(rbuf, enc, strlen(enc));
-      free(enc);
-      free(tmp);
-    } else {
-      tmp = cburldecode(vbuf, NULL);
-      enc = cburlencode(tmp, -1);
-      CB_DATUMCAT(rbuf, enc, strlen(enc));
-      free(enc);
-      free(tmp);
-    }
-    CB_DATUMCAT(rbuf, "@", 1);
-  }
-  if((vbuf = cbmapget(belems, "host", -1, &vsiz)) != NULL){
-    tmp = cburldecode(vbuf, NULL);
-    cbstrtolower(tmp);
-    enc = cburlencode(tmp, -1);
-    CB_DATUMCAT(rbuf, enc, strlen(enc));
-    free(enc);
-    free(tmp);
-  } else {
-    CB_DATUMCAT(rbuf, "localhost", 9);
-  }
-  if((vbuf = cbmapget(belems, "port", -1, &vsiz)) != NULL &&
-     (num = atoi(vbuf)) != port && num > 1){
-    sprintf(numbuf, ":%d", num);
-    CB_DATUMCAT(rbuf, numbuf, strlen(numbuf));
-  }
-  if(!(path = cbmapget(telems, "path", -1, NULL))) path = "/";
-  if(path[0] == '\0' && (vbuf = cbmapget(belems, "path", -1, NULL)) != NULL) path = vbuf;
-  if(path[0] == '\0') path = "/";
-  CB_LISTOPEN(bpaths);
-  if(path[0] != '/' && (vbuf = cbmapget(belems, "path", -1, &vsiz)) != NULL){
-    opaths = cbsplit(vbuf, vsiz, "/");
-  } else {
-    opaths = cbsplit("/", 1, "/");
-  }
-  CB_LISTDROP(opaths);
-  for(i = 0; i < CB_LISTNUM(opaths); i++){
-    vbuf = CB_LISTVAL2(opaths, i, vsiz);
-    if(vsiz < 1 || !strcmp(vbuf, ".")) continue;
-    if(!strcmp(vbuf, "..")){
-      CB_LISTDROP(bpaths);
-    } else {
-      CB_LISTPUSH(bpaths, vbuf, vsiz);
-    }
-  }
-  CB_LISTCLOSE(opaths);
-  opaths = cbsplit(path, -1, "/");
-  for(i = 0; i < CB_LISTNUM(opaths); i++){
-    vbuf = CB_LISTVAL2(opaths, i, vsiz);
-    if(vsiz < 1 || !strcmp(vbuf, ".")) continue;
-    if(!strcmp(vbuf, "..")){
-      CB_LISTDROP(bpaths);
-    } else {
-      CB_LISTPUSH(bpaths, vbuf, vsiz);
-    }
-  }
-  CB_LISTCLOSE(opaths);
-  for(i = 0; i < CB_LISTNUM(bpaths); i++){
-    vbuf = CB_LISTVAL(bpaths, i);
-    if(strchr(vbuf, '%')){
-      tmp = cburldecode(vbuf, NULL);
-    } else {
-      CB_MEMDUP(tmp, vbuf, strlen(vbuf));
-    }
-    enc = cburlencode(tmp, -1);
-    CB_DATUMCAT(rbuf, "/", 1);
-    CB_DATUMCAT(rbuf, enc, strlen(enc));
-    free(enc);
-    free(tmp);
-  }
-  if(cbstrbwmatch(path, "/")) CB_DATUMCAT(rbuf, "/", 1);
-  CB_LISTCLOSE(bpaths);
-  if((vbuf = cbmapget(telems, "query", -1, &vsiz)) != NULL){
-    CB_DATUMCAT(rbuf, "?", 1);
-    qelems = cbsplit(vbuf, vsiz, "&;");
-    for(i = 0; i < CB_LISTNUM(qelems); i++){
-      vbuf = CB_LISTVAL(qelems, i);
-      if(i > 0) CB_DATUMCAT(rbuf, "&", 1);
-      if((wp = strchr(vbuf, '=')) != NULL){
-        *wp = '\0';
-        tmp = cburldecode(vbuf, NULL);
-        enc = cburlencode(tmp, -1);
-        CB_DATUMCAT(rbuf, enc, strlen(enc));
-        free(enc);
-        free(tmp);
-        CB_DATUMCAT(rbuf, "=", 1);
-        wp++;
-        tmp = cburldecode(wp, NULL);
-        enc = cburlencode(tmp, -1);
-        CB_DATUMCAT(rbuf, enc, strlen(enc));
-        free(enc);
-        free(tmp);
-      } else {
-        tmp = cburldecode(vbuf, NULL);
-        enc = cburlencode(tmp, -1);
-        CB_DATUMCAT(rbuf, enc, strlen(enc));
-        free(enc);
-        free(tmp);
-      }
-    }
-    CB_LISTCLOSE(qelems);
-  }
-  if((vbuf = cbmapget(telems, "fragment", -1, &vsiz)) != NULL){
-    tmp = cburldecode(vbuf, NULL);
-    enc = cburlencode(tmp, -1);
-    CB_DATUMCAT(rbuf, "#", 1);
-    CB_DATUMCAT(rbuf, enc, strlen(enc));
-    free(enc);
-    free(tmp);
-  }
-  cbmapclose(belems);
-  cbmapclose(telems);
-  return cbdatumtomalloc(rbuf, NULL);
-}
-
-
-/* Encode a serial object with URL encoding. */
-char *cburlencode(const char *ptr, int size){
-  char *buf, *wp;
-  int i, c;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  CB_MALLOC(buf, size * 3 + 1);
-  wp = buf;
-  for(i = 0; i < size; i++){
-    c = ((unsigned char *)ptr)[i];
-    if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-       (c >= '0' && c <= '9') || (c != '\0' && strchr("_-.!~*'()", c))){
-      *(wp++) = c;
-    } else {
-      wp += sprintf(wp, "%%%02X", c);
-    }
-  }
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Decode a string encoded with URL encoding. */
-char *cburldecode(const char *str, int *sp){
-  char *buf, *wp;
-  unsigned char c;
-  CB_MEMDUP(buf, str, strlen(str));
-  wp = buf;
-  while(*str != '\0'){
-    if(*str == '%'){
-      str++;
-      if(((str[0] >= '0' && str[0] <= '9') || (str[0] >= 'A' && str[0] <= 'F') ||
-          (str[0] >= 'a' && str[0] <= 'f')) &&
-         ((str[1] >= '0' && str[1] <= '9') || (str[1] >= 'A' && str[1] <= 'F') ||
-          (str[1] >= 'a' && str[1] <= 'f'))){
-        c = *str;
-        if(c >= 'A' && c <= 'Z') c += 'a' - 'A';
-        if(c >= 'a' && c <= 'z'){
-          *wp = c - 'a' + 10;
-        } else {
-          *wp = c - '0';
-        }
-        *wp *= 0x10;
-        str++;
-        c = *str;
-        if(c >= 'A' && c <= 'Z') c += 'a' - 'A';
-        if(c >= 'a' && c <= 'z'){
-          *wp += c - 'a' + 10;
-        } else {
-          *wp += c - '0';
-        }
-        str++;
-        wp++;
-      } else {
-        break;
-      }
-    } else if(*str == '+'){
-      *wp = ' ';
-      str++;
-      wp++;
-    } else {
-      *wp = *str;
-      str++;
-      wp++;
-    }
-  }
-  *wp = '\0';
-  if(sp) *sp = wp - buf;
-  return buf;
-}
-
-
-/* Encode a serial object with Base64 encoding. */
-char *cbbaseencode(const char *ptr, int size){
-  char *tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-  char *buf, *wp;
-  const unsigned char *obj;
-  int i;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  CB_MALLOC(buf, 4 * (size + 2) / 3 + 1);
-  obj = (const unsigned char *)ptr;
-  wp = buf;
-  for(i = 0; i < size; i += 3){
-    switch(size - i){
-    case 1:
-      *wp++ = tbl[obj[0] >> 2];
-      *wp++ = tbl[(obj[0] & 3) << 4];
-      *wp++ = '=';
-      *wp++ = '=';
-      break;
-    case 2:
-      *wp++ = tbl[obj[0] >> 2];
-      *wp++ = tbl[((obj[0] & 3) << 4) + (obj[1] >> 4)];
-      *wp++ = tbl[(obj[1] & 0xf) << 2];
-      *wp++ = '=';
-      break;
-    default:
-      *wp++ = tbl[obj[0] >> 2];
-      *wp++ = tbl[((obj[0] & 3) << 4) + (obj[1] >> 4)];
-      *wp++ = tbl[((obj[1] & 0xf) << 2) + (obj[2] >> 6)];
-      *wp++ = tbl[obj[2] & 0x3f];
-      break;
-    }
-    obj += 3;
-  }
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Decode a string encoded with Base64 encoding. */
-char *cbbasedecode(const char *str, int *sp){
-  unsigned char *obj, *wp;
-  int len, cnt, bpos, i, bits, eqcnt;
-  assert(str);
-  cnt = 0;
-  bpos = 0;
-  eqcnt = 0;
-  len = strlen(str);
-  CB_MALLOC(obj, len + 4);
-  wp = obj;
-  while(bpos < len && eqcnt == 0){
-    bits = 0;
-    for(i = 0; bpos < len && i < 4; bpos++){
-      if(str[bpos] >= 'A' && str[bpos] <= 'Z'){
-        bits = (bits << 6) | (str[bpos] - 'A');
-        i++;
-      } else if(str[bpos] >= 'a' && str[bpos] <= 'z'){
-        bits = (bits << 6) | (str[bpos] - 'a' + 26);
-        i++;
-      } else if(str[bpos] >= '0' && str[bpos] <= '9'){
-        bits = (bits << 6) | (str[bpos] - '0' + 52);
-        i++;
-      } else if(str[bpos] == '+'){
-        bits = (bits << 6) | 62;
-        i++;
-      } else if(str[bpos] == '/'){
-        bits = (bits << 6) | 63;
-        i++;
-      } else if(str[bpos] == '='){
-        bits <<= 6;
-        i++;
-        eqcnt++;
-      }
-    }
-    if(i == 0 && bpos >= len) continue;
-    switch(eqcnt){
-    case 0:
-      *wp++ = (bits >> 16) & 0xff;
-      *wp++ = (bits >> 8) & 0xff;
-      *wp++ = bits & 0xff;
-      cnt += 3;
-      break;
-    case 1:
-      *wp++ = (bits >> 16) & 0xff;
-      *wp++ = (bits >> 8) & 0xff;
-      cnt += 2;
-      break;
-    case 2:
-      *wp++ = (bits >> 16) & 0xff;
-      cnt += 1;
-      break;
-    }
-  }
-  obj[cnt] = '\0';
-  if(sp) *sp = cnt;
-  return (char *)obj;
-}
-
-
-/* Encode a serial object with quoted-printable encoding. */
-char *cbquoteencode(const char *ptr, int size){
-  const unsigned char *rp;
-  char *buf, *wp;
-  int i, cols;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  rp = (const unsigned char *)ptr;
-  CB_MALLOC(buf, size * 3 + 1);
-  wp = buf;
-  cols = 0;
-  for(i = 0; i < size; i++){
-    if(rp[i] == '=' || (rp[i] < 0x20 && rp[i] != '\r' && rp[i] != '\n' && rp[i] != '\t') ||
-       rp[i] > 0x7e){
-      wp += sprintf(wp, "=%02X", rp[i]);
-      cols += 3;
-    } else {
-      *(wp++) = rp[i];
-      cols++;
-    }
-  }
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Decode a string encoded with quoted-printable encoding. */
-char *cbquotedecode(const char *str, int *sp){
-  char *buf, *wp;
-  assert(str);
-  CB_MALLOC(buf, strlen(str) + 1);
-  wp = buf;
-  for(; *str != '\0'; str++){
-    if(*str == '='){
-      str++;
-      if(*str == '\0'){
-        break;
-      } else if(str[0] == '\r' && str[1] == '\n'){
-        str++;
-      } else if(str[0] != '\n' && str[0] != '\r'){
-        if(*str >= 'A' && *str <= 'Z'){
-          *wp = (*str - 'A' + 10) * 16;
-        } else if(*str >= 'a' && *str <= 'z'){
-          *wp = (*str - 'a' + 10) * 16;
-        } else {
-          *wp = (*str - '0') * 16;
-        }
-        str++;
-        if(*str == '\0') break;
-        if(*str >= 'A' && *str <= 'Z'){
-          *wp += *str - 'A' + 10;
-        } else if(*str >= 'a' && *str <= 'z'){
-          *wp += *str - 'a' + 10;
-        } else {
-          *wp += *str - '0';
-        }
-        wp++;
-      }
-    } else {
-      *wp = *str;
-      wp++;
-    }
-  }
-  *wp = '\0';
-  if(sp) *sp = wp - buf;
-  return buf;
-}
-
-
-/* Split a string of MIME into headers and the body. */
-char *cbmimebreak(const char *ptr, int size, CBMAP *attrs, int *sp){
-  CBLIST *list;
-  const char *head, *line, *pv, *ep;
-  char *hbuf, *name, *rv;
-  int i, j, wi, hlen;
-  assert(ptr);
-  if(size < 0) size = strlen(ptr);
-  head = NULL;
-  hlen = 0;
-  for(i = 0; i < size; i++){
-    if(i < size - 4 && ptr[i] == '\r' && ptr[i+1] == '\n' &&
-       ptr[i+2] == '\r' && ptr[i+3] == '\n'){
-      head = ptr;
-      hlen = i;
-      ptr += i + 4;
-      size -= i + 4;
-      break;
-    } else if(i < size - 2 && ptr[i] == '\n' && ptr[i+1] == '\n'){
-      head = ptr;
-      hlen = i;
-      ptr += i + 2;
-      size -= i + 2;
-      break;
-    }
-  }
-  if(head && attrs){
-    CB_MALLOC(hbuf, hlen + 1);
-    wi = 0;
-    for(i = 0; i < hlen; i++){
-      if(head[i] == '\r') continue;
-      if(i < hlen - 1 && head[i] == '\n' && (head[i+1] == ' ' || head[i+1] == '\t')){
-        hbuf[wi++] = ' ';
-        i++;
-      } else {
-        hbuf[wi++] = head[i];
-      }
-    }
-    list = cbsplit(hbuf, wi, "\n");
-    for(i = 0; i < CB_LISTNUM(list); i++){
-      line = CB_LISTVAL(list, i);
-      if((pv = strchr(line, ':')) != NULL){
-        CB_MEMDUP(name, line, pv - line);
-        for(j = 0; name[j] != '\0'; j++){
-          if(name[j] >= 'A' && name[j] <= 'Z') name[j] -= 'A' - 'a';
-        }
-        pv++;
-        while(*pv == ' ' || *pv == '\t'){
-          pv++;
-        }
-        cbmapput(attrs, name, -1, pv, -1, TRUE);
-        free(name);
-      }
-
-    }
-    CB_LISTCLOSE(list);
-    free(hbuf);
-    if((pv = cbmapget(attrs, "content-type", -1, NULL)) != NULL){
-      if((ep = strchr(pv, ';')) != NULL){
-        cbmapput(attrs, "TYPE", -1, pv, ep - pv, TRUE);
-        do {
-          ep++;
-          while(ep[0] == ' '){
-            ep++;
-          }
-          if(cbstrfwimatch(ep, "charset=")){
-            ep += 8;
-            while(*ep > '\0' && *ep <= ' '){
-              ep++;
-            }
-            if(ep[0] == '"') ep++;
-            pv = ep;
-            while(ep[0] != '\0' && ep[0] != ' ' && ep[0] != '"' && ep[0] != ';'){
-              ep++;
-            }
-            cbmapput(attrs, "CHARSET", -1, pv, ep - pv, TRUE);
-          } else if(cbstrfwimatch(ep, "boundary=")){
-            ep += 9;
-            while(*ep > '\0' && *ep <= ' '){
-              ep++;
-            }
-            if(ep[0] == '"'){
-              ep++;
-              pv = ep;
-              while(ep[0] != '\0' && ep[0] != '"'){
-                ep++;
-              }
-            } else {
-              pv = ep;
-              while(ep[0] != '\0' && ep[0] != ' ' && ep[0] != '"' && ep[0] != ';'){
-                ep++;
-              }
-            }
-            cbmapput(attrs, "BOUNDARY", -1, pv, ep - pv, TRUE);
-          }
-        } while((ep = strchr(ep, ';')) != NULL);
-      } else {
-        cbmapput(attrs, "TYPE", -1, pv, -1, TRUE);
-      }
-    }
-    if((pv = cbmapget(attrs, "content-disposition", -1, NULL)) != NULL){
-      if((ep = strchr(pv, ';')) != NULL){
-        cbmapput(attrs, "DISPOSITION", -1, pv, ep - pv, TRUE);
-        do {
-          ep++;
-          while(ep[0] == ' '){
-            ep++;
-          }
-          if(cbstrfwimatch(ep, "filename=")){
-            ep += 9;
-            if(ep[0] == '"') ep++;
-            pv = ep;
-            while(ep[0] != '\0' && ep[0] != '"'){
-              ep++;
-            }
-            cbmapput(attrs, "FILENAME", -1, pv, ep - pv, TRUE);
-          } else if(cbstrfwimatch(ep, "name=")){
-            ep += 5;
-            if(ep[0] == '"') ep++;
-            pv = ep;
-            while(ep[0] != '\0' && ep[0] != '"'){
-              ep++;
-            }
-            cbmapput(attrs, "NAME", -1, pv, ep - pv, TRUE);
-          }
-        } while((ep = strchr(ep, ';')) != NULL);
-      } else {
-        cbmapput(attrs, "DISPOSITION", -1, pv, -1, TRUE);
-      }
-    }
-  }
-  if(sp) *sp = size;
-  CB_MEMDUP(rv, ptr, size);
-  return rv;
-}
-
-
-/* Split multipart data in MIME into its parts. */
-CBLIST *cbmimeparts(const char *ptr, int size, const char *boundary){
-  CBLIST *list;
-  const char *pv, *ep;
-  int i, blen;
-  assert(ptr && boundary);
-  if(size < 0) size = strlen(ptr);
-  CB_LISTOPEN(list);
-  if((blen = strlen(boundary)) < 1) return list;
-  pv = NULL;
-  for(i = 0; i < size; i++){
-    if(ptr[i] == '-' && ptr[i+1] == '-' && i + 2 + blen < size &&
-       cbstrfwmatch(ptr + i + 2, boundary) && strchr("\t\n\v\f\r ", ptr[i+2+blen])){
-      pv = ptr + i + 2 + blen;
-      if(*pv == '\r') pv++;
-      if(*pv == '\n') pv++;
-      size -= pv - ptr;
-      ptr = pv;
-      break;
-    }
-  }
-  if(!pv) return list;
-  for(i = 0; i < size; i++){
-    if(ptr[i] == '-' && ptr[i+1] == '-' && i + 2 + blen < size &&
-       cbstrfwmatch(ptr + i + 2, boundary) && strchr("\t\n\v\f\r -", ptr[i+2+blen])){
-      ep = ptr + i;
-      if(ep > ptr && ep[-1] == '\n') ep--;
-      if(ep > ptr && ep[-1] == '\r') ep--;
-      if(ep > pv) CB_LISTPUSH(list, pv, ep - pv);
-      pv = ptr + i + 2 + blen;
-      if(*pv == '\r') pv++;
-      if(*pv == '\n') pv++;
-    }
-  }
-  return list;
-}
-
-
-/* Encode a string with MIME encoding. */
-char *cbmimeencode(const char *str, const char *encname, int base){
-  char *buf, *wp, *enc;
-  int len;
-  assert(str && encname);
-  len = strlen(str);
-  CB_MALLOC(buf, len * 3 + strlen(encname) + 16);
-  wp = buf;
-  wp += sprintf(wp, "=?%s?%c?", encname, base ? 'B' : 'Q');
-  enc = base ? cbbaseencode(str, len) : cbquoteencode(str, len);
-  wp += sprintf(wp, "%s?=", enc);
-  free(enc);
-  return buf;
-}
-
-
-/* Decode a string encoded with MIME encoding. */
-char *cbmimedecode(const char *str, char *enp){
-  char *buf, *wp, *tmp, *dec;
-  const char *pv, *ep;
-  int quoted;
-  assert(str);
-  if(enp) sprintf(enp, "US-ASCII");
-  CB_MALLOC(buf, strlen(str) + 1);
-  wp = buf;
-  while(*str != '\0'){
-    if(cbstrfwmatch(str, "=?")){
-      str += 2;
-      pv = str;
-      if(!(ep = strchr(str, '?'))) continue;
-      if(enp && ep - pv < CB_ENCBUFSIZ){
-        memcpy(enp, pv, ep - pv);
-        enp[ep-pv] = '\0';
-      }
-      pv = ep + 1;
-      quoted = (*pv == 'Q' || *pv == 'q');
-      if(*pv != '\0') pv++;
-      if(*pv != '\0') pv++;
-      if(!(ep = strchr(pv, '?'))) continue;
-      CB_MEMDUP(tmp, pv, ep - pv);
-      dec = quoted ? cbquotedecode(tmp, NULL) : cbbasedecode(tmp, NULL);
-      wp += sprintf(wp, "%s", dec);
-      free(dec);
-      free(tmp);
-      str = ep + 1;
-      if(*str != '\0') str++;
-    } else {
-      *(wp++) = *str;
-      str++;
-    }
-  }
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Split a string of CSV into rows. */
-CBLIST *cbcsvrows(const char *str){
-  CBLIST *list;
-  const char *pv;
-  int quoted;
-  assert(str);
-  CB_LISTOPEN(list);
-  pv = str;
-  quoted = FALSE;
-  while(TRUE){
-    if(*str == '"') quoted = !quoted;
-    if(!quoted && (*str == '\r' || *str == '\n')){
-      CB_LISTPUSH(list, pv, str - pv);
-      if(str[0] == '\r' && str[1] == '\n') str++;
-      str++;
-      pv = str;
-    } else if(*str == '\0'){
-      if(str > pv) CB_LISTPUSH(list, pv, str - pv);
-      break;
-    } else {
-      str++;
-    }
-  }
-  return list;
-}
-
-
-/* Split a string of a row of CSV into cells. */
-CBLIST *cbcsvcells(const char *str){
-  CBLIST *list, *uelist;
-  const char *pv;
-  char *tmp;
-  int i, quoted;
-  assert(str);
-  CB_LISTOPEN(list);
-  pv = str;
-  quoted = FALSE;
-  while(TRUE){
-    if(*str == '"') quoted = !quoted;
-    if(!quoted && *str == ','){
-      CB_LISTPUSH(list, pv, str - pv);
-      str++;
-      pv = str;
-    } else if(*str == '\0'){
-      CB_LISTPUSH(list, pv, str - pv);
-      break;
-    } else {
-      str++;
-    }
-  }
-  CB_LISTOPEN(uelist);
-  for(i = 0; i < CB_LISTNUM(list); i++){
-    tmp = cbcsvunescape(CB_LISTVAL(list, i));
-    CB_LISTPUSH(uelist, tmp, strlen(tmp));
-    free(tmp);
-  }
-  CB_LISTCLOSE(list);
-  return uelist;
-}
-
-
-/* Escape a string with the meta characters of CSV. */
-char *cbcsvescape(const char *str){
-  char *buf, *wp;
-  int i;
-  assert(str);
-  CB_MALLOC(buf, strlen(str) * 2 + 3);
-  wp = buf;
-  *(wp++) = '"';
-  for(i = 0; str[i] != '\0'; i++){
-    if(str[i] == '"') *(wp++) = '"';
-    *(wp++) = str[i];
-  }
-  *(wp++) = '"';
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Unescape a string with the escaped meta characters of CSV. */
-char *cbcsvunescape(const char *str){
-  char *buf, *wp;
-  int i, len;
-  assert(str);
-  len = strlen(str);
-  if(str[0] == '"'){
-    str++;
-    len--;
-    if(str[len-1] == '"') len--;
-  }
-  CB_MALLOC(buf, len + 1);
-  wp = buf;
-  for(i = 0; i < len; i++){
-    if(str[i] == '"'){
-      if(str[i+1] == '"') *(wp++) = str[i++];
-    } else {
-      *(wp++) = str[i];
-    }
-  }
-  *wp = '\0';
-  return buf;
-}
-
-
-/* Split a string of XML into tags and text sections. */
-CBLIST *cbxmlbreak(const char *str, int cr){
-  CBLIST *list;
-  CBDATUM *datum;
-  int i, pv, tag;
-  char *ep;
-  assert(str);
-  CB_LISTOPEN(list);
-  i = 0;
-  pv = 0;
-  tag = FALSE;
-  while(TRUE){
-    if(str[i] == '\0'){
-      if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
-      break;
-    } else if(!tag && str[i] == '<'){
-      if(str[i+1] == '!' && str[i+2] == '-' && str[i+3] == '-'){
-        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
-        if((ep = strstr(str + i, "-->")) != NULL){
-          if(!cr) CB_LISTPUSH(list, str + i, ep - str - i + 3);
-          i = ep - str + 2;
-          pv = i + 1;
-        }
-      } else if(str[i+1] == '!' && str[i+2] == '[' && cbstrfwimatch(str + i, "<![CDATA[")){
-        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
-        if((ep = strstr(str + i, "]]>")) != NULL){
-          i += 9;
-          CB_DATUMOPEN(datum);
-          while(str + i < ep){
-            if(str[i] == '&'){
-              CB_DATUMCAT(datum, "&", 5);
-            } else if(str[i] == '<'){
-              CB_DATUMCAT(datum, "<", 4);
-            } else if(str[i] == '>'){
-              CB_DATUMCAT(datum, ">", 4);
-            } else {
-              CB_DATUMCAT(datum, str + i, 1);
-            }
-            i++;
-          }
-          if(CB_DATUMSIZE(datum) > 0) CB_LISTPUSH(list, CB_DATUMPTR(datum), CB_DATUMSIZE(datum));
-          CB_DATUMCLOSE(datum);
-          i = ep - str + 2;
-          pv = i + 1;
-        }
-      } else {
-        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
-        tag = TRUE;
-        pv = i;
-      }
-    } else if(tag && str[i] == '>'){
-      if(i > pv) CB_LISTPUSH(list, str + pv, i - pv + 1);
-      tag = FALSE;
-      pv = i + 1;
-    }
-    i++;
-  }
-  return list;
-}
-
-
-/* Get the map of attributes of a XML tag. */
-CBMAP *cbxmlattrs(const char *str){
-  CBMAP *map;
-  const unsigned char *rp, *key, *val;
-  char *copy, *raw;
-  int ksiz, vsiz;
-  assert(str);
-  map = cbmapopenex(CB_MAPPBNUM);
-  rp = (unsigned char *)str;
-  while(*rp == '<' || *rp == '/' || *rp == '?' || *rp == '!' || *rp == ' '){
-    rp++;
-  }
-  key = rp;
-  while(*rp > 0x20 && *rp != '/' && *rp != '>'){
-    rp++;
-  }
-  cbmapput(map, "", -1, (char *)key, rp - key, FALSE);
-  while(*rp != '\0'){
-    while(*rp != '\0' && (*rp <= 0x20 || *rp == '/' || *rp == '?' || *rp == '>')){
-      rp++;
-    }
-    key = rp;
-    while(*rp > 0x20 && *rp != '/' && *rp != '>' && *rp != '='){
-      rp++;
-    }
-    ksiz = rp - key;
-    while(*rp != '\0' && (*rp == '=' || *rp <= 0x20)){
-      rp++;
-    }
-    if(*rp == '"'){
-      rp++;
-      val = rp;
-      while(*rp != '\0' && *rp != '"'){
-        rp++;
-      }
-      vsiz = rp - val;
-    } else if(*rp == '\''){
-      rp++;
-      val = rp;
-      while(*rp != '\0' && *rp != '\''){
-        rp++;
-      }
-      vsiz = rp - val;
-    } else {
-      val = rp;
-      while(*rp > 0x20 && *rp != '"' && *rp != '\'' && *rp != '>'){
-        rp++;
-      }
-      vsiz = rp - val;
-    }
-    if(*rp != '\0') rp++;
-    if(ksiz > 0){
-      CB_MEMDUP(copy, (char *)val, vsiz);
-      raw = cbxmlunescape(copy);
-      cbmapput(map, (char *)key, ksiz, raw, -1, FALSE);
-      free(raw);
-      free(copy);
-    }
-  }
-  return map;
-}
-
-
-/* Escape a string with the meta characters of XML. */
-char *cbxmlescape(const char *str){
-  CBDATUM *datum;
-  assert(str);
-  CB_DATUMOPEN(datum);
-  while(*str != '\0'){
-    switch(*str){
-    case '&':
-      CB_DATUMCAT(datum, "&", 5);
-      break;
-    case '<':
-      CB_DATUMCAT(datum, "<", 4);
-      break;
-    case '>':
-      CB_DATUMCAT(datum, ">", 4);
-      break;
-    case '"':
-      CB_DATUMCAT(datum, """, 6);
-      break;
-    case '\'':
-      CB_DATUMCAT(datum, "'", 6);
-      break;
-    default:
-      CB_DATUMCAT(datum, str, 1);
-      break;
-    }
-    str++;
-  }
-  return cbdatumtomalloc(datum, NULL);
-}
-
-
-/* Unescape a string with the entity references of XML. */
-char *cbxmlunescape(const char *str){
-  CBDATUM *datum;
-  assert(str);
-  CB_DATUMOPEN(datum);
-  while(*str != '\0'){
-    if(*str == '&'){
-      if(cbstrfwmatch(str, "&")){
-        CB_DATUMCAT(datum, "&", 1);
-        str += 5;
-      } else if(cbstrfwmatch(str, "<")){
-        CB_DATUMCAT(datum, "<", 1);
-        str += 4;
-      } else if(cbstrfwmatch(str, ">")){
-        CB_DATUMCAT(datum, ">", 1);
-        str += 4;
-      } else if(cbstrfwmatch(str, """)){
-        CB_DATUMCAT(datum, "\"", 1);
-        str += 6;
-      } else if(cbstrfwmatch(str, "'")){
-        CB_DATUMCAT(datum, "'", 1);
-        str += 6;
-      } else {
-        CB_DATUMCAT(datum, str, 1);
-        str++;
-      }
-    } else {
-      CB_DATUMCAT(datum, str, 1);
-      str++;
-    }
-  }
-  return cbdatumtomalloc(datum, NULL);
-}
-
-
-/* Compress a serial object with ZLIB. */
-char *cbdeflate(const char *ptr, int size, int *sp){
-  assert(ptr && sp);
-  if(!_qdbm_deflate) return NULL;
-  return _qdbm_deflate(ptr, size, sp, _QDBM_ZMZLIB);
-}
-
-
-/* Decompress a serial object compressed with ZLIB. */
-char *cbinflate(const char *ptr, int size, int *sp){
-  assert(ptr && size >= 0);
-  if(!_qdbm_inflate) return NULL;
-  return _qdbm_inflate(ptr, size, sp, _QDBM_ZMZLIB);
-}
-
-
-/* Compress a serial object with GZIP. */
-char *cbgzencode(const char *ptr, int size, int *sp){
-  assert(ptr && sp);
-  if(!_qdbm_deflate) return NULL;
-  return _qdbm_deflate(ptr, size, sp, _QDBM_ZMGZIP);
-}
-
-
-/* Decompress a serial object compressed with GZIP. */
-char *cbgzdecode(const char *ptr, int size, int *sp){
-  assert(ptr && size >= 0);
-  if(!_qdbm_inflate) return NULL;
-  return _qdbm_inflate(ptr, size, sp, _QDBM_ZMGZIP);
-}
-
-
-/* Get the CRC32 checksum of a serial object. */
-unsigned int cbgetcrc(const char *ptr, int size){
-  assert(ptr);
-  if(!_qdbm_inflate) return 0;
-  return _qdbm_getcrc(ptr, size);
-}
-
-
-/* Compress a serial object with LZO. */
-char *cblzoencode(const char *ptr, int size, int *sp){
-  assert(ptr && sp);
-  if(!_qdbm_lzoencode) return NULL;
-  return _qdbm_lzoencode(ptr, size, sp);
-}
-
-
-/* Decompress a serial object compressed with LZO. */
-char *cblzodecode(const char *ptr, int size, int *sp){
-  assert(ptr && size >= 0);
-  if(!_qdbm_lzodecode) return NULL;
-  return _qdbm_lzodecode(ptr, size, sp);
-}
-
-
-/* Compress a serial object with BZIP2. */
-char *cbbzencode(const char *ptr, int size, int *sp){
-  assert(ptr && sp);
-  if(!_qdbm_bzencode) return NULL;
-  return _qdbm_bzencode(ptr, size, sp);
-}
-
-
-/* Decompress a serial object compressed with BZIP2. */
-char *cbbzdecode(const char *ptr, int size, int *sp){
-  assert(ptr && size >= 0);
-  if(!_qdbm_bzdecode) return NULL;
-  return _qdbm_bzdecode(ptr, size, sp);
-}
-
-
-/* Convert the character encoding of a string. */
-char *cbiconv(const char *ptr, int size, const char *icode, const char *ocode, int *sp, int *mp){
-  char *res;
-  assert(ptr && icode && ocode);
-  if(!_qdbm_iconv) return NULL;
-  if((res = _qdbm_iconv(ptr, size, icode, ocode, sp, mp)) != NULL) return res;
-  if(!cbstricmp(icode, ocode)){
-    if(sp) *sp = size;
-    if(mp) *mp = 0;
-    CB_MEMDUP(res, ptr, size < 0 ? strlen(ptr) : size);
-    return res;
-  }
-  return NULL;
-}
-
-
-/* Detect the encoding of a string automatically. */
-const char *cbencname(const char *ptr, int size){
-  assert(ptr);
-  if(!_qdbm_encname) return "ISO-8859-1";
-  return _qdbm_encname(ptr, size);
-}
-
-
-/* Get the jet lag of the local time in seconds. */
-int cbjetlag(void){
-  struct tm ts, *tp;
-  time_t t, gt, lt;
-  if((t = time(NULL)) < 0) return 0;
-  if(!(tp = _qdbm_gmtime(&t, &ts))) return 0;
-  if((gt = mktime(tp)) < 0) return 0;
-  if(!(tp = _qdbm_localtime(&t, &ts))) return 0;
-  if((lt = mktime(tp)) < 0) return 0;
-  return lt - gt;
-}
-
-
-/* Get the Gregorian calendar of a time. */
-void cbcalendar(time_t t, int jl, int *yearp, int *monp, int *dayp,
-                int *hourp, int *minp, int *secp){
-  struct tm ts, *tp;
-  if(t < 0) t = time(NULL);
-  t += jl;
-  if(!(tp = _qdbm_gmtime(&t, &ts))) return;
-  if(yearp) *yearp = tp->tm_year + 1900;
-  if(monp) *monp = tp->tm_mon + 1;
-  if(dayp) *dayp = tp->tm_mday;
-  if(hourp) *hourp = tp->tm_hour;
-  if(minp) *minp = tp->tm_min;
-  if(secp) *secp = tp->tm_sec;
-}
-
-
-/* Get the day of week of a date. */
-int cbdayofweek(int year, int mon, int day){
-  if(mon < 3){
-    year--;
-    mon += 12;
-  }
-  return (day + ((8 + (13 * mon)) / 5) + (year + (year / 4) - (year / 100) + (year / 400))) % 7;
-}
-
-
-/* Get the string for a date in W3CDTF. */
-char *cbdatestrwww(time_t t, int jl){
-  char date[CB_DATEBUFSIZ], tzone[CB_DATEBUFSIZ], *rv;
-  int year, mon, day, hour, min, sec;
-  cbcalendar(t, jl, &year, &mon, &day, &hour, &min, &sec);
-  jl /= 60;
-  if(jl == 0){
-    sprintf(tzone, "Z");
-  } else if(jl < 0){
-    jl *= -1;
-    sprintf(tzone, "-%02d:%02d", jl / 60, jl % 60);
-  } else {
-    sprintf(tzone, "+%02d:%02d", jl / 60, jl % 60);
-  }
-  sprintf(date, "%04d-%02d-%02dT%02d:%02d:%02d%s", year, mon, day, hour, min, sec, tzone);
-  CB_MEMDUP(rv, date, strlen(date));
-  return rv;
-}
-
-
-/* Get the string for a date in RFC 1123 format. */
-char *cbdatestrhttp(time_t t, int jl){
-  char date[CB_DATEBUFSIZ], *wp, *rv;
-  int year, mon, day, hour, min, sec;
-  cbcalendar(t, jl, &year, &mon, &day, &hour, &min, &sec);
-  jl /= 60;
-  wp = date;
-  switch(cbdayofweek(year, mon, day)){
-  case 0: wp += sprintf(wp, "Sun, "); break;
-  case 1: wp += sprintf(wp, "Mon, "); break;
-  case 2: wp += sprintf(wp, "Tue, "); break;
-  case 3: wp += sprintf(wp, "Wed, "); break;
-  case 4: wp += sprintf(wp, "Thu, "); break;
-  case 5: wp += sprintf(wp, "Fri, "); break;
-  case 6: wp += sprintf(wp, "Sat, "); break;
-  }
-  wp += sprintf(wp, "%02d ", day);
-  switch(mon){
-  case 1: wp += sprintf(wp, "Jan "); break;
-  case 2: wp += sprintf(wp, "Feb "); break;
-  case 3: wp += sprintf(wp, "Mar "); break;
-  case 4: wp += sprintf(wp, "Apr "); break;
-  case 5: wp += sprintf(wp, "May "); break;
-  case 6: wp += sprintf(wp, "Jun "); break;
-  case 7: wp += sprintf(wp, "Jul "); break;
-  case 8: wp += sprintf(wp, "Aug "); break;
-  case 9: wp += sprintf(wp, "Sep "); break;
-  case 10: wp += sprintf(wp, "Oct "); break;
-  case 11: wp += sprintf(wp, "Nov "); break;
-  case 12: wp += sprintf(wp, "Dec "); break;
-  }
-  wp += sprintf(wp, "%04d %02d:%02d:%02d ", year, hour, min, sec);
-  if(jl == 0){
-    wp += sprintf(wp, "GMT");
-  } else if(jl < 0){
-    jl *= -1;
-    wp += sprintf(wp, "-%02d%02d", jl / 60, jl % 60);
-  } else {
-    wp += sprintf(wp, "+%02d%02d", jl / 60, jl % 60);
-  }
-  CB_MEMDUP(rv, date, strlen(date));
-  return rv;
-}
-
-
-/* Get the time value of a date string in decimal, W3CDTF, or RFC 1123. */
-time_t cbstrmktime(const char *str){
-  const char *crp;
-  char *pv, *rp;
-  int len, clen;
-  time_t t;
-  struct tm ts;
-  assert(str);
-  while(*str > '\0' && *str <= ' '){
-    str++;
-  }
-  if(*str == '\0') return -1;
-  if(str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) return (time_t)strtol(str + 2, NULL, 16);
-  memset(&ts, 0, sizeof(struct tm));
-  ts.tm_year = 70;
-  ts.tm_mon = 0;
-  ts.tm_mday = 1;
-  ts.tm_hour = 0;
-  ts.tm_min = 0;
-  ts.tm_sec = 0;
-  ts.tm_isdst = 0;
-  len = strlen(str);
-  t = (time_t)strtol(str, &pv, 10);
-  if(*(signed char *)pv >= '\0' && *pv <= ' '){
-    while(*pv > '\0' && *pv <= ' '){
-      pv++;
-    }
-    if(*pv == '\0') return t;
-  }
-  if((pv[0] == 's' || pv[0] == 'S') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
-    return t;
-  if((pv[0] == 'm' || pv[0] == 'M') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
-    return t * 60;
-  if((pv[0] == 'h' || pv[0] == 'H') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
-    return t * 60 * 60;
-  if((pv[0] == 'd' || pv[0] == 'D') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
-    return t * 60 * 60 * 24;
-  if(len > 4 && str[4] == '-'){
-    ts.tm_year = atoi(str) - 1900;
-    if((pv = strchr(str, '-')) != NULL && pv - str == 4){
-      rp = pv + 1;
-      ts.tm_mon = atoi(rp) - 1;
-      if((pv = strchr(rp, '-')) != NULL && pv - str == 7){
-        rp = pv + 1;
-        ts.tm_mday = atoi(rp);
-        if((pv = strchr(rp, 'T')) != NULL && pv - str == 10){
-          rp = pv + 1;
-          ts.tm_hour = atoi(rp);
-          if((pv = strchr(rp, ':')) != NULL && pv - str == 13){
-            rp = pv + 1;
-            ts.tm_min = atoi(rp);
-          }
-          if((pv = strchr(rp, ':')) != NULL && pv - str == 16){
-            rp = pv + 1;
-            ts.tm_sec = atoi(rp);
-          }
-          if((pv = strchr(rp, '.')) != NULL && pv - str >= 19) rp = pv + 1;
-          strtol(rp, &pv, 10);
-          if((*pv == '+' || *pv == '-') && strlen(pv) >= 6 && pv[3] == ':')
-            ts.tm_sec -= (atoi(pv + 1) * 3600 + atoi(pv + 4) * 60) * (pv[0] == '+' ? 1 : -1);
-        }
-      }
-    }
-    ts.tm_sec += cbjetlag();
-    return mktime(&ts);
-  }
-  if(len > 4 && str[4] == '/'){
-    ts.tm_year = atoi(str) - 1900;
-    if((pv = strchr(str, '/')) != NULL && pv - str == 4){
-      rp = pv + 1;
-      ts.tm_mon = atoi(rp) - 1;
-      if((pv = strchr(rp, '/')) != NULL && pv - str == 7){
-        rp = pv + 1;
-        ts.tm_mday = atoi(rp);
-        if((pv = strchr(rp, ' ')) != NULL && pv - str == 10){
-          rp = pv + 1;
-          ts.tm_hour = atoi(rp);
-          if((pv = strchr(rp, ':')) != NULL && pv - str == 13){
-            rp = pv + 1;
-            ts.tm_min = atoi(rp);
-          }
-          if((pv = strchr(rp, ':')) != NULL && pv - str == 16){
-            rp = pv + 1;
-            ts.tm_sec = atoi(rp);
-          }
-          if((pv = strchr(rp, '.')) != NULL && pv - str >= 19) rp = pv + 1;
-          strtol(rp, &pv, 10);
-          if((*pv == '+' || *pv == '-') && strlen(pv) >= 6 && pv[3] == ':')
-            ts.tm_sec -= (atoi(pv + 1) * 3600 + atoi(pv + 4) * 60) * (pv[0] == '+' ? 1 : -1);
-        }
-      }
-    }
-    ts.tm_sec += cbjetlag();
-    return mktime(&ts);
-  }
-  crp = str;
-  if(len >= 4 && str[3] == ',') crp = str + 4;
-  while(*crp == ' '){
-    crp++;
-  }
-  ts.tm_mday = atoi(crp);
-  while((*crp >= '0' && *crp <= '9') || *crp == ' '){
-    crp++;
-  }
-  if(cbstrfwimatch(crp, "Jan")){
-    ts.tm_mon = 0;
-  } else if(cbstrfwimatch(crp, "Feb")){
-    ts.tm_mon = 1;
-  } else if(cbstrfwimatch(crp, "Mar")){
-    ts.tm_mon = 2;
-  } else if(cbstrfwimatch(crp, "Apr")){
-    ts.tm_mon = 3;
-  } else if(cbstrfwimatch(crp, "May")){
-    ts.tm_mon = 4;
-  } else if(cbstrfwimatch(crp, "Jun")){
-    ts.tm_mon = 5;
-  } else if(cbstrfwimatch(crp, "Jul")){
-    ts.tm_mon = 6;
-  } else if(cbstrfwimatch(crp, "Aug")){
-    ts.tm_mon = 7;
-  } else if(cbstrfwimatch(crp, "Sep")){
-    ts.tm_mon = 8;
-  } else if(cbstrfwimatch(crp, "Oct")){
-    ts.tm_mon = 9;
-  } else if(cbstrfwimatch(crp, "Nov")){
-    ts.tm_mon = 10;
-  } else if(cbstrfwimatch(crp, "Dec")){
-    ts.tm_mon = 11;
-  } else {
-    ts.tm_mon = -1;
-  }
-  if(ts.tm_mon >= 0) crp += 3;
-  while(*crp == ' '){
-    crp++;
-  }
-  ts.tm_year = atoi(crp);
-  if(ts.tm_year >= 1969) ts.tm_year -= 1900;
-  while(*crp >= '0' && *crp <= '9'){
-    crp++;
-  }
-  while(*crp == ' '){
-    crp++;
-  }
-  if(ts.tm_mday > 0 && ts.tm_mon >= 0 && ts.tm_year >= 0){
-    clen = strlen(crp);
-    if(clen >= 8 && crp[2] == ':' && crp[5] == ':'){
-      ts.tm_hour = atoi(crp + 0);
-      ts.tm_min = atoi(crp + 3);
-      ts.tm_sec = atoi(crp + 6);
-      if(clen >= 14 && crp[8] == ' ' && (crp[9] == '+' || crp[9] == '-')){
-        ts.tm_sec -= ((crp[10] - '0') * 36000 + (crp[11] - '0') * 3600 +
-                      (crp[12] - '0') * 600 + (crp[13] - '0') * 60) * (crp[9] == '+' ? 1 : -1);
-      } else if(clen > 9){
-        if(!strcmp(crp + 9, "JST")){
-          ts.tm_sec -= 9 * 3600;
-        } else if(!strcmp(crp + 9, "CCT")){
-          ts.tm_sec -= 8 * 3600;
-        } else if(!strcmp(crp + 9, "KST")){
-          ts.tm_sec -= 9 * 3600;
-        } else if(!strcmp(crp + 9, "EDT")){
-          ts.tm_sec -= -4 * 3600;
-        } else if(!strcmp(crp + 9, "EST")){
-          ts.tm_sec -= -5 * 3600;
-        } else if(!strcmp(crp + 9, "CDT")){
-          ts.tm_sec -= -5 * 3600;
-        } else if(!strcmp(crp + 9, "CST")){
-          ts.tm_sec -= -6 * 3600;
-        } else if(!strcmp(crp + 9, "MDT")){
-          ts.tm_sec -= -6 * 3600;
-        } else if(!strcmp(crp + 9, "MST")){
-          ts.tm_sec -= -7 * 3600;
-        } else if(!strcmp(crp + 9, "PDT")){
-          ts.tm_sec -= -7 * 3600;
-        } else if(!strcmp(crp + 9, "PST")){
-          ts.tm_sec -= -8 * 3600;
-        } else if(!strcmp(crp + 9, "HDT")){
-          ts.tm_sec -= -9 * 3600;
-        } else if(!strcmp(crp + 9, "HST")){
-          ts.tm_sec -= -10 * 3600;
-        }
-      }
-    }
-    ts.tm_sec += cbjetlag();
-    return mktime(&ts);
-  }
-  return -1;
-}
-
-
-/* Get user and system processing times. */
-void cbproctime(double *usrp, double *sysp){
-  struct tms buf;
-  times(&buf);
-  if(usrp) *usrp = (double)buf.tms_utime / sysconf(_SC_CLK_TCK);
-  if(sysp) *sysp = (double)buf.tms_stime / sysconf(_SC_CLK_TCK);
-}
-
-
-/* Ensure that the standard I/O is binary mode. */
-void cbstdiobin(void){
-  if(setmode(0, O_BINARY) == -1 || setmode(1, O_BINARY) == -1 || setmode(2, O_BINARY) == -1)
-    cbmyfatal("setmode failed");
-}
-
-
-
-/*************************************************************************************************
- * features for experts
- *************************************************************************************************/
-
-
-/* Show error message on the standard error output and exit. */
-void *cbmyfatal(const char *message){
-  char buf[CB_MSGBUFSIZ];
-  assert(message);
-  if(cbfatalfunc){
-    cbfatalfunc(message);
-  } else {
-    sprintf(buf, "fatal error: %s\n", message);
-    write(2, buf, strlen(buf));
-  }
-  exit(1);
-  return NULL;
-}
-
-
-/* Create a datum handle from an allocated region. */
-CBDATUM *cbdatumopenbuf(char *ptr, int size){
-  CBDATUM *datum;
-  assert(ptr && size >= 0);
-  CB_REALLOC(ptr, size + 1);
-  CB_MALLOC(datum, sizeof(*datum));
-  datum->dptr = ptr;
-  datum->dptr[size] = '\0';
-  datum->dsize = size;
-  datum->asize = size;
-  return datum;
-}
-
-
-/* Set a buffer to a datum handle. */
-void cbdatumsetbuf(CBDATUM *datum, char *ptr, int size){
-  assert(datum && ptr && size >= 0);
-  free(datum->dptr);
-  CB_REALLOC(ptr, size + 1);
-  datum->dptr = ptr;
-  datum->dptr[size] = '\0';
-  datum->dsize = size;
-  datum->asize = size;
-}
-
-
-/* Add an allocated element at the end of a list. */
-void cblistpushbuf(CBLIST *list, char *ptr, int size){
-  int index;
-  assert(list && ptr && size >= 0);
-  index = list->start + list->num;
-  if(index >= list->anum){
-    list->anum *= 2;
-    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
-  }
-  list->array[index].dptr = ptr;
-  list->array[index].dsize = size;
-  list->num++;
-}
-
-
-/* Get a map handle with specifying the number of buckets. */
-CBMAP *cbmapopenex(int bnum){
-  CBMAP *map;
-  int i;
-  assert(bnum > 0);
-  CB_MALLOC(map, sizeof(*map));
-  CB_MALLOC(map->buckets, sizeof(map->buckets[0]) * bnum);
-  for(i = 0; i < bnum; i++){
-    map->buckets[i] = NULL;
-  }
-  map->first = NULL;
-  map->last = NULL;
-  map->cur = NULL;
-  map->bnum = bnum;
-  map->rnum = 0;
-  return map;
-}
-
-
-
-/*************************************************************************************************
- * private objects
- *************************************************************************************************/
-
-
-/* Handler to invoke the global garbage collector. */
-static void cbggchandler(void){
-  cbggckeeper(NULL, NULL);
-}
-
-
-/* Manage resources of the global garbage collector.
-   `ptr' specifies the pointer to add to the collection.  If it is `NULL', all resources are
-   released.
-   `func' specifies the pointer to the function to release the resources. */
-static void cbggckeeper(void *ptr, void (*func)(void *)){
-  static void **parray = NULL;
-  static void (**farray)(void *) = NULL;
-  static int onum = 0;
-  static int asiz = CB_GCUNIT;
-  int i;
-  if(!ptr){
-    if(!parray) return;
-    for(i = onum - 1; i >= 0; i--){
-      farray[i](parray[i]);
-    }
-    free(parray);
-    free(farray);
-    parray = NULL;
-    farray = NULL;
-    onum = 0;
-    asiz = CB_GCUNIT;
-    return;
-  }
-  if(!parray){
-    CB_MALLOC(parray, sizeof(void *) * asiz);
-    CB_MALLOC(farray, sizeof(void *) * asiz);
-    if(atexit(cbggchandler) != 0) cbmyfatal("gc failed");
-  }
-  if(onum >= asiz){
-    asiz *= 2;
-    CB_REALLOC(parray, sizeof(void *) * asiz);
-    CB_REALLOC(farray, sizeof(void *) * asiz);
-  }
-  parray[onum] = ptr;
-  farray[onum] = func;
-  onum++;
-}
-
-
-/* Utility function for quick sort.
-   `bp' specifies the pointer to the pointer to an array.
-   `nmemb' specifies the number of elements of the array.
-   `size' specifies the size of each element.
-   `pswap' specifies the pointer to the swap region for a pivot.
-   `vswap' specifies the pointer to the swap region for elements.
-   `compar' specifies the pointer to comparing function. */
-static void cbqsortsub(char *bp, int nmemb, int size, char *pswap, char *vswap,
-                       int(*compar)(const void *, const void *)){
-  int top, bottom;
-  assert(bp && nmemb >= 0 && size > 0 && pswap && vswap && compar);
-  if(nmemb < 10){
-    if(nmemb > 1) cbisort(bp, nmemb, size, compar);
-    return;
-  }
-  top = 0;
-  bottom = nmemb - 1;
-  memcpy(pswap, bp + (nmemb / 2) * size, size);
-  while(top - 1 < bottom){
-    if(compar(bp + top * size, pswap) < 0){
-      top++;
-    } else if(compar(bp + bottom * size, pswap) > 0){
-      bottom--;
-    } else {
-      if(top != bottom){
-        memcpy(vswap, bp + top * size, size);
-        memcpy(bp + top * size, bp + bottom * size, size);
-        memcpy(bp + bottom * size, vswap, size);
-      }
-      top++;
-      bottom--;
-    }
-  }
-  cbqsortsub(bp, top, size, pswap, vswap, compar);
-  cbqsortsub(bp + (bottom + 1) * size, nmemb - bottom - 1, size, pswap, vswap, compar);
-}
-
-
-/* Compare two list elements.
-   `a' specifies the pointer to one element.
-   `b' specifies the pointer to the other element.
-   The return value is positive if a is big, negative if b is big, else, it is 0. */
-static int cblistelemcmp(const void *a, const void *b){
-  int i, size;
-  CBLISTDATUM *ap, *bp;
-  char *ao, *bo;
-  assert(a && b);
-  ap = (CBLISTDATUM *)a;
-  bp = (CBLISTDATUM *)b;
-  ao = ap->dptr;
-  bo = bp->dptr;
-  size = ap->dsize < bp->dsize ? ap->dsize : bp->dsize;
-  for(i = 0; i < size; i++){
-    if(ao[i] > bo[i]) return 1;
-    if(ao[i] < bo[i]) return -1;
-  }
-  return ap->dsize - bp->dsize;
-}
-
-
-/* Compare two keys.
-   `abuf' specifies the pointer to the region of the former.
-   `asiz' specifies the size of the region.
-   `bbuf' specifies the pointer to the region of the latter.
-   `bsiz' specifies the size of the region.
-   The return value is 0 if two equals, positive if the formar is big, else, negative. */
-static int cbkeycmp(const char *abuf, int asiz, const char *bbuf, int bsiz){
-  assert(abuf && asiz >= 0 && bbuf && bsiz >= 0);
-  if(asiz > bsiz) return 1;
-  if(asiz < bsiz) return -1;
-  return memcmp(abuf, bbuf, asiz);
-}
-
-
-
-/* END OF FILE */

Copied: box/trunk/qdbm/cabin.c (from rev 2716, box/trunk/qdbm/cabin.c)
===================================================================
--- box/trunk/qdbm/cabin.c	                        (rev 0)
+++ box/trunk/qdbm/cabin.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,3529 @@
+/*************************************************************************************************
+ * Implementation of Cabin
+ *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
+ * This file is part of QDBM, Quick Database Manager.
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
+ * Lesser General Public License as published by the Free Software Foundation; either version
+ * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
+ * details.
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ *************************************************************************************************/
+
+
+#define QDBM_INTERNAL  1
+
+#include "cabin.h"
+#include "myconf.h"
+
+#define CB_GCUNIT      64                /* allocation unit size of a buffer in gc */
+#define CB_SPBUFSIZ    32                /* size of a buffer for sprintf */
+#define CB_SPMAXWIDTH  128               /* max width of a column for sprintf */
+#define CB_MAPPBNUM    251               /* bucket size of a petit map handle */
+#define CB_MAPCSUNIT   52                /* small allocation unit size of map concatenation */
+#define CB_MAPCBUNIT   252               /* big allocation unit size of map concatenation */
+#define CB_MSGBUFSIZ   256               /* size of a buffer for log message */
+#define CB_IOBUFSIZ    8192              /* size of an I/O buffer */
+#define CB_FILEMODE    00644             /* permission of a creating file */
+#define CB_NUMBUFSIZ   32                /* size of a buffer for a number */
+#define CB_ENCBUFSIZ   32                /* size of a buffer for encoding name */
+#define CB_DATEBUFSIZ  64                /* size of a buffer for date expression */
+#define CB_VNUMBUFSIZ  8                 /* size of a buffer for variable length number */
+
+/* set a buffer for a variable length number */
+#define CB_SETVNUMBUF(CB_len, CB_buf, CB_num) \
+  do { \
+    int _CB_num; \
+    _CB_num = (CB_num); \
+    if(_CB_num == 0){ \
+      ((signed char *)(CB_buf))[0] = 0; \
+      (CB_len) = 1; \
+    } else { \
+      (CB_len) = 0; \
+      while(_CB_num > 0){ \
+        int _CB_rem = _CB_num & 0x7f; \
+        _CB_num >>= 7; \
+        if(_CB_num > 0){ \
+          ((signed char *)(CB_buf))[(CB_len)] = -_CB_rem - 1; \
+        } else { \
+          ((signed char *)(CB_buf))[(CB_len)] = _CB_rem; \
+        } \
+        (CB_len)++; \
+      } \
+    } \
+  } while(FALSE)
+
+/* read a variable length buffer */
+#define CB_READVNUMBUF(CB_buf, CB_size, CB_num, CB_step) \
+  do { \
+    int _CB_i, _CB_base; \
+    CB_num = 0; \
+    _CB_base = 1; \
+    if((size) < 2){ \
+      CB_num = ((signed char *)(CB_buf))[0]; \
+      (CB_step) = 1; \
+    } else { \
+      for(_CB_i = 0; _CB_i < (size); _CB_i++){ \
+        if(((signed char *)(CB_buf))[_CB_i] >= 0){ \
+          CB_num += ((signed char *)(CB_buf))[_CB_i] * _CB_base; \
+          break; \
+        } \
+        CB_num += _CB_base * (((signed char *)(CB_buf))[_CB_i] + 1) * -1; \
+        _CB_base *= 128; \
+      } \
+      (CB_step) = _CB_i + 1; \
+    } \
+  } while(FALSE)
+
+/* get the first hash value */
+#define CB_FIRSTHASH(CB_res, CB_kbuf, CB_ksiz) \
+  do { \
+    const unsigned char *_CB_p; \
+    int _CB_ksiz; \
+    _CB_p = (const unsigned char *)(CB_kbuf); \
+    _CB_ksiz = CB_ksiz; \
+    for((CB_res) = 19780211; _CB_ksiz--;){ \
+      (CB_res) = (CB_res) * 37 + *(_CB_p)++; \
+    } \
+    (CB_res) &= INT_MAX; \
+  } while(FALSE)
+
+/* get the second hash value */
+#define CB_SECONDHASH(CB_res, CB_kbuf, CB_ksiz) \
+  do { \
+    const unsigned char *_CB_p; \
+    int _CB_ksiz; \
+    _CB_p = (const unsigned char *)(CB_kbuf) + CB_ksiz - 1; \
+    _CB_ksiz = CB_ksiz; \
+    for((CB_res) = 0x13579bdf; _CB_ksiz--;){ \
+      (CB_res) = (CB_res) * 31 + *(_CB_p)--; \
+    } \
+    (CB_res) &= INT_MAX; \
+  } while(FALSE)
+
+
+/* private function prototypes */
+static void cbggchandler(void);
+static void cbggckeeper(void *ptr, void (*func)(void *));
+static void cbqsortsub(char *bp, int nmemb, int size, char *pswap, char *vswap,
+                       int(*compar)(const void *, const void *));
+static int cblistelemcmp(const void *a, const void *b);
+static int cbkeycmp(const char *abuf, int asiz, const char *bbuf, int bsiz);
+
+
+
+/*************************************************************************************************
+ * public objects
+ *************************************************************************************************/
+
+
+/* Call back function for handling a fatal error. */
+void (*cbfatalfunc)(const char *message) = NULL;
+
+
+/* Allocate a region on memory. */
+void *cbmalloc(size_t size){
+  char *p;
+  assert(size > 0 && size < INT_MAX);
+  if(!(p = malloc(size))) cbmyfatal("out of memory");
+  return p;
+}
+
+
+/* Re-allocate a region on memory. */
+void *cbrealloc(void *ptr, size_t size){
+  char *p;
+  assert(size > 0);
+  if(!(p = realloc(ptr, size))) cbmyfatal("out of memory");
+  return p;
+}
+
+
+/* Duplicate a region on memory. */
+char *cbmemdup(const char *ptr, int size){
+  char *p;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  CB_MALLOC(p, size + 1);
+  memcpy(p, ptr, size);
+  p[size] = '\0';
+  return p;
+}
+
+
+/* Free a region on memory. */
+void cbfree(void *ptr){
+  free(ptr);
+}
+
+
+/* Register the pointer or handle of an object to the global garbage collector. */
+void cbglobalgc(void *ptr, void (*func)(void *)){
+  assert(ptr && func);
+  cbggckeeper(ptr, func);
+}
+
+
+/* Exercise the global garbage collector explicitly. */
+void cbggcsweep(void){
+  cbggckeeper(NULL, NULL);
+}
+
+
+/* Check availability of allocation of the virtual memory. */
+int cbvmemavail(size_t size){
+  assert(size >= 0);
+  return _qdbm_vmemavail(size);
+}
+
+
+/* Sort an array using insert sort. */
+void cbisort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
+  char *bp, *swap;
+  int i, j;
+  assert(base && nmemb >= 0 && size > 0 && compar);
+  bp = (char *)base;
+  CB_MALLOC(swap, size);
+  for(i = 1; i < nmemb; i++){
+    if(compar(bp + (i - 1) * size, bp + i * size) > 0){
+      memcpy(swap, bp + i * size, size);
+      for(j = i; j > 0; j--){
+        if(compar(bp + (j - 1) * size, swap) < 0) break;
+        memcpy(bp + j * size, bp + (j - 1) * size, size);
+      }
+      memcpy(bp + j * size, swap, size);
+    }
+  }
+  free(swap);
+}
+
+
+/* Sort an array using shell sort. */
+void cbssort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
+  char *bp, *swap;
+  int step, bottom, i, j;
+  assert(base && nmemb >= 0 && size > 0 && compar);
+  bp = (char *)base;
+  CB_MALLOC(swap, size);
+  for(step = (nmemb - 1) / 3; step >= 0; step = (step - 1) / 3){
+    if(step < 5) step = 1;
+    for(bottom = 0; bottom < step; bottom++){
+      for(i = bottom + step; i < nmemb; i += step){
+        if(compar(bp + (i - step) * size, bp + i * size) > 0){
+          memcpy(swap, bp + i * size, size);
+          for(j = i; j > step - 1; j -= step){
+            if(compar(bp + (j - step) * size, swap) < 0) break;
+            memcpy(bp + j * size, bp + (j - step) * size, size);
+          }
+          memcpy(bp + j * size, swap, size);
+        }
+      }
+    }
+    if(step < 2) break;
+  }
+  free(swap);
+}
+
+
+/* Sort an array using heap sort. */
+void cbhsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
+  char *bp, *swap;
+  int top, bottom, mybot, i;
+  assert(base && nmemb >= 0 && size > 0 && compar);
+  bp = (char *)base;
+  nmemb--;
+  bottom = nmemb / 2 + 1;
+  top = nmemb;
+  CB_MALLOC(swap, size);
+  while(bottom > 0){
+    bottom--;
+    mybot = bottom;
+    i = 2 * mybot;
+    while(i <= top) {
+      if(i < top && compar(bp + (i + 1) * size, bp + i * size) > 0) i++;
+      if(compar(bp + mybot * size, bp + i * size) >= 0) break;
+      memcpy(swap, bp + mybot * size, size);
+      memcpy(bp + mybot * size, bp + i * size, size);
+      memcpy(bp + i * size, swap, size);
+      mybot = i;
+      i = 2 * mybot;
+    }
+  }
+  while(top > 0){
+    memcpy(swap, bp, size);
+    memcpy(bp, bp + top * size, size);
+    memcpy(bp + top * size, swap, size);
+    top--;
+    mybot = bottom;
+    i = 2 * mybot;
+    while(i <= top){
+      if(i < top && compar(bp + (i + 1) * size, bp + i * size) > 0) i++;
+      if(compar(bp + mybot * size, bp + i * size) >= 0) break;
+      memcpy(swap, bp + mybot * size, size);
+      memcpy(bp + mybot * size, bp + i * size, size);
+      memcpy(bp + i * size, swap, size);
+      mybot = i;
+      i = 2 * mybot;
+    }
+  }
+  free(swap);
+}
+
+
+/* Sort an array using quick sort. */
+void cbqsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *)){
+  char *pswap, *vswap;
+  assert(base && nmemb >= 0 && size > 0 && compar);
+  CB_MALLOC(pswap, size);
+  CB_MALLOC(vswap, size);
+  cbqsortsub(base, nmemb, size, pswap, vswap, compar);
+  free(vswap);
+  free(pswap);
+}
+
+
+/* Compare two strings with case insensitive evaluation. */
+int cbstricmp(const char *astr, const char *bstr){
+  int ac, bc;
+  assert(astr && bstr);
+  while(*astr != '\0'){
+    if(*bstr == '\0') return 1;
+    ac = (*astr >= 'A' && *astr <= 'Z') ? *astr + ('a' - 'A') : *(unsigned char *)astr;
+    bc = (*bstr >= 'A' && *bstr <= 'Z') ? *bstr + ('a' - 'A') : *(unsigned char *)bstr;
+    if(ac != bc) return ac - bc;
+    astr++;
+    bstr++;
+  }
+  return *bstr == '\0' ? 0 : -1;
+}
+
+
+/* Check whether a string begins with a key. */
+int cbstrfwmatch(const char *str, const char *key){
+  assert(str && key);
+  while(*key != '\0'){
+    if(*str != *key || *str == '\0') return FALSE;
+    key++;
+    str++;
+  }
+  return TRUE;
+}
+
+
+/* Check whether a string begins with a key, with case insensitive evaluation. */
+int cbstrfwimatch(const char *str, const char *key){
+  int sc, kc;
+  assert(str && key);
+  while(*key != '\0'){
+    if(*str == '\0') return FALSE;
+    sc = *str;
+    if(sc >= 'A' && sc <= 'Z') sc += 'a' - 'A';
+    kc = *key;
+    if(kc >= 'A' && kc <= 'Z') kc += 'a' - 'A';
+    if(sc != kc) return FALSE;
+    key++;
+    str++;
+  }
+  return TRUE;
+}
+
+
+/* Check whether a string ends with a key. */
+int cbstrbwmatch(const char *str, const char *key){
+  int slen, klen, i;
+  assert(str && key);
+  slen = strlen(str);
+  klen = strlen(key);
+  for(i = 1; i <= klen; i++){
+    if(i > slen || str[slen-i] != key[klen-i]) return FALSE;
+  }
+  return TRUE;
+}
+
+
+/* Check whether a string ends with a key, with case insensitive evaluation. */
+int cbstrbwimatch(const char *str, const char *key){
+  int slen, klen, i, sc, kc;
+  assert(str && key);
+  slen = strlen(str);
+  klen = strlen(key);
+  for(i = 1; i <= klen; i++){
+    if(i > slen) return FALSE;
+    sc = str[slen-i];
+    if(sc >= 'A' && sc <= 'Z') sc += 'a' - 'A';
+    kc = key[klen-i];
+    if(kc >= 'A' && kc <= 'Z') kc += 'a' - 'A';
+    if(sc != kc) return FALSE;
+  }
+  return TRUE;
+}
+
+
+/* Locate a substring in a string using KMP method. */
+char *cbstrstrkmp(const char *haystack, const char *needle){
+  int i, j, hlen, nlen;
+  signed char tbl[0x100];
+  assert(haystack && needle);
+  nlen = strlen(needle);
+  if(nlen >= 0x100) return strstr(haystack, needle);
+  tbl[0] = -1;
+  i = 0;
+  j = -1;
+  while(i < nlen){
+    while((j >= 0) && (needle[i] != needle[j])){
+      j = tbl[j];
+    }
+    i++;
+    j++;
+    tbl[i] = j;
+  }
+  hlen = strlen(haystack);
+  i = 0;
+  j = 0;
+  while(i < hlen && j < nlen){
+    while((j >= 0) && (haystack[i] != needle[j])){
+      j = tbl[j];
+    }
+    i++;
+    j++;
+  }
+  if(j == nlen) return (char *)(haystack + i - nlen);
+  return NULL;
+}
+
+
+/* Locate a substring in a string using BM method. */
+char *cbstrstrbm(const char *haystack, const char *needle){
+  const unsigned char *rp;
+  const char *ep;
+  unsigned char tbl[0x100];
+  int i, j, nlen, len, idx;
+  assert(haystack && needle);
+  nlen = strlen(needle);
+  if(nlen < 3 || nlen >= 0x100) return strstr(haystack, needle);
+  for(i = 0; i < 0x100; i++){
+    tbl[i] = nlen;
+  }
+  len = nlen;
+  rp = (const unsigned char *)needle;
+  while(len > 0){
+    tbl[*rp++] = --len;
+  }
+  nlen--;
+  ep = haystack + strlen(haystack) - nlen;
+  while(haystack < ep){
+    for(i = nlen; haystack[i] == needle[i]; i--){
+      if(i == 0) return (char *)haystack;
+    }
+    idx = ((unsigned char *)haystack)[i];
+    j = tbl[idx] - nlen + i;
+    haystack += j > 0 ? j : 2;
+  }
+  return NULL;
+}
+
+
+/* Convert the letters of a string to upper case. */
+char *cbstrtoupper(char *str){
+  int i;
+  assert(str);
+  for(i = 0; str[i] != '\0'; i++){
+    if(str[i] >= 'a' && str[i] <= 'z') str[i] -= 'a' - 'A';
+  }
+  return str;
+}
+
+
+/* Convert the letters of a string to lower case. */
+char *cbstrtolower(char *str){
+  int i;
+  assert(str);
+  for(i = 0; str[i] != '\0'; i++){
+    if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 'a' - 'A';
+  }
+  return str;
+}
+
+
+/* Cut space characters at head or tail of a string. */
+char *cbstrtrim(char *str){
+  char *wp;
+  int i, head;
+  assert(str);
+  wp = str;
+  head = TRUE;
+  for(i = 0; str[i] != '\0'; i++){
+    if((str[i] >= 0x07 && str[i] <= 0x0d) || str[i] == 0x20){
+      if(!head) *(wp++) = str[i];
+    } else {
+      *(wp++) = str[i];
+      head = FALSE;
+    }
+  }
+  *wp = '\0';
+  while(wp > str && ((wp[-1] >= 0x07 && wp[-1] <= 0x0d) || wp[-1] == 0x20)){
+    *(--wp) = '\0';
+  }
+  return str;
+}
+
+
+/* Squeeze space characters in a string and trim it. */
+char *cbstrsqzspc(char *str){
+  char *wp;
+  int i, spc;
+  assert(str);
+  wp = str;
+  spc = TRUE;
+  for(i = 0; str[i] != '\0'; i++){
+    if(str[i] > 0 && str[i] <= ' '){
+      if(!spc) *(wp++) = str[i];
+      spc = TRUE;
+    } else {
+      *(wp++) = str[i];
+      spc = FALSE;
+    }
+  }
+  *wp = '\0';
+  for(wp--; wp >= str; wp--){
+    if(*wp > 0 && *wp <= ' '){
+      *wp = '\0';
+    } else {
+      break;
+    }
+  }
+  return str;
+}
+
+
+/* Count the number of characters in a string of UTF-8. */
+int cbstrcountutf(const char *str){
+  const unsigned char *rp;
+  int cnt;
+  assert(str);
+  rp = (unsigned char *)str;
+  cnt = 0;
+  while(*rp != '\0'){
+    if((*rp & 0x80) == 0x00 || (*rp & 0xe0) == 0xc0 ||
+       (*rp & 0xf0) == 0xe0 || (*rp & 0xf8) == 0xf0) cnt++;
+    rp++;
+  }
+  return cnt;
+}
+
+
+/* Cut a string of UTF-8 at the specified number of characters. */
+char *cbstrcututf(char *str, int num){
+  unsigned char *wp;
+  int cnt;
+  assert(str && num >= 0);
+  wp = (unsigned char *)str;
+  cnt = 0;
+  while(*wp != '\0'){
+    if((*wp & 0x80) == 0x00 || (*wp & 0xe0) == 0xc0 ||
+       (*wp & 0xf0) == 0xe0 || (*wp & 0xf8) == 0xf0){
+      cnt++;
+      if(cnt > num){
+        *wp = '\0';
+        break;
+      }
+    }
+    wp++;
+  }
+  return str;
+}
+
+
+/* Get a datum handle. */
+CBDATUM *cbdatumopen(const char *ptr, int size){
+  CBDATUM *datum;
+  CB_MALLOC(datum, sizeof(*datum));
+  CB_MALLOC(datum->dptr, CB_DATUMUNIT);
+  datum->dptr[0] = '\0';
+  datum->dsize = 0;
+  datum->asize = CB_DATUMUNIT;
+  if(ptr) CB_DATUMCAT(datum, ptr, (size >= 0 ? size : strlen(ptr)));
+  return datum;
+}
+
+
+/* Copy a datum. */
+CBDATUM *cbdatumdup(const CBDATUM *datum){
+  assert(datum);
+  return cbdatumopen(datum->dptr, datum->dsize);
+}
+
+
+/* Free a datum handle. */
+void cbdatumclose(CBDATUM *datum){
+  assert(datum);
+  free(datum->dptr);
+  free(datum);
+}
+
+
+/* Concatenate a datum and a region. */
+void cbdatumcat(CBDATUM *datum, const char *ptr, int size){
+  assert(datum && ptr);
+  if(size < 0) size = strlen(ptr);
+  if(datum->dsize + size >= datum->asize){
+    datum->asize = datum->asize * 2 + size + 1;
+    CB_REALLOC(datum->dptr, datum->asize);
+  }
+  memcpy(datum->dptr + datum->dsize, ptr, size);
+  datum->dsize += size;
+  datum->dptr[datum->dsize] = '\0';
+}
+
+
+/* Get the pointer of the region of a datum. */
+const char *cbdatumptr(const CBDATUM *datum){
+  assert(datum);
+  return datum->dptr;
+}
+
+
+/* Get the size of the region of a datum. */
+int cbdatumsize(const CBDATUM *datum){
+  assert(datum);
+  return datum->dsize;
+}
+
+
+/* Set the size of the region of a datum. */
+void cbdatumsetsize(CBDATUM *datum, int size){
+  assert(datum && size >= 0);
+  if(size <= datum->dsize){
+    datum->dsize = size;
+    datum->dptr[size] = '\0';
+  } else {
+    if(size >= datum->asize){
+      datum->asize = datum->asize * 2 + size + 1;
+      CB_REALLOC(datum->dptr, datum->asize);
+    }
+    memset(datum->dptr + datum->dsize, 0, (size - datum->dsize) + 1);
+    datum->dsize = size;
+  }
+}
+
+
+/* Perform formatted output into a datum. */
+void cbdatumprintf(CBDATUM *datum, const char *format, ...){
+  va_list ap;
+  char *tmp, cbuf[CB_NUMBUFSIZ], tbuf[CB_NUMBUFSIZ*2];
+  unsigned char c;
+  int cblen, tlen;
+  assert(datum && format);
+  va_start(ap, format);
+  while(*format != '\0'){
+    if(*format == '%'){
+      cbuf[0] = '%';
+      cblen = 1;
+      format++;
+      while(strchr("0123456789 .+-", *format) && *format != '\0' && cblen < CB_NUMBUFSIZ - 1){
+        cbuf[cblen++] = *format;
+        format++;
+      }
+      cbuf[cblen++] = *format;
+      cbuf[cblen] = '\0';
+      switch(*format){
+      case 's':
+        tmp = va_arg(ap, char *);
+        if(!tmp) tmp = "(null)";
+        cbdatumcat(datum, tmp, -1);
+        break;
+      case 'd':
+        tlen = sprintf(tbuf, cbuf, va_arg(ap, int));
+        cbdatumcat(datum, tbuf, tlen);
+        break;
+      case 'o': case 'u': case 'x': case 'X': case 'c':
+        tlen = sprintf(tbuf, cbuf, va_arg(ap, unsigned int));
+        cbdatumcat(datum, tbuf, tlen);
+        break;
+      case 'e': case 'E': case 'f': case 'g': case 'G':
+        tlen = sprintf(tbuf, cbuf, va_arg(ap, double));
+        cbdatumcat(datum, tbuf, tlen);
+        break;
+      case '@':
+        tmp = va_arg(ap, char *);
+        if(!tmp) tmp = "(null)";
+        while(*tmp){
+          switch(*tmp){
+          case '&': cbdatumcat(datum, "&", 5); break;
+          case '<': cbdatumcat(datum, "<", 4); break;
+          case '>': cbdatumcat(datum, ">", 4); break;
+          case '"': cbdatumcat(datum, """, 6); break;
+          default:
+            if(!((*tmp >= 0 && *tmp <= 0x8) || (*tmp >= 0x0e && *tmp <= 0x1f)))
+              cbdatumcat(datum, tmp, 1);
+            break;
+          }
+          tmp++;
+        }
+        break;
+      case '?':
+        tmp = va_arg(ap, char *);
+        if(!tmp) tmp = "(null)";
+        while(*tmp){
+          c = *(unsigned char *)tmp;
+          if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
+             (c >= '0' && c <= '9') || (c != '\0' && strchr("_-.", c))){
+            cbdatumcat(datum, tmp, 1);
+          } else {
+            tlen = sprintf(tbuf, "%%%02X", c);
+            cbdatumcat(datum, tbuf, tlen);
+          }
+          tmp++;
+        }
+        break;
+      case ':':
+        tmp = va_arg(ap, char *);
+        if(!tmp) tmp = "";
+        tmp = cbmimeencode(tmp, "UTF-8", TRUE);
+        cbdatumcat(datum, tmp, -1);
+        free(tmp);
+        break;
+      case '%':
+        cbdatumcat(datum, "%", 1);
+        break;
+      }
+    } else {
+      cbdatumcat(datum, format, 1);
+    }
+    format++;
+  }
+  va_end(ap);
+}
+
+
+/* Convert a datum to an allocated region. */
+char *cbdatumtomalloc(CBDATUM *datum, int *sp){
+  char *ptr;
+  assert(datum);
+  ptr = datum->dptr;
+  if(sp) *sp = datum->dsize;
+  free(datum);
+  return ptr;
+}
+
+
+/* Get a list handle. */
+CBLIST *cblistopen(void){
+  CBLIST *list;
+  CB_MALLOC(list, sizeof(*list));
+  list->anum = CB_LISTUNIT;
+  CB_MALLOC(list->array, sizeof(list->array[0]) * list->anum);
+  list->start = 0;
+  list->num = 0;
+  return list;
+}
+
+
+/* Copy a list. */
+CBLIST *cblistdup(const CBLIST *list){
+  CBLIST *newlist;
+  int i, size;
+  const char *val;
+  assert(list);
+  CB_LISTOPEN2(newlist, CB_LISTNUM(list));
+  for(i = 0; i < CB_LISTNUM(list); i++){
+    val = CB_LISTVAL2(list, i, size);
+    CB_LISTPUSH(newlist, val, size);
+  }
+  return newlist;
+}
+
+
+/* Close a list handle. */
+void cblistclose(CBLIST *list){
+  int i, end;
+  assert(list);
+  end = list->start + list->num;
+  for(i = list->start; i < end; i++){
+    free(list->array[i].dptr);
+  }
+  free(list->array);
+  free(list);
+}
+
+
+/* Get the number of elements of a list. */
+int cblistnum(const CBLIST *list){
+  assert(list);
+  return list->num;
+}
+
+
+/* Get the pointer to the region of an element. */
+const char *cblistval(const CBLIST *list, int index, int *sp){
+  assert(list && index >= 0);
+  if(index >= list->num) return NULL;
+  index += list->start;
+  if(sp) *sp = list->array[index].dsize;
+  return list->array[index].dptr;
+}
+
+
+/* Add an element at the end of a list. */
+void cblistpush(CBLIST *list, const char *ptr, int size){
+  int index;
+  assert(list && ptr);
+  if(size < 0) size = strlen(ptr);
+  index = list->start + list->num;
+  if(index >= list->anum){
+    list->anum *= 2;
+    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
+  }
+  CB_MALLOC(list->array[index].dptr, (size < CB_DATUMUNIT ? CB_DATUMUNIT : size) + 1);
+  memcpy(list->array[index].dptr, ptr, size);
+  list->array[index].dptr[size] = '\0';
+  list->array[index].dsize = size;
+  list->num++;
+}
+
+
+/* Remove an element of the end of a list. */
+char *cblistpop(CBLIST *list, int *sp){
+  int index;
+  assert(list);
+  if(list->num < 1) return NULL;
+  index = list->start + list->num - 1;
+  list->num--;
+  if(sp) *sp = list->array[index].dsize;
+  return list->array[index].dptr;
+}
+
+
+/* Add an element at the top of a list. */
+void cblistunshift(CBLIST *list, const char *ptr, int size){
+  int index;
+  assert(list && ptr);
+  if(size < 0) size = strlen(ptr);
+  if(list->start < 1){
+    if(list->start + list->num >= list->anum){
+      list->anum *= 2;
+      CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
+    }
+    list->start = list->anum - list->num;
+    memmove(list->array + list->start, list->array, list->num * sizeof(list->array[0]));
+  }
+  index = list->start - 1;
+  CB_MALLOC(list->array[index].dptr, (size < CB_DATUMUNIT ? CB_DATUMUNIT : size) + 1);
+  memcpy(list->array[index].dptr, ptr, size);
+  list->array[index].dptr[size] = '\0';
+  list->array[index].dsize = size;
+  list->start--;
+  list->num++;
+}
+
+
+/* Remove an element of the top of a list. */
+char *cblistshift(CBLIST *list, int *sp){
+  int index;
+  assert(list);
+  if(list->num < 1) return NULL;
+  index = list->start;
+  list->start++;
+  list->num--;
+  if(sp) *sp = list->array[index].dsize;
+  return list->array[index].dptr;
+}
+
+
+/* Add an element at the specified location of a list. */
+void cblistinsert(CBLIST *list, int index, const char *ptr, int size){
+  assert(list && index >= 0);
+  if(index > list->num) return;
+  if(size < 0) size = strlen(ptr);
+  index += list->start;
+  if(list->start + list->num >= list->anum){
+    list->anum *= 2;
+    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
+  }
+  memmove(list->array + index + 1, list->array + index,
+          sizeof(list->array[0]) * (list->start + list->num - index));
+  CB_MEMDUP(list->array[index].dptr, ptr, size);
+  list->array[index].dsize = size;
+  list->num++;
+}
+
+
+/* Remove an element at the specified location of a list. */
+char *cblistremove(CBLIST *list, int index, int *sp){
+  char *dptr;
+  assert(list && index >= 0);
+  if(index >= list->num) return NULL;
+  index += list->start;
+  dptr = list->array[index].dptr;
+  if(sp) *sp = list->array[index].dsize;
+  list->num--;
+  memmove(list->array + index, list->array + index + 1,
+          sizeof(list->array[0]) * (list->start + list->num - index));
+  return dptr;
+}
+
+
+/* Overwrite an element at the specified location of a list. */
+void cblistover(CBLIST *list, int index, const char *ptr, int size){
+  assert(list && index >= 0);
+  if(index >= list->num) return;
+  if(size < 0) size = strlen(ptr);
+  index += list->start;
+  if(size > list->array[index].dsize)
+    CB_REALLOC(list->array[index].dptr, size + 1);
+  memcpy(list->array[index].dptr, ptr, size);
+  list->array[index].dsize = size;
+  list->array[index].dptr[size] = '\0';
+}
+
+
+/* Sort elements of a list in lexical order. */
+void cblistsort(CBLIST *list){
+  assert(list);
+  qsort(list->array + list->start, list->num, sizeof(list->array[0]), cblistelemcmp);
+}
+
+
+/* Search a list for an element using liner search. */
+int cblistlsearch(const CBLIST *list, const char *ptr, int size){
+  int i, end;
+  assert(list && ptr);
+  if(size < 0) size = strlen(ptr);
+  end = list->start + list->num;
+  for(i = list->start; i < end; i++){
+    if(list->array[i].dsize == size && !memcmp(list->array[i].dptr, ptr, size))
+      return i - list->start;
+  }
+  return -1;
+}
+
+
+/* Search a list for an element using binary search. */
+int cblistbsearch(const CBLIST *list, const char *ptr, int size){
+  CBLISTDATUM key, *res;
+  assert(list && ptr);
+  if(size < 0) size = strlen(ptr);
+  CB_MEMDUP(key.dptr, ptr, size);
+  key.dsize = size;
+  res = bsearch(&key, list->array + list->start, list->num, sizeof(list->array[0]), cblistelemcmp);
+  free(key.dptr);
+  return res ? (res - list->array - list->start) : -1;
+}
+
+
+/* Serialize a list into a byte array. */
+char *cblistdump(const CBLIST *list, int *sp){
+  char *buf, vnumbuf[CB_VNUMBUFSIZ];
+  const char *vbuf;
+  int i, bsiz, vnumsiz, ln, vsiz;
+  assert(list && sp);
+  ln = CB_LISTNUM(list);
+  CB_SETVNUMBUF(vnumsiz, vnumbuf, ln);
+  CB_MALLOC(buf, vnumsiz + 1);
+  memcpy(buf, vnumbuf, vnumsiz);
+  bsiz = vnumsiz;
+  for(i = 0; i < ln; i++){
+    vbuf = CB_LISTVAL2(list, i, vsiz);
+    CB_SETVNUMBUF(vnumsiz, vnumbuf, vsiz);
+    CB_REALLOC(buf, bsiz + vnumsiz + vsiz + 1);
+    memcpy(buf + bsiz, vnumbuf, vnumsiz);
+    bsiz += vnumsiz;
+    memcpy(buf + bsiz, vbuf, vsiz);
+    bsiz += vsiz;
+  }
+  *sp = bsiz;
+  return buf;
+}
+
+
+/* Redintegrate a serialized list. */
+CBLIST *cblistload(const char *ptr, int size){
+  CBLIST *list;
+  const char *rp;
+  int i, anum, step, ln, vsiz;
+  assert(ptr && size >= 0);
+  anum = size / (sizeof(CBLISTDATUM) + 1);
+  CB_LISTOPEN2(list, anum);
+  rp = ptr;
+  CB_READVNUMBUF(rp, size, ln, step);
+  rp += step;
+  size -= step;
+  if(ln > size) return list;
+  for(i = 0; i < ln; i++){
+    if(size < 1) break;
+    CB_READVNUMBUF(rp, size, vsiz, step);
+    rp += step;
+    size -= step;
+    if(vsiz > size) break;
+    CB_LISTPUSH(list, rp, vsiz);
+    rp += vsiz;
+  }
+  return list;
+}
+
+
+/* Get a map handle. */
+CBMAP *cbmapopen(void){
+  return cbmapopenex(CB_MAPBNUM);
+}
+
+
+/* Copy a map. */
+CBMAP *cbmapdup(CBMAP *map){
+  CBMAP *newmap;
+  const char *kbuf, *vbuf;
+  int ksiz, vsiz;
+  assert(map);
+  cbmapiterinit(map);
+  newmap = map->rnum > CB_MAPPBNUM ? cbmapopen() : cbmapopenex(CB_MAPPBNUM);
+  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
+    CB_MAPITERVAL(vbuf, kbuf, vsiz);
+    cbmapput(newmap, kbuf, ksiz, vbuf, vsiz, FALSE);
+  }
+  cbmapiterinit(map);
+  return newmap;
+}
+
+
+/* Close a map handle. */
+void cbmapclose(CBMAP *map){
+  CBMAPDATUM *datum, *next;
+  datum = map->first;
+  while(datum){
+    next = datum->next;
+    free(datum);
+    datum = next;
+  }
+  free(map->buckets);
+  free(map);
+}
+
+
+/* Store a record. */
+int cbmapput(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int over){
+  CBMAPDATUM *datum, **entp, *old;
+  char *dbuf;
+  int bidx, hash, kcmp, psiz;
+  assert(map && kbuf && vbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  if(vsiz < 0) vsiz = strlen(vbuf);
+  CB_FIRSTHASH(hash, kbuf, ksiz);
+  bidx = hash % map->bnum;
+  datum = map->buckets[bidx];
+  entp = map->buckets + bidx;
+  CB_SECONDHASH(hash, kbuf, ksiz);
+  while(datum){
+    if(hash > datum->hash){
+      entp = &(datum->left);
+      datum = datum->left;
+    } else if(hash < datum->hash){
+      entp = &(datum->right);
+      datum = datum->right;
+    } else {
+      dbuf = (char *)datum + sizeof(*datum);
+      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+      if(kcmp < 0){
+        entp = &(datum->left);
+        datum = datum->left;
+      } else if(kcmp > 0){
+        entp = &(datum->right);
+        datum = datum->right;
+      } else {
+        if(!over) return FALSE;
+        psiz = CB_ALIGNPAD(ksiz);
+        if(vsiz > datum->vsiz){
+          old = datum;
+          CB_REALLOC(datum, sizeof(*datum) + ksiz + psiz + vsiz + 1);
+          if(datum != old){
+            if(map->first == old) map->first = datum;
+            if(map->last == old) map->last = datum;
+            if(*entp == old) *entp = datum;
+            if(datum->prev) datum->prev->next = datum;
+            if(datum->next) datum->next->prev = datum;
+            dbuf = (char *)datum + sizeof(*datum);
+          }
+        }
+        memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
+        dbuf[ksiz+psiz+vsiz] = '\0';
+        datum->vsiz = vsiz;
+        return TRUE;
+      }
+    }
+  }
+  psiz = CB_ALIGNPAD(ksiz);
+  CB_MALLOC(datum, sizeof(*datum) + ksiz + psiz + vsiz + 1);
+  dbuf = (char *)datum + sizeof(*datum);
+  memcpy(dbuf, kbuf, ksiz);
+  dbuf[ksiz] = '\0';
+  datum->ksiz = ksiz;
+  memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
+  dbuf[ksiz+psiz+vsiz] = '\0';
+  datum->vsiz = vsiz;
+  datum->hash = hash;
+  datum->left = NULL;
+  datum->right = NULL;
+  datum->prev = map->last;
+  datum->next = NULL;
+  *entp = datum;
+  if(!map->first) map->first = datum;
+  if(map->last) map->last->next = datum;
+  map->last = datum;
+  map->rnum++;
+  return TRUE;
+}
+
+
+/* Concatenate a value at the end of the value of the existing record. */
+void cbmapputcat(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz){
+  CBMAPDATUM *datum, **entp, *old;
+  char *dbuf;
+  int bidx, hash, kcmp, psiz, asiz, unit;
+  assert(map && kbuf && vbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  if(vsiz < 0) vsiz = strlen(vbuf);
+  CB_FIRSTHASH(hash, kbuf, ksiz);
+  bidx = hash % map->bnum;
+  datum = map->buckets[bidx];
+  entp = map->buckets + bidx;
+  CB_SECONDHASH(hash, kbuf, ksiz);
+  while(datum){
+    if(hash > datum->hash){
+      entp = &(datum->left);
+      datum = datum->left;
+    } else if(hash < datum->hash){
+      entp = &(datum->right);
+      datum = datum->right;
+    } else {
+      dbuf = (char *)datum + sizeof(*datum);
+      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+      if(kcmp < 0){
+        entp = &(datum->left);
+        datum = datum->left;
+      } else if(kcmp > 0){
+        entp = &(datum->right);
+        datum = datum->right;
+      } else {
+        psiz = CB_ALIGNPAD(ksiz);
+        asiz = sizeof(*datum) + ksiz + psiz + datum->vsiz + vsiz + 1;
+        unit = asiz <= CB_MAPCSUNIT ? CB_MAPCSUNIT : CB_MAPCBUNIT;
+        asiz = (asiz - 1) + unit - (asiz - 1) % unit;
+        old = datum;
+        CB_REALLOC(datum, asiz);
+        if(datum != old){
+          if(map->first == old) map->first = datum;
+          if(map->last == old) map->last = datum;
+          if(*entp == old) *entp = datum;
+          if(datum->prev) datum->prev->next = datum;
+          if(datum->next) datum->next->prev = datum;
+          dbuf = (char *)datum + sizeof(*datum);
+        }
+        memcpy(dbuf + ksiz + psiz + datum->vsiz, vbuf, vsiz);
+        dbuf[ksiz+psiz+datum->vsiz+vsiz] = '\0';
+        datum->vsiz += vsiz;
+        return;
+      }
+    }
+  }
+  psiz = CB_ALIGNPAD(ksiz);
+  asiz = sizeof(*datum) + ksiz + psiz + vsiz + 1;
+  unit = asiz <= CB_MAPCSUNIT ? CB_MAPCSUNIT : CB_MAPCBUNIT;
+  asiz = (asiz - 1) + unit - (asiz - 1) % unit;
+  CB_MALLOC(datum, asiz);
+  dbuf = (char *)datum + sizeof(*datum);
+  memcpy(dbuf, kbuf, ksiz);
+  dbuf[ksiz] = '\0';
+  datum->ksiz = ksiz;
+  memcpy(dbuf + ksiz + psiz, vbuf, vsiz);
+  dbuf[ksiz+psiz+vsiz] = '\0';
+  datum->vsiz = vsiz;
+  datum->hash = hash;
+  datum->left = NULL;
+  datum->right = NULL;
+  datum->prev = map->last;
+  datum->next = NULL;
+  *entp = datum;
+  if(!map->first) map->first = datum;
+  if(map->last) map->last->next = datum;
+  map->last = datum;
+  map->rnum++;
+}
+
+
+/* Delete a record. */
+int cbmapout(CBMAP *map, const char *kbuf, int ksiz){
+  CBMAPDATUM *datum, **entp, *tmp;
+  char *dbuf;
+  int bidx, hash, kcmp;
+  assert(map && kbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  CB_FIRSTHASH(hash, kbuf, ksiz);
+  bidx = hash % map->bnum;
+  datum = map->buckets[bidx];
+  entp = map->buckets + bidx;
+  CB_SECONDHASH(hash, kbuf, ksiz);
+  while(datum){
+    if(hash > datum->hash){
+      entp = &(datum->left);
+      datum = datum->left;
+    } else if(hash < datum->hash){
+      entp = &(datum->right);
+      datum = datum->right;
+    } else {
+      dbuf = (char *)datum + sizeof(*datum);
+      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+      if(kcmp < 0){
+        entp = &(datum->left);
+        datum = datum->left;
+      } else if(kcmp > 0){
+        entp = &(datum->right);
+        datum = datum->right;
+      } else {
+        if(datum->prev) datum->prev->next = datum->next;
+        if(datum->next) datum->next->prev = datum->prev;
+        if(datum == map->first) map->first = datum->next;
+        if(datum == map->last) map->last = datum->prev;
+        if(datum->left && !datum->right){
+          *entp = datum->left;
+        } else if(!datum->left && datum->right){
+          *entp = datum->right;
+        } else if(!datum->left && !datum->left){
+          *entp = NULL;
+        } else {
+          *entp = datum->left;
+          tmp = *entp;
+          while(TRUE){
+            if(hash > tmp->hash){
+              if(tmp->left){
+                tmp = tmp->left;
+              } else {
+                tmp->left = datum->right;
+                break;
+              }
+            } else if(hash < tmp->hash){
+              if(tmp->right){
+                tmp = tmp->right;
+              } else {
+                tmp->right = datum->right;
+                break;
+              }
+            } else {
+              kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+              if(kcmp < 0){
+                if(tmp->left){
+                  tmp = tmp->left;
+                } else {
+                  tmp->left = datum->right;
+                  break;
+                }
+              } else {
+                if(tmp->right){
+                  tmp = tmp->right;
+                } else {
+                  tmp->right = datum->right;
+                  break;
+                }
+              }
+            }
+          }
+        }
+        free(datum);
+        map->rnum--;
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+
+
+/* Retrieve a record. */
+const char *cbmapget(const CBMAP *map, const char *kbuf, int ksiz, int *sp){
+  CBMAPDATUM *datum;
+  char *dbuf;
+  int hash, kcmp;
+  assert(map && kbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  CB_FIRSTHASH(hash, kbuf, ksiz);
+  datum = map->buckets[hash%map->bnum];
+  CB_SECONDHASH(hash, kbuf, ksiz);
+  while(datum){
+    if(hash > datum->hash){
+      datum = datum->left;
+    } else if(hash < datum->hash){
+      datum = datum->right;
+    } else {
+      dbuf = (char *)datum + sizeof(*datum);
+      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+      if(kcmp < 0){
+        datum = datum->left;
+      } else if(kcmp > 0){
+        datum = datum->right;
+      } else {
+        if(sp) *sp = datum->vsiz;
+        return dbuf + datum->ksiz + CB_ALIGNPAD(datum->ksiz);
+      }
+    }
+  }
+  return NULL;
+}
+
+
+/* Move a record to the edge. */
+int cbmapmove(CBMAP *map, const char *kbuf, int ksiz, int head){
+  CBMAPDATUM *datum;
+  char *dbuf;
+  int hash, kcmp;
+  assert(map && kbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  CB_FIRSTHASH(hash, kbuf, ksiz);
+  datum = map->buckets[hash%map->bnum];
+  CB_SECONDHASH(hash, kbuf, ksiz);
+  while(datum){
+    if(hash > datum->hash){
+      datum = datum->left;
+    } else if(hash < datum->hash){
+      datum = datum->right;
+    } else {
+      dbuf = (char *)datum + sizeof(*datum);
+      kcmp = cbkeycmp(kbuf, ksiz, dbuf, datum->ksiz);
+      if(kcmp < 0){
+        datum = datum->left;
+      } else if(kcmp > 0){
+        datum = datum->right;
+      } else {
+        if(head){
+          if(map->first == datum) return TRUE;
+          if(map->last == datum) map->last = datum->prev;
+          if(datum->prev) datum->prev->next = datum->next;
+          if(datum->next) datum->next->prev = datum->prev;
+          datum->prev = NULL;
+          datum->next = map->first;
+          map->first->prev = datum;
+          map->first = datum;
+        } else {
+          if(map->last == datum) return TRUE;
+          if(map->first == datum) map->first = datum->next;
+          if(datum->prev) datum->prev->next = datum->next;
+          if(datum->next) datum->next->prev = datum->prev;
+          datum->prev = map->last;
+          datum->next = NULL;
+          map->last->next = datum;
+          map->last = datum;
+        }
+        return TRUE;
+      }
+    }
+  }
+  return FALSE;
+}
+
+
+/* Initialize the iterator of a map handle. */
+void cbmapiterinit(CBMAP *map){
+  assert(map);
+  map->cur = map->first;
+}
+
+
+/* Get the next key of the iterator. */
+const char *cbmapiternext(CBMAP *map, int *sp){
+  CBMAPDATUM *datum;
+  assert(map);
+  if(!map->cur) return NULL;
+  datum = map->cur;
+  map->cur = datum->next;
+  if(sp) *sp = datum->ksiz;
+  return (char *)datum + sizeof(*datum);
+}
+
+
+/* Get the value binded to the key fetched from the iterator. */
+const char *cbmapiterval(const char *kbuf, int *sp){
+  CBMAPDATUM *datum;
+  assert(kbuf);
+  datum = (CBMAPDATUM *)(kbuf - sizeof(*datum));
+  if(sp) *sp = datum->vsiz;
+  return (char *)datum + sizeof(*datum) + datum->ksiz + CB_ALIGNPAD(datum->ksiz);
+}
+
+
+/* Get the number of the records stored in a map. */
+int cbmaprnum(const CBMAP *map){
+  assert(map);
+  return map->rnum;
+}
+
+
+/* Get the list handle contains all keys in a map. */
+CBLIST *cbmapkeys(CBMAP *map){
+  CBLIST *list;
+  const char *kbuf;
+  int anum, ksiz;
+  assert(map);
+  anum = cbmaprnum(map);
+  CB_LISTOPEN2(list, anum);
+  cbmapiterinit(map);
+  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
+    CB_LISTPUSH(list, kbuf, ksiz);
+  }
+  return list;
+}
+
+
+/* Get the list handle contains all values in a map. */
+CBLIST *cbmapvals(CBMAP *map){
+  CBLIST *list;
+  const char *kbuf, *vbuf;
+  int anum, ksiz, vsiz;
+  assert(map);
+  anum = cbmaprnum(map);
+  CB_LISTOPEN2(list, anum);
+  cbmapiterinit(map);
+  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
+    CB_MAPITERVAL(vbuf, kbuf, vsiz);
+    CB_LISTPUSH(list, vbuf, vsiz);
+  }
+  return list;
+}
+
+
+/* Serialize a map into a byte array. */
+char *cbmapdump(CBMAP *map, int *sp){
+  char *buf, vnumbuf[CB_VNUMBUFSIZ];
+  const char *kbuf, *vbuf;
+  int bsiz, vnumsiz, rn, ksiz, vsiz;
+  assert(map && sp);
+  rn = cbmaprnum(map);
+  CB_SETVNUMBUF(vnumsiz, vnumbuf, rn);
+  CB_MALLOC(buf, vnumsiz + 1);
+  memcpy(buf, vnumbuf, vnumsiz);
+  bsiz = vnumsiz;
+  cbmapiterinit(map);
+  while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
+    CB_MAPITERVAL(vbuf, kbuf, vsiz);
+    CB_SETVNUMBUF(vnumsiz, vnumbuf, ksiz);
+    CB_REALLOC(buf, bsiz + vnumsiz + ksiz + 1);
+    memcpy(buf + bsiz, vnumbuf, vnumsiz);
+    bsiz += vnumsiz;
+    memcpy(buf + bsiz, kbuf, ksiz);
+    bsiz += ksiz;
+    CB_SETVNUMBUF(vnumsiz, vnumbuf, vsiz);
+    CB_REALLOC(buf, bsiz + vnumsiz + vsiz + 1);
+    memcpy(buf + bsiz, vnumbuf, vnumsiz);
+    bsiz += vnumsiz;
+    memcpy(buf + bsiz, vbuf, vsiz);
+    bsiz += vsiz;
+  }
+  *sp = bsiz;
+  return buf;
+}
+
+
+/* Redintegrate a serialized map. */
+CBMAP *cbmapload(const char *ptr, int size){
+  CBMAP *map;
+  const char *rp, *kbuf, *vbuf;
+  int i, step, rn, ksiz, vsiz;
+  assert(ptr && size >= 0);
+  map = cbmapopenex(CB_MAPPBNUM);
+  rp = ptr;
+  CB_READVNUMBUF(rp, size, rn, step);
+  rp += step;
+  size -= step;
+  if(rn > size) return map;
+  for(i = 0; i < rn; i++){
+    if(size < 1) break;
+    CB_READVNUMBUF(rp, size, ksiz, step);
+    rp += step;
+    size -= step;
+    if(ksiz > size) break;
+    kbuf = rp;
+    rp += ksiz;
+    if(size < 1) break;
+    CB_READVNUMBUF(rp, size, vsiz, step);
+    rp += step;
+    size -= step;
+    if(vsiz > size) break;
+    vbuf = rp;
+    rp += vsiz;
+    cbmapput(map, kbuf, ksiz, vbuf, vsiz, TRUE);
+  }
+  return map;
+}
+
+
+/* Redintegrate a serialized map and get one of the records. */
+char *cbmaploadone(const char *ptr, int size, const char *kbuf, int ksiz, int *sp){
+  const char *rp, *tkbuf, *vbuf;
+  char *rv;
+  int i, step, rn, tksiz, vsiz;
+  assert(ptr && size >= 0 && kbuf);
+  if(ksiz < 0) ksiz = strlen(kbuf);
+  rp = ptr;
+  CB_READVNUMBUF(rp, size, rn, step);
+  rp += step;
+  size -= step;
+  if(rn > size) return NULL;
+  for(i = 0; i < rn; i++){
+    if(size < 1) break;
+    CB_READVNUMBUF(rp, size, tksiz, step);
+    rp += step;
+    size -= step;
+    if(tksiz > size) break;
+    tkbuf = rp;
+    rp += tksiz;
+    if(size < 1) break;
+    CB_READVNUMBUF(rp, size, vsiz, step);
+    rp += step;
+    size -= step;
+    if(vsiz > size) break;
+    vbuf = rp;
+    rp += vsiz;
+    if(tksiz == ksiz && !memcmp(tkbuf, kbuf, ksiz)){
+      if(sp) *sp = vsiz;
+      CB_MEMDUP(rv, vbuf, vsiz);
+      return rv;
+    }
+  }
+  return NULL;
+}
+
+
+/* Get a heap handle. */
+CBHEAP *cbheapopen(int size, int max, int(*compar)(const void *, const void *)){
+  CBHEAP *heap;
+  assert(size > 0 && max >= 0 && compar);
+  CB_MALLOC(heap, sizeof(*heap));
+  CB_MALLOC(heap->base, size * max + 1);
+  CB_MALLOC(heap->swap, size);
+  heap->size = size;
+  heap->num = 0;
+  heap->max = max;
+  heap->compar = compar;
+  return heap;
+}
+
+
+/* Copy a heap. */
+CBHEAP *cbheapdup(CBHEAP *heap){
+  CBHEAP *newheap;
+  assert(heap);
+  CB_MALLOC(newheap, sizeof(*newheap));
+  CB_MEMDUP(newheap->base, heap->base, heap->size * heap->max);
+  CB_MALLOC(newheap->swap, heap->size);
+  newheap->size = heap->size;
+  newheap->num = heap->num;
+  newheap->max = heap->max;
+  newheap->compar = heap->compar;
+  return newheap;
+}
+
+
+/* Close a heap handle. */
+void cbheapclose(CBHEAP *heap){
+  assert(heap);
+  free(heap->swap);
+  free(heap->base);
+  free(heap);
+}
+
+
+/* Get the number of the records stored in a heap. */
+int cbheapnum(CBHEAP *heap){
+  assert(heap);
+  return heap->num;
+}
+
+
+/* Insert a record into a heap. */
+int cbheapinsert(CBHEAP *heap, const void *ptr){
+  char *base;
+  int size, pidx, cidx, bot;
+  assert(heap && ptr);
+  if(heap->max < 1) return FALSE;
+  base = heap->base;
+  size = heap->size;
+  if(heap->num >= heap->max){
+    if(heap->compar(ptr, base) > 0) return FALSE;
+    memcpy(base, ptr, size);
+    pidx = 0;
+    bot = heap->num / 2;
+    while(pidx < bot){
+      cidx = pidx * 2 + 1;
+      if(cidx < heap->num - 1 && heap->compar(base + cidx * size, base + (cidx + 1) * size) < 0)
+        cidx++;
+      if(heap->compar(base + pidx * size, base + cidx * size) > 0) break;
+      memcpy(heap->swap, base + pidx * size, size);
+      memcpy(base + pidx * size, base + cidx * size, size);
+      memcpy(base + cidx * size, heap->swap, size);
+      pidx = cidx;
+    }
+  } else {
+    memcpy(base + size * heap->num, ptr, size);
+    cidx = heap->num;
+    while(cidx > 0){
+      pidx = (cidx - 1) / 2;
+      if(heap->compar(base + cidx * size, base + pidx * size) <= 0) break;
+      memcpy(heap->swap, base + cidx * size, size);
+      memcpy(base + cidx * size, base + pidx * size, size);
+      memcpy(base + pidx * size, heap->swap, size);
+      cidx = pidx;
+    }
+    heap->num++;
+  }
+  return TRUE;
+}
+
+
+/* Get the pointer to the region of a record in a heap. */
+const void *cbheapval(CBHEAP *heap, int index){
+  assert(heap && index >= 0);
+  if(index >= heap->num) return NULL;
+  return heap->base + index * heap->size;
+}
+
+
+/* Convert a heap to an allocated region. */
+void *cbheaptomalloc(CBHEAP *heap, int *np){
+  char *ptr;
+  assert(heap);
+  qsort(heap->base, heap->num, heap->size, heap->compar);
+  ptr = heap->base;
+  if(np) *np = heap->num;
+  free(heap->swap);
+  free(heap);
+  return ptr;
+}
+
+
+/* Allocate a formatted string on memory. */
+char *cbsprintf(const char *format, ...){
+  va_list ap;
+  char *buf, cbuf[CB_SPBUFSIZ], *str;
+  int len, cblen, num, slen;
+  unsigned int unum;
+  double dnum;
+  va_start(ap, format);
+  assert(format);
+  CB_MALLOC(buf, 1);
+  len = 0;
+  while(*format != '\0'){
+    if(*format == '%'){
+      cbuf[0] = '%';
+      cblen = 1;
+      format++;
+      while(strchr("0123456789 .+-", *format) && *format != '\0' && cblen < CB_SPBUFSIZ - 1){
+        cbuf[cblen++] = *format;
+        format++;
+      }
+      cbuf[cblen] = '\0';
+      if(atoi(cbuf + 1) > CB_SPMAXWIDTH - 16){
+        sprintf(cbuf, "(err)");
+      } else {
+        cbuf[cblen++] = *format;
+        cbuf[cblen] = '\0';
+      }
+      switch(*format){
+      case 'd':
+        num = va_arg(ap, int);
+        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
+        len += sprintf(buf + len, cbuf, num);
+        break;
+      case 'o': case 'u': case 'x': case 'X': case 'c':
+        unum = va_arg(ap, unsigned int);
+        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
+        len += sprintf(buf + len, cbuf, unum);
+        break;
+      case 'e': case 'E': case 'f': case 'g': case 'G':
+        dnum = va_arg(ap, double);
+        CB_REALLOC(buf, len + CB_SPMAXWIDTH + 2);
+        len += sprintf(buf + len, cbuf, dnum);
+        break;
+      case 's':
+        str = va_arg(ap, char *);
+        slen = strlen(str);
+        CB_REALLOC(buf, len + slen + 2);
+        memcpy(buf + len, str, slen);
+        len += slen;
+        break;
+      case '%':
+        CB_REALLOC(buf, len + 2);
+        buf[len++] = '%';
+        break;
+      default:
+        break;
+      }
+    } else {
+      CB_REALLOC(buf, len + 2);
+      buf[len++] = *format;
+    }
+    format++;
+  }
+  buf[len] = '\0';
+  va_end(ap);
+  return buf;
+}
+
+
+/* Replace some patterns in a string. */
+char *cbreplace(const char *str, CBMAP *pairs){
+  int i, bsiz, wi, rep, ksiz, vsiz;
+  char *buf;
+  const char *key, *val;
+  assert(str && pairs);
+  bsiz = CB_DATUMUNIT;
+  CB_MALLOC(buf, bsiz);
+  wi = 0;
+  while(*str != '\0'){
+    rep = FALSE;
+    cbmapiterinit(pairs);
+    while((key = cbmapiternext(pairs, &ksiz)) != NULL){
+      for(i = 0; i < ksiz; i++){
+        if(str[i] == '\0' || str[i] != key[i]) break;
+      }
+      if(i == ksiz){
+        CB_MAPITERVAL(val, key, vsiz);
+        if(wi + vsiz >= bsiz){
+          bsiz = bsiz * 2 + vsiz;
+          CB_REALLOC(buf, bsiz);
+        }
+        memcpy(buf + wi, val, vsiz);
+        wi += vsiz;
+        str += ksiz;
+        rep = TRUE;
+        break;
+      }
+    }
+    if(!rep){
+      if(wi + 1 >= bsiz){
+        bsiz = bsiz * 2 + 1;
+        CB_REALLOC(buf, bsiz);
+      }
+      buf[wi++] = *str;
+      str++;
+    }
+  }
+  CB_REALLOC(buf, wi + 1);
+  buf[wi] = '\0';
+  return buf;
+}
+
+
+/* Make a list by split a serial datum. */
+CBLIST *cbsplit(const char *ptr, int size, const char *delim){
+  CBLIST *list;
+  int bi, step;
+  assert(ptr);
+  CB_LISTOPEN(list);
+  if(size < 0) size = strlen(ptr);
+  if(delim){
+    for(bi = 0; bi < size; bi += step){
+      step = 0;
+      while(bi + step < size && !strchr(delim, ptr[bi+step])){
+        step++;
+      }
+      cblistpush(list, ptr + bi, step);
+      step++;
+    }
+    if(size > 0 && strchr(delim, ptr[size-1])) cblistpush(list, "", 0);
+  } else {
+    for(bi = 0; bi < size; bi += step){
+      step = 0;
+      while(bi + step < size && ptr[bi+step]){
+        step++;
+      }
+      cblistpush(list, ptr + bi, step);
+      step++;
+    }
+    if(size > 0 && ptr[size-1] == 0) cblistpush(list, "", 0);
+  }
+  return list;
+}
+
+
+/* Read whole data of a file. */
+char *cbreadfile(const char *name, int *sp){
+  struct stat sbuf;
+  char iobuf[CB_IOBUFSIZ], *buf;
+  int fd, size, asiz, rv;
+  asiz = CB_IOBUFSIZ * 2;
+  if(name){
+    if((fd = open(name, O_RDONLY, 0)) == -1) return NULL;
+    if(fstat(fd, &sbuf) != -1) asiz = sbuf.st_size + 1;
+  } else {
+    fd = 0;
+  }
+  CB_MALLOC(buf, asiz + 1);
+  size = 0;
+  while((rv = read(fd, iobuf, CB_IOBUFSIZ)) > 0){
+    if(size + rv >= asiz){
+      asiz = asiz * 2 + size;
+      CB_REALLOC(buf, asiz + 1);
+    }
+    memcpy(buf + size, iobuf, rv);
+    size += rv;
+  }
+  buf[size] = '\0';
+  if(close(fd) == -1 || rv == -1){
+    free(buf);
+    return NULL;
+  }
+  if(sp) *sp = size;
+  return buf;
+}
+
+
+/* Write data of a region into a file. */
+int cbwritefile(const char *name, const char *ptr, int size){
+  int fd, err, wb;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  if(name){
+    if((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, CB_FILEMODE)) == -1) return FALSE;
+  } else {
+    fd = 1;
+  }
+  err = FALSE;
+  wb = 0;
+  do {
+    wb = write(fd, ptr, size);
+    switch(wb){
+    case -1: err = errno != EINTR ? TRUE : FALSE; break;
+    case 0: break;
+    default:
+      ptr += wb;
+      size -= wb;
+      break;
+    }
+  } while(size > 0);
+  if(close(fd) == -1) err = TRUE;
+  return err ? FALSE : TRUE;
+}
+
+
+/* Read every line of a file. */
+CBLIST *cbreadlines(const char *name){
+  char *buf, *tmp;
+  int vsiz;
+  CBMAP *pairs;
+  CBLIST *list;
+  if(!(buf = cbreadfile(name, NULL))) return NULL;
+  pairs = cbmapopenex(3);
+  cbmapput(pairs, "\r\n", 2, "\n", 1, TRUE);
+  cbmapput(pairs, "\r", 1, "\n", 1, TRUE);
+  tmp = cbreplace(buf, pairs);
+  list = cbsplit(tmp, strlen(tmp), "\n");
+  free(tmp);
+  cbmapclose(pairs);
+  free(buf);
+  if(CB_LISTNUM(list) > 0){
+    cblistval(list, CB_LISTNUM(list) - 1, &vsiz);
+    if(vsiz < 1) CB_LISTDROP(list);
+  }
+  return list;
+}
+
+
+/* Read names of files in a directory. */
+CBLIST *cbdirlist(const char *name){
+  DIR *DD;
+  struct dirent *dp;
+  CBLIST *list;
+  assert(name);
+  if(!(DD = opendir(name))) return NULL;
+  CB_LISTOPEN(list);
+  while((dp = readdir(DD)) != NULL){
+    CB_LISTPUSH(list, dp->d_name, strlen(dp->d_name));
+  }
+  if(closedir(DD) == -1){
+    CB_LISTCLOSE(list);
+    return NULL;
+  }
+  return list;
+}
+
+
+/* Get the status of a file or a directory. */
+int cbfilestat(const char *name, int *isdirp, int *sizep, time_t *mtimep){
+  struct stat sbuf;
+  assert(name);
+  if(lstat(name, &sbuf) == -1) return FALSE;
+  if(isdirp) *isdirp = S_ISDIR(sbuf.st_mode);
+  if(sizep) *sizep = (int)sbuf.st_size;
+  if(mtimep) *mtimep = sbuf.st_mtime;
+  return TRUE;
+}
+
+
+/* Remove a file or a directory and its sub ones recursively. */
+int cbremove(const char *name){
+  CBLIST *list;
+  const char *elem;
+  char *path;
+  int i, err, tail;
+  struct stat sbuf;
+  assert(name);
+  if(lstat(name, &sbuf) == -1) return FALSE;
+  if(unlink(name) == 0) return TRUE;
+  if(!S_ISDIR(sbuf.st_mode) || !(list = cbdirlist(name))) return FALSE;
+  err = FALSE;
+  tail = name[0] != '\0' && name[strlen(name)-1] == MYPATHCHR;
+  for(i = 0; i < CB_LISTNUM(list); i++){
+    elem = CB_LISTVAL(list, i);
+    if(!strcmp(MYCDIRSTR, elem) || !strcmp(MYPDIRSTR, elem)) continue;
+    if(tail){
+      path = cbsprintf("%s%s", name, elem);
+    } else {
+      path = cbsprintf("%s%c%s", name, MYPATHCHR, elem);
+    }
+    if(!cbremove(path)) err = TRUE;
+    free(path);
+  }
+  CB_LISTCLOSE(list);
+  return rmdir(name) == 0 ? TRUE : FALSE;
+}
+
+
+/* Break up a URL into elements. */
+CBMAP *cburlbreak(const char *str){
+  CBMAP *map;
+  char *tmp, *ep;
+  const char *rp;
+  int serv;
+  assert(str);
+  map = cbmapopenex(CB_MAPPBNUM);
+  CB_MEMDUP(tmp, str, strlen(str));
+  rp = cbstrtrim(tmp);
+  cbmapput(map, "self", -1, rp, -1, TRUE);
+  serv = FALSE;
+  if(cbstrfwimatch(rp, "http://")){
+    cbmapput(map, "scheme", -1, "http", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "https://")){
+    cbmapput(map, "scheme", -1, "https", -1, TRUE);
+    rp += 8;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "ftp://")){
+    cbmapput(map, "scheme", -1, "ftp", -1, TRUE);
+    rp += 6;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "sftp://")){
+    cbmapput(map, "scheme", -1, "sftp", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "ftps://")){
+    cbmapput(map, "scheme", -1, "ftps", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "tftp://")){
+    cbmapput(map, "scheme", -1, "tftp", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "ldap://")){
+    cbmapput(map, "scheme", -1, "ldap", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "ldaps://")){
+    cbmapput(map, "scheme", -1, "ldaps", -1, TRUE);
+    rp += 8;
+    serv = TRUE;
+  } else if(cbstrfwimatch(rp, "file://")){
+    cbmapput(map, "scheme", -1, "file", -1, TRUE);
+    rp += 7;
+    serv = TRUE;
+  }
+  if((ep = strchr(rp, '#')) != NULL){
+    cbmapput(map, "fragment", -1, ep + 1, -1, TRUE);
+    *ep = '\0';
+  }
+  if((ep = strchr(rp, '?')) != NULL){
+    cbmapput(map, "query", -1, ep + 1, -1, TRUE);
+    *ep = '\0';
+  }
+  if(serv){
+    if((ep = strchr(rp, '/')) != NULL){
+      cbmapput(map, "path", -1, ep, -1, TRUE);
+      *ep = '\0';
+    } else {
+      cbmapput(map, "path", -1, "/", -1, TRUE);
+    }
+    if((ep = strchr(rp, '@')) != NULL){
+      *ep = '\0';
+      if(rp[0] != '\0') cbmapput(map, "authority", -1, rp, -1, TRUE);
+      rp = ep + 1;
+    }
+    if((ep = strchr(rp, ':')) != NULL){
+      if(ep[1] != '\0') cbmapput(map, "port", -1, ep + 1, -1, TRUE);
+      *ep = '\0';
+    }
+    if(rp[0] != '\0') cbmapput(map, "host", -1, rp, -1, TRUE);
+  } else {
+    cbmapput(map, "path", -1, rp, -1, TRUE);
+  }
+  free(tmp);
+  if((rp = cbmapget(map, "path", -1, NULL)) != NULL){
+    if((ep = strrchr(rp, '/')) != NULL){
+      if(ep[1] != '\0') cbmapput(map, "file", -1, ep + 1, -1, TRUE);
+    } else {
+      cbmapput(map, "file", -1, rp, -1, TRUE);
+    }
+  }
+  if((rp = cbmapget(map, "file", -1, NULL)) != NULL && (!strcmp(rp, ".") || !strcmp(rp, "..")))
+    cbmapout(map, "file", -1);
+  return map;
+}
+
+
+/* Resolve a relative URL with another absolute URL. */
+char *cburlresolve(const char *base, const char *target){
+  CBMAP *telems, *belems;
+  CBLIST *bpaths, *opaths, *qelems;
+  CBDATUM *rbuf;
+  const char *vbuf, *path;
+  char *tmp, *wp, *enc, numbuf[CB_NUMBUFSIZ];
+  int i, vsiz, port, num;
+  assert(base && target);
+  while(*base > '\0' && *base <= ' '){
+    base++;
+  }
+  while(*target > '\0' && *target <= ' '){
+    target++;
+  }
+  if(*target == '\0') target = base;
+  CB_DATUMOPEN(rbuf);
+  telems = cburlbreak(target);
+  port = 80;
+  belems = cburlbreak(cbmapget(telems, "scheme", -1, &vsiz) ? target : base);
+  if((vbuf = cbmapget(belems, "scheme", -1, &vsiz)) != NULL){
+    CB_DATUMCAT(rbuf, vbuf, vsiz);
+    CB_DATUMCAT(rbuf, "://", 3);
+    if(!cbstricmp(vbuf, "https")){
+      port = 443;
+    } else if(!cbstricmp(vbuf, "ftp")){
+      port = 21;
+    } else if(!cbstricmp(vbuf, "sftp")){
+      port = 115;
+    } else if(!cbstricmp(vbuf, "ftps")){
+      port = 22;
+    } else if(!cbstricmp(vbuf, "tftp")){
+      port = 69;
+    } else if(!cbstricmp(vbuf, "ldap")){
+      port = 389;
+    } else if(!cbstricmp(vbuf, "ldaps")){
+      port = 636;
+    }
+  } else {
+    CB_DATUMCAT(rbuf, "http://", 7);
+  }
+  if((vbuf = cbmapget(belems, "authority", -1, &vsiz)) != NULL){
+    if((wp = strchr(vbuf, ':')) != NULL){
+      *wp = '\0';
+      tmp = cburldecode(vbuf, NULL);
+      enc = cburlencode(tmp, -1);
+      CB_DATUMCAT(rbuf, enc, strlen(enc));
+      free(enc);
+      free(tmp);
+      CB_DATUMCAT(rbuf, ":", 1);
+      wp++;
+      tmp = cburldecode(wp, NULL);
+      enc = cburlencode(tmp, -1);
+      CB_DATUMCAT(rbuf, enc, strlen(enc));
+      free(enc);
+      free(tmp);
+    } else {
+      tmp = cburldecode(vbuf, NULL);
+      enc = cburlencode(tmp, -1);
+      CB_DATUMCAT(rbuf, enc, strlen(enc));
+      free(enc);
+      free(tmp);
+    }
+    CB_DATUMCAT(rbuf, "@", 1);
+  }
+  if((vbuf = cbmapget(belems, "host", -1, &vsiz)) != NULL){
+    tmp = cburldecode(vbuf, NULL);
+    cbstrtolower(tmp);
+    enc = cburlencode(tmp, -1);
+    CB_DATUMCAT(rbuf, enc, strlen(enc));
+    free(enc);
+    free(tmp);
+  } else {
+    CB_DATUMCAT(rbuf, "localhost", 9);
+  }
+  if((vbuf = cbmapget(belems, "port", -1, &vsiz)) != NULL &&
+     (num = atoi(vbuf)) != port && num > 1){
+    sprintf(numbuf, ":%d", num);
+    CB_DATUMCAT(rbuf, numbuf, strlen(numbuf));
+  }
+  if(!(path = cbmapget(telems, "path", -1, NULL))) path = "/";
+  if(path[0] == '\0' && (vbuf = cbmapget(belems, "path", -1, NULL)) != NULL) path = vbuf;
+  if(path[0] == '\0') path = "/";
+  CB_LISTOPEN(bpaths);
+  if(path[0] != '/' && (vbuf = cbmapget(belems, "path", -1, &vsiz)) != NULL){
+    opaths = cbsplit(vbuf, vsiz, "/");
+  } else {
+    opaths = cbsplit("/", 1, "/");
+  }
+  CB_LISTDROP(opaths);
+  for(i = 0; i < CB_LISTNUM(opaths); i++){
+    vbuf = CB_LISTVAL2(opaths, i, vsiz);
+    if(vsiz < 1 || !strcmp(vbuf, ".")) continue;
+    if(!strcmp(vbuf, "..")){
+      CB_LISTDROP(bpaths);
+    } else {
+      CB_LISTPUSH(bpaths, vbuf, vsiz);
+    }
+  }
+  CB_LISTCLOSE(opaths);
+  opaths = cbsplit(path, -1, "/");
+  for(i = 0; i < CB_LISTNUM(opaths); i++){
+    vbuf = CB_LISTVAL2(opaths, i, vsiz);
+    if(vsiz < 1 || !strcmp(vbuf, ".")) continue;
+    if(!strcmp(vbuf, "..")){
+      CB_LISTDROP(bpaths);
+    } else {
+      CB_LISTPUSH(bpaths, vbuf, vsiz);
+    }
+  }
+  CB_LISTCLOSE(opaths);
+  for(i = 0; i < CB_LISTNUM(bpaths); i++){
+    vbuf = CB_LISTVAL(bpaths, i);
+    if(strchr(vbuf, '%')){
+      tmp = cburldecode(vbuf, NULL);
+    } else {
+      CB_MEMDUP(tmp, vbuf, strlen(vbuf));
+    }
+    enc = cburlencode(tmp, -1);
+    CB_DATUMCAT(rbuf, "/", 1);
+    CB_DATUMCAT(rbuf, enc, strlen(enc));
+    free(enc);
+    free(tmp);
+  }
+  if(cbstrbwmatch(path, "/")) CB_DATUMCAT(rbuf, "/", 1);
+  CB_LISTCLOSE(bpaths);
+  if((vbuf = cbmapget(telems, "query", -1, &vsiz)) != NULL){
+    CB_DATUMCAT(rbuf, "?", 1);
+    qelems = cbsplit(vbuf, vsiz, "&;");
+    for(i = 0; i < CB_LISTNUM(qelems); i++){
+      vbuf = CB_LISTVAL(qelems, i);
+      if(i > 0) CB_DATUMCAT(rbuf, "&", 1);
+      if((wp = strchr(vbuf, '=')) != NULL){
+        *wp = '\0';
+        tmp = cburldecode(vbuf, NULL);
+        enc = cburlencode(tmp, -1);
+        CB_DATUMCAT(rbuf, enc, strlen(enc));
+        free(enc);
+        free(tmp);
+        CB_DATUMCAT(rbuf, "=", 1);
+        wp++;
+        tmp = cburldecode(wp, NULL);
+        enc = cburlencode(tmp, -1);
+        CB_DATUMCAT(rbuf, enc, strlen(enc));
+        free(enc);
+        free(tmp);
+      } else {
+        tmp = cburldecode(vbuf, NULL);
+        enc = cburlencode(tmp, -1);
+        CB_DATUMCAT(rbuf, enc, strlen(enc));
+        free(enc);
+        free(tmp);
+      }
+    }
+    CB_LISTCLOSE(qelems);
+  }
+  if((vbuf = cbmapget(telems, "fragment", -1, &vsiz)) != NULL){
+    tmp = cburldecode(vbuf, NULL);
+    enc = cburlencode(tmp, -1);
+    CB_DATUMCAT(rbuf, "#", 1);
+    CB_DATUMCAT(rbuf, enc, strlen(enc));
+    free(enc);
+    free(tmp);
+  }
+  cbmapclose(belems);
+  cbmapclose(telems);
+  return cbdatumtomalloc(rbuf, NULL);
+}
+
+
+/* Encode a serial object with URL encoding. */
+char *cburlencode(const char *ptr, int size){
+  char *buf, *wp;
+  int i, c;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  CB_MALLOC(buf, size * 3 + 1);
+  wp = buf;
+  for(i = 0; i < size; i++){
+    c = ((unsigned char *)ptr)[i];
+    if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
+       (c >= '0' && c <= '9') || (c != '\0' && strchr("_-.!~*'()", c))){
+      *(wp++) = c;
+    } else {
+      wp += sprintf(wp, "%%%02X", c);
+    }
+  }
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Decode a string encoded with URL encoding. */
+char *cburldecode(const char *str, int *sp){
+  char *buf, *wp;
+  unsigned char c;
+  CB_MEMDUP(buf, str, strlen(str));
+  wp = buf;
+  while(*str != '\0'){
+    if(*str == '%'){
+      str++;
+      if(((str[0] >= '0' && str[0] <= '9') || (str[0] >= 'A' && str[0] <= 'F') ||
+          (str[0] >= 'a' && str[0] <= 'f')) &&
+         ((str[1] >= '0' && str[1] <= '9') || (str[1] >= 'A' && str[1] <= 'F') ||
+          (str[1] >= 'a' && str[1] <= 'f'))){
+        c = *str;
+        if(c >= 'A' && c <= 'Z') c += 'a' - 'A';
+        if(c >= 'a' && c <= 'z'){
+          *wp = c - 'a' + 10;
+        } else {
+          *wp = c - '0';
+        }
+        *wp *= 0x10;
+        str++;
+        c = *str;
+        if(c >= 'A' && c <= 'Z') c += 'a' - 'A';
+        if(c >= 'a' && c <= 'z'){
+          *wp += c - 'a' + 10;
+        } else {
+          *wp += c - '0';
+        }
+        str++;
+        wp++;
+      } else {
+        break;
+      }
+    } else if(*str == '+'){
+      *wp = ' ';
+      str++;
+      wp++;
+    } else {
+      *wp = *str;
+      str++;
+      wp++;
+    }
+  }
+  *wp = '\0';
+  if(sp) *sp = wp - buf;
+  return buf;
+}
+
+
+/* Encode a serial object with Base64 encoding. */
+char *cbbaseencode(const char *ptr, int size){
+  char *tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  char *buf, *wp;
+  const unsigned char *obj;
+  int i;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  CB_MALLOC(buf, 4 * (size + 2) / 3 + 1);
+  obj = (const unsigned char *)ptr;
+  wp = buf;
+  for(i = 0; i < size; i += 3){
+    switch(size - i){
+    case 1:
+      *wp++ = tbl[obj[0] >> 2];
+      *wp++ = tbl[(obj[0] & 3) << 4];
+      *wp++ = '=';
+      *wp++ = '=';
+      break;
+    case 2:
+      *wp++ = tbl[obj[0] >> 2];
+      *wp++ = tbl[((obj[0] & 3) << 4) + (obj[1] >> 4)];
+      *wp++ = tbl[(obj[1] & 0xf) << 2];
+      *wp++ = '=';
+      break;
+    default:
+      *wp++ = tbl[obj[0] >> 2];
+      *wp++ = tbl[((obj[0] & 3) << 4) + (obj[1] >> 4)];
+      *wp++ = tbl[((obj[1] & 0xf) << 2) + (obj[2] >> 6)];
+      *wp++ = tbl[obj[2] & 0x3f];
+      break;
+    }
+    obj += 3;
+  }
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Decode a string encoded with Base64 encoding. */
+char *cbbasedecode(const char *str, int *sp){
+  unsigned char *obj, *wp;
+  int len, cnt, bpos, i, bits, eqcnt;
+  assert(str);
+  cnt = 0;
+  bpos = 0;
+  eqcnt = 0;
+  len = strlen(str);
+  CB_MALLOC(obj, len + 4);
+  wp = obj;
+  while(bpos < len && eqcnt == 0){
+    bits = 0;
+    for(i = 0; bpos < len && i < 4; bpos++){
+      if(str[bpos] >= 'A' && str[bpos] <= 'Z'){
+        bits = (bits << 6) | (str[bpos] - 'A');
+        i++;
+      } else if(str[bpos] >= 'a' && str[bpos] <= 'z'){
+        bits = (bits << 6) | (str[bpos] - 'a' + 26);
+        i++;
+      } else if(str[bpos] >= '0' && str[bpos] <= '9'){
+        bits = (bits << 6) | (str[bpos] - '0' + 52);
+        i++;
+      } else if(str[bpos] == '+'){
+        bits = (bits << 6) | 62;
+        i++;
+      } else if(str[bpos] == '/'){
+        bits = (bits << 6) | 63;
+        i++;
+      } else if(str[bpos] == '='){
+        bits <<= 6;
+        i++;
+        eqcnt++;
+      }
+    }
+    if(i == 0 && bpos >= len) continue;
+    switch(eqcnt){
+    case 0:
+      *wp++ = (bits >> 16) & 0xff;
+      *wp++ = (bits >> 8) & 0xff;
+      *wp++ = bits & 0xff;
+      cnt += 3;
+      break;
+    case 1:
+      *wp++ = (bits >> 16) & 0xff;
+      *wp++ = (bits >> 8) & 0xff;
+      cnt += 2;
+      break;
+    case 2:
+      *wp++ = (bits >> 16) & 0xff;
+      cnt += 1;
+      break;
+    }
+  }
+  obj[cnt] = '\0';
+  if(sp) *sp = cnt;
+  return (char *)obj;
+}
+
+
+/* Encode a serial object with quoted-printable encoding. */
+char *cbquoteencode(const char *ptr, int size){
+  const unsigned char *rp;
+  char *buf, *wp;
+  int i, cols;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  rp = (const unsigned char *)ptr;
+  CB_MALLOC(buf, size * 3 + 1);
+  wp = buf;
+  cols = 0;
+  for(i = 0; i < size; i++){
+    if(rp[i] == '=' || (rp[i] < 0x20 && rp[i] != '\r' && rp[i] != '\n' && rp[i] != '\t') ||
+       rp[i] > 0x7e){
+      wp += sprintf(wp, "=%02X", rp[i]);
+      cols += 3;
+    } else {
+      *(wp++) = rp[i];
+      cols++;
+    }
+  }
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Decode a string encoded with quoted-printable encoding. */
+char *cbquotedecode(const char *str, int *sp){
+  char *buf, *wp;
+  assert(str);
+  CB_MALLOC(buf, strlen(str) + 1);
+  wp = buf;
+  for(; *str != '\0'; str++){
+    if(*str == '='){
+      str++;
+      if(*str == '\0'){
+        break;
+      } else if(str[0] == '\r' && str[1] == '\n'){
+        str++;
+      } else if(str[0] != '\n' && str[0] != '\r'){
+        if(*str >= 'A' && *str <= 'Z'){
+          *wp = (*str - 'A' + 10) * 16;
+        } else if(*str >= 'a' && *str <= 'z'){
+          *wp = (*str - 'a' + 10) * 16;
+        } else {
+          *wp = (*str - '0') * 16;
+        }
+        str++;
+        if(*str == '\0') break;
+        if(*str >= 'A' && *str <= 'Z'){
+          *wp += *str - 'A' + 10;
+        } else if(*str >= 'a' && *str <= 'z'){
+          *wp += *str - 'a' + 10;
+        } else {
+          *wp += *str - '0';
+        }
+        wp++;
+      }
+    } else {
+      *wp = *str;
+      wp++;
+    }
+  }
+  *wp = '\0';
+  if(sp) *sp = wp - buf;
+  return buf;
+}
+
+
+/* Split a string of MIME into headers and the body. */
+char *cbmimebreak(const char *ptr, int size, CBMAP *attrs, int *sp){
+  CBLIST *list;
+  const char *head, *line, *pv, *ep;
+  char *hbuf, *name, *rv;
+  int i, j, wi, hlen;
+  assert(ptr);
+  if(size < 0) size = strlen(ptr);
+  head = NULL;
+  hlen = 0;
+  for(i = 0; i < size; i++){
+    if(i < size - 4 && ptr[i] == '\r' && ptr[i+1] == '\n' &&
+       ptr[i+2] == '\r' && ptr[i+3] == '\n'){
+      head = ptr;
+      hlen = i;
+      ptr += i + 4;
+      size -= i + 4;
+      break;
+    } else if(i < size - 2 && ptr[i] == '\n' && ptr[i+1] == '\n'){
+      head = ptr;
+      hlen = i;
+      ptr += i + 2;
+      size -= i + 2;
+      break;
+    }
+  }
+  if(head && attrs){
+    CB_MALLOC(hbuf, hlen + 1);
+    wi = 0;
+    for(i = 0; i < hlen; i++){
+      if(head[i] == '\r') continue;
+      if(i < hlen - 1 && head[i] == '\n' && (head[i+1] == ' ' || head[i+1] == '\t')){
+        hbuf[wi++] = ' ';
+        i++;
+      } else {
+        hbuf[wi++] = head[i];
+      }
+    }
+    list = cbsplit(hbuf, wi, "\n");
+    for(i = 0; i < CB_LISTNUM(list); i++){
+      line = CB_LISTVAL(list, i);
+      if((pv = strchr(line, ':')) != NULL){
+        CB_MEMDUP(name, line, pv - line);
+        for(j = 0; name[j] != '\0'; j++){
+          if(name[j] >= 'A' && name[j] <= 'Z') name[j] -= 'A' - 'a';
+        }
+        pv++;
+        while(*pv == ' ' || *pv == '\t'){
+          pv++;
+        }
+        cbmapput(attrs, name, -1, pv, -1, TRUE);
+        free(name);
+      }
+
+    }
+    CB_LISTCLOSE(list);
+    free(hbuf);
+    if((pv = cbmapget(attrs, "content-type", -1, NULL)) != NULL){
+      if((ep = strchr(pv, ';')) != NULL){
+        cbmapput(attrs, "TYPE", -1, pv, ep - pv, TRUE);
+        do {
+          ep++;
+          while(ep[0] == ' '){
+            ep++;
+          }
+          if(cbstrfwimatch(ep, "charset=")){
+            ep += 8;
+            while(*ep > '\0' && *ep <= ' '){
+              ep++;
+            }
+            if(ep[0] == '"') ep++;
+            pv = ep;
+            while(ep[0] != '\0' && ep[0] != ' ' && ep[0] != '"' && ep[0] != ';'){
+              ep++;
+            }
+            cbmapput(attrs, "CHARSET", -1, pv, ep - pv, TRUE);
+          } else if(cbstrfwimatch(ep, "boundary=")){
+            ep += 9;
+            while(*ep > '\0' && *ep <= ' '){
+              ep++;
+            }
+            if(ep[0] == '"'){
+              ep++;
+              pv = ep;
+              while(ep[0] != '\0' && ep[0] != '"'){
+                ep++;
+              }
+            } else {
+              pv = ep;
+              while(ep[0] != '\0' && ep[0] != ' ' && ep[0] != '"' && ep[0] != ';'){
+                ep++;
+              }
+            }
+            cbmapput(attrs, "BOUNDARY", -1, pv, ep - pv, TRUE);
+          }
+        } while((ep = strchr(ep, ';')) != NULL);
+      } else {
+        cbmapput(attrs, "TYPE", -1, pv, -1, TRUE);
+      }
+    }
+    if((pv = cbmapget(attrs, "content-disposition", -1, NULL)) != NULL){
+      if((ep = strchr(pv, ';')) != NULL){
+        cbmapput(attrs, "DISPOSITION", -1, pv, ep - pv, TRUE);
+        do {
+          ep++;
+          while(ep[0] == ' '){
+            ep++;
+          }
+          if(cbstrfwimatch(ep, "filename=")){
+            ep += 9;
+            if(ep[0] == '"') ep++;
+            pv = ep;
+            while(ep[0] != '\0' && ep[0] != '"'){
+              ep++;
+            }
+            cbmapput(attrs, "FILENAME", -1, pv, ep - pv, TRUE);
+          } else if(cbstrfwimatch(ep, "name=")){
+            ep += 5;
+            if(ep[0] == '"') ep++;
+            pv = ep;
+            while(ep[0] != '\0' && ep[0] != '"'){
+              ep++;
+            }
+            cbmapput(attrs, "NAME", -1, pv, ep - pv, TRUE);
+          }
+        } while((ep = strchr(ep, ';')) != NULL);
+      } else {
+        cbmapput(attrs, "DISPOSITION", -1, pv, -1, TRUE);
+      }
+    }
+  }
+  if(sp) *sp = size;
+  CB_MEMDUP(rv, ptr, size);
+  return rv;
+}
+
+
+/* Split multipart data in MIME into its parts. */
+CBLIST *cbmimeparts(const char *ptr, int size, const char *boundary){
+  CBLIST *list;
+  const char *pv, *ep;
+  int i, blen;
+  assert(ptr && boundary);
+  if(size < 0) size = strlen(ptr);
+  CB_LISTOPEN(list);
+  if((blen = strlen(boundary)) < 1) return list;
+  pv = NULL;
+  for(i = 0; i < size; i++){
+    if(ptr[i] == '-' && ptr[i+1] == '-' && i + 2 + blen < size &&
+       cbstrfwmatch(ptr + i + 2, boundary) && strchr("\t\n\v\f\r ", ptr[i+2+blen])){
+      pv = ptr + i + 2 + blen;
+      if(*pv == '\r') pv++;
+      if(*pv == '\n') pv++;
+      size -= pv - ptr;
+      ptr = pv;
+      break;
+    }
+  }
+  if(!pv) return list;
+  for(i = 0; i < size; i++){
+    if(ptr[i] == '-' && ptr[i+1] == '-' && i + 2 + blen < size &&
+       cbstrfwmatch(ptr + i + 2, boundary) && strchr("\t\n\v\f\r -", ptr[i+2+blen])){
+      ep = ptr + i;
+      if(ep > ptr && ep[-1] == '\n') ep--;
+      if(ep > ptr && ep[-1] == '\r') ep--;
+      if(ep > pv) CB_LISTPUSH(list, pv, ep - pv);
+      pv = ptr + i + 2 + blen;
+      if(*pv == '\r') pv++;
+      if(*pv == '\n') pv++;
+    }
+  }
+  return list;
+}
+
+
+/* Encode a string with MIME encoding. */
+char *cbmimeencode(const char *str, const char *encname, int base){
+  char *buf, *wp, *enc;
+  int len;
+  assert(str && encname);
+  len = strlen(str);
+  CB_MALLOC(buf, len * 3 + strlen(encname) + 16);
+  wp = buf;
+  wp += sprintf(wp, "=?%s?%c?", encname, base ? 'B' : 'Q');
+  enc = base ? cbbaseencode(str, len) : cbquoteencode(str, len);
+  wp += sprintf(wp, "%s?=", enc);
+  free(enc);
+  return buf;
+}
+
+
+/* Decode a string encoded with MIME encoding. */
+char *cbmimedecode(const char *str, char *enp){
+  char *buf, *wp, *tmp, *dec;
+  const char *pv, *ep;
+  int quoted;
+  assert(str);
+  if(enp) sprintf(enp, "US-ASCII");
+  CB_MALLOC(buf, strlen(str) + 1);
+  wp = buf;
+  while(*str != '\0'){
+    if(cbstrfwmatch(str, "=?")){
+      str += 2;
+      pv = str;
+      if(!(ep = strchr(str, '?'))) continue;
+      if(enp && ep - pv < CB_ENCBUFSIZ){
+        memcpy(enp, pv, ep - pv);
+        enp[ep-pv] = '\0';
+      }
+      pv = ep + 1;
+      quoted = (*pv == 'Q' || *pv == 'q');
+      if(*pv != '\0') pv++;
+      if(*pv != '\0') pv++;
+      if(!(ep = strchr(pv, '?'))) continue;
+      CB_MEMDUP(tmp, pv, ep - pv);
+      dec = quoted ? cbquotedecode(tmp, NULL) : cbbasedecode(tmp, NULL);
+      wp += sprintf(wp, "%s", dec);
+      free(dec);
+      free(tmp);
+      str = ep + 1;
+      if(*str != '\0') str++;
+    } else {
+      *(wp++) = *str;
+      str++;
+    }
+  }
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Split a string of CSV into rows. */
+CBLIST *cbcsvrows(const char *str){
+  CBLIST *list;
+  const char *pv;
+  int quoted;
+  assert(str);
+  CB_LISTOPEN(list);
+  pv = str;
+  quoted = FALSE;
+  while(TRUE){
+    if(*str == '"') quoted = !quoted;
+    if(!quoted && (*str == '\r' || *str == '\n')){
+      CB_LISTPUSH(list, pv, str - pv);
+      if(str[0] == '\r' && str[1] == '\n') str++;
+      str++;
+      pv = str;
+    } else if(*str == '\0'){
+      if(str > pv) CB_LISTPUSH(list, pv, str - pv);
+      break;
+    } else {
+      str++;
+    }
+  }
+  return list;
+}
+
+
+/* Split a string of a row of CSV into cells. */
+CBLIST *cbcsvcells(const char *str){
+  CBLIST *list, *uelist;
+  const char *pv;
+  char *tmp;
+  int i, quoted;
+  assert(str);
+  CB_LISTOPEN(list);
+  pv = str;
+  quoted = FALSE;
+  while(TRUE){
+    if(*str == '"') quoted = !quoted;
+    if(!quoted && *str == ','){
+      CB_LISTPUSH(list, pv, str - pv);
+      str++;
+      pv = str;
+    } else if(*str == '\0'){
+      CB_LISTPUSH(list, pv, str - pv);
+      break;
+    } else {
+      str++;
+    }
+  }
+  CB_LISTOPEN(uelist);
+  for(i = 0; i < CB_LISTNUM(list); i++){
+    tmp = cbcsvunescape(CB_LISTVAL(list, i));
+    CB_LISTPUSH(uelist, tmp, strlen(tmp));
+    free(tmp);
+  }
+  CB_LISTCLOSE(list);
+  return uelist;
+}
+
+
+/* Escape a string with the meta characters of CSV. */
+char *cbcsvescape(const char *str){
+  char *buf, *wp;
+  int i;
+  assert(str);
+  CB_MALLOC(buf, strlen(str) * 2 + 3);
+  wp = buf;
+  *(wp++) = '"';
+  for(i = 0; str[i] != '\0'; i++){
+    if(str[i] == '"') *(wp++) = '"';
+    *(wp++) = str[i];
+  }
+  *(wp++) = '"';
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Unescape a string with the escaped meta characters of CSV. */
+char *cbcsvunescape(const char *str){
+  char *buf, *wp;
+  int i, len;
+  assert(str);
+  len = strlen(str);
+  if(str[0] == '"'){
+    str++;
+    len--;
+    if(str[len-1] == '"') len--;
+  }
+  CB_MALLOC(buf, len + 1);
+  wp = buf;
+  for(i = 0; i < len; i++){
+    if(str[i] == '"'){
+      if(str[i+1] == '"') *(wp++) = str[i++];
+    } else {
+      *(wp++) = str[i];
+    }
+  }
+  *wp = '\0';
+  return buf;
+}
+
+
+/* Split a string of XML into tags and text sections. */
+CBLIST *cbxmlbreak(const char *str, int cr){
+  CBLIST *list;
+  CBDATUM *datum;
+  int i, pv, tag;
+  char *ep;
+  assert(str);
+  CB_LISTOPEN(list);
+  i = 0;
+  pv = 0;
+  tag = FALSE;
+  while(TRUE){
+    if(str[i] == '\0'){
+      if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
+      break;
+    } else if(!tag && str[i] == '<'){
+      if(str[i+1] == '!' && str[i+2] == '-' && str[i+3] == '-'){
+        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
+        if((ep = strstr(str + i, "-->")) != NULL){
+          if(!cr) CB_LISTPUSH(list, str + i, ep - str - i + 3);
+          i = ep - str + 2;
+          pv = i + 1;
+        }
+      } else if(str[i+1] == '!' && str[i+2] == '[' && cbstrfwimatch(str + i, "<![CDATA[")){
+        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
+        if((ep = strstr(str + i, "]]>")) != NULL){
+          i += 9;
+          CB_DATUMOPEN(datum);
+          while(str + i < ep){
+            if(str[i] == '&'){
+              CB_DATUMCAT(datum, "&", 5);
+            } else if(str[i] == '<'){
+              CB_DATUMCAT(datum, "<", 4);
+            } else if(str[i] == '>'){
+              CB_DATUMCAT(datum, ">", 4);
+            } else {
+              CB_DATUMCAT(datum, str + i, 1);
+            }
+            i++;
+          }
+          if(CB_DATUMSIZE(datum) > 0) CB_LISTPUSH(list, CB_DATUMPTR(datum), CB_DATUMSIZE(datum));
+          CB_DATUMCLOSE(datum);
+          i = ep - str + 2;
+          pv = i + 1;
+        }
+      } else {
+        if(i > pv) CB_LISTPUSH(list, str + pv, i - pv);
+        tag = TRUE;
+        pv = i;
+      }
+    } else if(tag && str[i] == '>'){
+      if(i > pv) CB_LISTPUSH(list, str + pv, i - pv + 1);
+      tag = FALSE;
+      pv = i + 1;
+    }
+    i++;
+  }
+  return list;
+}
+
+
+/* Get the map of attributes of a XML tag. */
+CBMAP *cbxmlattrs(const char *str){
+  CBMAP *map;
+  const unsigned char *rp, *key, *val;
+  char *copy, *raw;
+  int ksiz, vsiz;
+  assert(str);
+  map = cbmapopenex(CB_MAPPBNUM);
+  rp = (unsigned char *)str;
+  while(*rp == '<' || *rp == '/' || *rp == '?' || *rp == '!' || *rp == ' '){
+    rp++;
+  }
+  key = rp;
+  while(*rp > 0x20 && *rp != '/' && *rp != '>'){
+    rp++;
+  }
+  cbmapput(map, "", -1, (char *)key, rp - key, FALSE);
+  while(*rp != '\0'){
+    while(*rp != '\0' && (*rp <= 0x20 || *rp == '/' || *rp == '?' || *rp == '>')){
+      rp++;
+    }
+    key = rp;
+    while(*rp > 0x20 && *rp != '/' && *rp != '>' && *rp != '='){
+      rp++;
+    }
+    ksiz = rp - key;
+    while(*rp != '\0' && (*rp == '=' || *rp <= 0x20)){
+      rp++;
+    }
+    if(*rp == '"'){
+      rp++;
+      val = rp;
+      while(*rp != '\0' && *rp != '"'){
+        rp++;
+      }
+      vsiz = rp - val;
+    } else if(*rp == '\''){
+      rp++;
+      val = rp;
+      while(*rp != '\0' && *rp != '\''){
+        rp++;
+      }
+      vsiz = rp - val;
+    } else {
+      val = rp;
+      while(*rp > 0x20 && *rp != '"' && *rp != '\'' && *rp != '>'){
+        rp++;
+      }
+      vsiz = rp - val;
+    }
+    if(*rp != '\0') rp++;
+    if(ksiz > 0){
+      CB_MEMDUP(copy, (char *)val, vsiz);
+      raw = cbxmlunescape(copy);
+      cbmapput(map, (char *)key, ksiz, raw, -1, FALSE);
+      free(raw);
+      free(copy);
+    }
+  }
+  return map;
+}
+
+
+/* Escape a string with the meta characters of XML. */
+char *cbxmlescape(const char *str){
+  CBDATUM *datum;
+  assert(str);
+  CB_DATUMOPEN(datum);
+  while(*str != '\0'){
+    switch(*str){
+    case '&':
+      CB_DATUMCAT(datum, "&", 5);
+      break;
+    case '<':
+      CB_DATUMCAT(datum, "<", 4);
+      break;
+    case '>':
+      CB_DATUMCAT(datum, ">", 4);
+      break;
+    case '"':
+      CB_DATUMCAT(datum, """, 6);
+      break;
+    case '\'':
+      CB_DATUMCAT(datum, "'", 6);
+      break;
+    default:
+      CB_DATUMCAT(datum, str, 1);
+      break;
+    }
+    str++;
+  }
+  return cbdatumtomalloc(datum, NULL);
+}
+
+
+/* Unescape a string with the entity references of XML. */
+char *cbxmlunescape(const char *str){
+  CBDATUM *datum;
+  assert(str);
+  CB_DATUMOPEN(datum);
+  while(*str != '\0'){
+    if(*str == '&'){
+      if(cbstrfwmatch(str, "&")){
+        CB_DATUMCAT(datum, "&", 1);
+        str += 5;
+      } else if(cbstrfwmatch(str, "<")){
+        CB_DATUMCAT(datum, "<", 1);
+        str += 4;
+      } else if(cbstrfwmatch(str, ">")){
+        CB_DATUMCAT(datum, ">", 1);
+        str += 4;
+      } else if(cbstrfwmatch(str, """)){
+        CB_DATUMCAT(datum, "\"", 1);
+        str += 6;
+      } else if(cbstrfwmatch(str, "'")){
+        CB_DATUMCAT(datum, "'", 1);
+        str += 6;
+      } else {
+        CB_DATUMCAT(datum, str, 1);
+        str++;
+      }
+    } else {
+      CB_DATUMCAT(datum, str, 1);
+      str++;
+    }
+  }
+  return cbdatumtomalloc(datum, NULL);
+}
+
+
+/* Compress a serial object with ZLIB. */
+char *cbdeflate(const char *ptr, int size, int *sp){
+  assert(ptr && sp);
+  if(!_qdbm_deflate) return NULL;
+  return _qdbm_deflate(ptr, size, sp, _QDBM_ZMZLIB);
+}
+
+
+/* Decompress a serial object compressed with ZLIB. */
+char *cbinflate(const char *ptr, int size, int *sp){
+  assert(ptr && size >= 0);
+  if(!_qdbm_inflate) return NULL;
+  return _qdbm_inflate(ptr, size, sp, _QDBM_ZMZLIB);
+}
+
+
+/* Compress a serial object with GZIP. */
+char *cbgzencode(const char *ptr, int size, int *sp){
+  assert(ptr && sp);
+  if(!_qdbm_deflate) return NULL;
+  return _qdbm_deflate(ptr, size, sp, _QDBM_ZMGZIP);
+}
+
+
+/* Decompress a serial object compressed with GZIP. */
+char *cbgzdecode(const char *ptr, int size, int *sp){
+  assert(ptr && size >= 0);
+  if(!_qdbm_inflate) return NULL;
+  return _qdbm_inflate(ptr, size, sp, _QDBM_ZMGZIP);
+}
+
+
+/* Get the CRC32 checksum of a serial object. */
+unsigned int cbgetcrc(const char *ptr, int size){
+  assert(ptr);
+  if(!_qdbm_inflate) return 0;
+  return _qdbm_getcrc(ptr, size);
+}
+
+
+/* Compress a serial object with LZO. */
+char *cblzoencode(const char *ptr, int size, int *sp){
+  assert(ptr && sp);
+  if(!_qdbm_lzoencode) return NULL;
+  return _qdbm_lzoencode(ptr, size, sp);
+}
+
+
+/* Decompress a serial object compressed with LZO. */
+char *cblzodecode(const char *ptr, int size, int *sp){
+  assert(ptr && size >= 0);
+  if(!_qdbm_lzodecode) return NULL;
+  return _qdbm_lzodecode(ptr, size, sp);
+}
+
+
+/* Compress a serial object with BZIP2. */
+char *cbbzencode(const char *ptr, int size, int *sp){
+  assert(ptr && sp);
+  if(!_qdbm_bzencode) return NULL;
+  return _qdbm_bzencode(ptr, size, sp);
+}
+
+
+/* Decompress a serial object compressed with BZIP2. */
+char *cbbzdecode(const char *ptr, int size, int *sp){
+  assert(ptr && size >= 0);
+  if(!_qdbm_bzdecode) return NULL;
+  return _qdbm_bzdecode(ptr, size, sp);
+}
+
+
+/* Convert the character encoding of a string. */
+char *cbiconv(const char *ptr, int size, const char *icode, const char *ocode, int *sp, int *mp){
+  char *res;
+  assert(ptr && icode && ocode);
+  if(!_qdbm_iconv) return NULL;
+  if((res = _qdbm_iconv(ptr, size, icode, ocode, sp, mp)) != NULL) return res;
+  if(!cbstricmp(icode, ocode)){
+    if(sp) *sp = size;
+    if(mp) *mp = 0;
+    CB_MEMDUP(res, ptr, size < 0 ? strlen(ptr) : size);
+    return res;
+  }
+  return NULL;
+}
+
+
+/* Detect the encoding of a string automatically. */
+const char *cbencname(const char *ptr, int size){
+  assert(ptr);
+  if(!_qdbm_encname) return "ISO-8859-1";
+  return _qdbm_encname(ptr, size);
+}
+
+
+/* Get the jet lag of the local time in seconds. */
+int cbjetlag(void){
+  struct tm ts, *tp;
+  time_t t, gt, lt;
+  if((t = time(NULL)) < 0) return 0;
+  if(!(tp = _qdbm_gmtime(&t, &ts))) return 0;
+  if((gt = mktime(tp)) < 0) return 0;
+  if(!(tp = _qdbm_localtime(&t, &ts))) return 0;
+  if((lt = mktime(tp)) < 0) return 0;
+  return lt - gt;
+}
+
+
+/* Get the Gregorian calendar of a time. */
+void cbcalendar(time_t t, int jl, int *yearp, int *monp, int *dayp,
+                int *hourp, int *minp, int *secp){
+  struct tm ts, *tp;
+  if(t < 0) t = time(NULL);
+  t += jl;
+  if(!(tp = _qdbm_gmtime(&t, &ts))) return;
+  if(yearp) *yearp = tp->tm_year + 1900;
+  if(monp) *monp = tp->tm_mon + 1;
+  if(dayp) *dayp = tp->tm_mday;
+  if(hourp) *hourp = tp->tm_hour;
+  if(minp) *minp = tp->tm_min;
+  if(secp) *secp = tp->tm_sec;
+}
+
+
+/* Get the day of week of a date. */
+int cbdayofweek(int year, int mon, int day){
+  if(mon < 3){
+    year--;
+    mon += 12;
+  }
+  return (day + ((8 + (13 * mon)) / 5) + (year + (year / 4) - (year / 100) + (year / 400))) % 7;
+}
+
+
+/* Get the string for a date in W3CDTF. */
+char *cbdatestrwww(time_t t, int jl){
+  char date[CB_DATEBUFSIZ], tzone[CB_DATEBUFSIZ], *rv;
+  int year, mon, day, hour, min, sec;
+  cbcalendar(t, jl, &year, &mon, &day, &hour, &min, &sec);
+  jl /= 60;
+  if(jl == 0){
+    sprintf(tzone, "Z");
+  } else if(jl < 0){
+    jl *= -1;
+    sprintf(tzone, "-%02d:%02d", jl / 60, jl % 60);
+  } else {
+    sprintf(tzone, "+%02d:%02d", jl / 60, jl % 60);
+  }
+  sprintf(date, "%04d-%02d-%02dT%02d:%02d:%02d%s", year, mon, day, hour, min, sec, tzone);
+  CB_MEMDUP(rv, date, strlen(date));
+  return rv;
+}
+
+
+/* Get the string for a date in RFC 1123 format. */
+char *cbdatestrhttp(time_t t, int jl){
+  char date[CB_DATEBUFSIZ], *wp, *rv;
+  int year, mon, day, hour, min, sec;
+  cbcalendar(t, jl, &year, &mon, &day, &hour, &min, &sec);
+  jl /= 60;
+  wp = date;
+  switch(cbdayofweek(year, mon, day)){
+  case 0: wp += sprintf(wp, "Sun, "); break;
+  case 1: wp += sprintf(wp, "Mon, "); break;
+  case 2: wp += sprintf(wp, "Tue, "); break;
+  case 3: wp += sprintf(wp, "Wed, "); break;
+  case 4: wp += sprintf(wp, "Thu, "); break;
+  case 5: wp += sprintf(wp, "Fri, "); break;
+  case 6: wp += sprintf(wp, "Sat, "); break;
+  }
+  wp += sprintf(wp, "%02d ", day);
+  switch(mon){
+  case 1: wp += sprintf(wp, "Jan "); break;
+  case 2: wp += sprintf(wp, "Feb "); break;
+  case 3: wp += sprintf(wp, "Mar "); break;
+  case 4: wp += sprintf(wp, "Apr "); break;
+  case 5: wp += sprintf(wp, "May "); break;
+  case 6: wp += sprintf(wp, "Jun "); break;
+  case 7: wp += sprintf(wp, "Jul "); break;
+  case 8: wp += sprintf(wp, "Aug "); break;
+  case 9: wp += sprintf(wp, "Sep "); break;
+  case 10: wp += sprintf(wp, "Oct "); break;
+  case 11: wp += sprintf(wp, "Nov "); break;
+  case 12: wp += sprintf(wp, "Dec "); break;
+  }
+  wp += sprintf(wp, "%04d %02d:%02d:%02d ", year, hour, min, sec);
+  if(jl == 0){
+    wp += sprintf(wp, "GMT");
+  } else if(jl < 0){
+    jl *= -1;
+    wp += sprintf(wp, "-%02d%02d", jl / 60, jl % 60);
+  } else {
+    wp += sprintf(wp, "+%02d%02d", jl / 60, jl % 60);
+  }
+  CB_MEMDUP(rv, date, strlen(date));
+  return rv;
+}
+
+
+/* Get the time value of a date string in decimal, W3CDTF, or RFC 1123. */
+time_t cbstrmktime(const char *str){
+  const char *crp;
+  char *pv, *rp;
+  int len, clen;
+  time_t t;
+  struct tm ts;
+  assert(str);
+  while(*str > '\0' && *str <= ' '){
+    str++;
+  }
+  if(*str == '\0') return -1;
+  if(str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) return (time_t)strtol(str + 2, NULL, 16);
+  memset(&ts, 0, sizeof(struct tm));
+  ts.tm_year = 70;
+  ts.tm_mon = 0;
+  ts.tm_mday = 1;
+  ts.tm_hour = 0;
+  ts.tm_min = 0;
+  ts.tm_sec = 0;
+  ts.tm_isdst = 0;
+  len = strlen(str);
+  t = (time_t)strtol(str, &pv, 10);
+  if(*(signed char *)pv >= '\0' && *pv <= ' '){
+    while(*pv > '\0' && *pv <= ' '){
+      pv++;
+    }
+    if(*pv == '\0') return t;
+  }
+  if((pv[0] == 's' || pv[0] == 'S') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
+    return t;
+  if((pv[0] == 'm' || pv[0] == 'M') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
+    return t * 60;
+  if((pv[0] == 'h' || pv[0] == 'H') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
+    return t * 60 * 60;
+  if((pv[0] == 'd' || pv[0] == 'D') && ((signed char *)pv)[1] >= '\0' && pv[1] <= ' ')
+    return t * 60 * 60 * 24;
+  if(len > 4 && str[4] == '-'){
+    ts.tm_year = atoi(str) - 1900;
+    if((pv = strchr(str, '-')) != NULL && pv - str == 4){
+      rp = pv + 1;
+      ts.tm_mon = atoi(rp) - 1;
+      if((pv = strchr(rp, '-')) != NULL && pv - str == 7){
+        rp = pv + 1;
+        ts.tm_mday = atoi(rp);
+        if((pv = strchr(rp, 'T')) != NULL && pv - str == 10){
+          rp = pv + 1;
+          ts.tm_hour = atoi(rp);
+          if((pv = strchr(rp, ':')) != NULL && pv - str == 13){
+            rp = pv + 1;
+            ts.tm_min = atoi(rp);
+          }
+          if((pv = strchr(rp, ':')) != NULL && pv - str == 16){
+            rp = pv + 1;
+            ts.tm_sec = atoi(rp);
+          }
+          if((pv = strchr(rp, '.')) != NULL && pv - str >= 19) rp = pv + 1;
+          strtol(rp, &pv, 10);
+          if((*pv == '+' || *pv == '-') && strlen(pv) >= 6 && pv[3] == ':')
+            ts.tm_sec -= (atoi(pv + 1) * 3600 + atoi(pv + 4) * 60) * (pv[0] == '+' ? 1 : -1);
+        }
+      }
+    }
+    ts.tm_sec += cbjetlag();
+    return mktime(&ts);
+  }
+  if(len > 4 && str[4] == '/'){
+    ts.tm_year = atoi(str) - 1900;
+    if((pv = strchr(str, '/')) != NULL && pv - str == 4){
+      rp = pv + 1;
+      ts.tm_mon = atoi(rp) - 1;
+      if((pv = strchr(rp, '/')) != NULL && pv - str == 7){
+        rp = pv + 1;
+        ts.tm_mday = atoi(rp);
+        if((pv = strchr(rp, ' ')) != NULL && pv - str == 10){
+          rp = pv + 1;
+          ts.tm_hour = atoi(rp);
+          if((pv = strchr(rp, ':')) != NULL && pv - str == 13){
+            rp = pv + 1;
+            ts.tm_min = atoi(rp);
+          }
+          if((pv = strchr(rp, ':')) != NULL && pv - str == 16){
+            rp = pv + 1;
+            ts.tm_sec = atoi(rp);
+          }
+          if((pv = strchr(rp, '.')) != NULL && pv - str >= 19) rp = pv + 1;
+          strtol(rp, &pv, 10);
+          if((*pv == '+' || *pv == '-') && strlen(pv) >= 6 && pv[3] == ':')
+            ts.tm_sec -= (atoi(pv + 1) * 3600 + atoi(pv + 4) * 60) * (pv[0] == '+' ? 1 : -1);
+        }
+      }
+    }
+    ts.tm_sec += cbjetlag();
+    return mktime(&ts);
+  }
+  crp = str;
+  if(len >= 4 && str[3] == ',') crp = str + 4;
+  while(*crp == ' '){
+    crp++;
+  }
+  ts.tm_mday = atoi(crp);
+  while((*crp >= '0' && *crp <= '9') || *crp == ' '){
+    crp++;
+  }
+  if(cbstrfwimatch(crp, "Jan")){
+    ts.tm_mon = 0;
+  } else if(cbstrfwimatch(crp, "Feb")){
+    ts.tm_mon = 1;
+  } else if(cbstrfwimatch(crp, "Mar")){
+    ts.tm_mon = 2;
+  } else if(cbstrfwimatch(crp, "Apr")){
+    ts.tm_mon = 3;
+  } else if(cbstrfwimatch(crp, "May")){
+    ts.tm_mon = 4;
+  } else if(cbstrfwimatch(crp, "Jun")){
+    ts.tm_mon = 5;
+  } else if(cbstrfwimatch(crp, "Jul")){
+    ts.tm_mon = 6;
+  } else if(cbstrfwimatch(crp, "Aug")){
+    ts.tm_mon = 7;
+  } else if(cbstrfwimatch(crp, "Sep")){
+    ts.tm_mon = 8;
+  } else if(cbstrfwimatch(crp, "Oct")){
+    ts.tm_mon = 9;
+  } else if(cbstrfwimatch(crp, "Nov")){
+    ts.tm_mon = 10;
+  } else if(cbstrfwimatch(crp, "Dec")){
+    ts.tm_mon = 11;
+  } else {
+    ts.tm_mon = -1;
+  }
+  if(ts.tm_mon >= 0) crp += 3;
+  while(*crp == ' '){
+    crp++;
+  }
+  ts.tm_year = atoi(crp);
+  if(ts.tm_year >= 1969) ts.tm_year -= 1900;
+  while(*crp >= '0' && *crp <= '9'){
+    crp++;
+  }
+  while(*crp == ' '){
+    crp++;
+  }
+  if(ts.tm_mday > 0 && ts.tm_mon >= 0 && ts.tm_year >= 0){
+    clen = strlen(crp);
+    if(clen >= 8 && crp[2] == ':' && crp[5] == ':'){
+      ts.tm_hour = atoi(crp + 0);
+      ts.tm_min = atoi(crp + 3);
+      ts.tm_sec = atoi(crp + 6);
+      if(clen >= 14 && crp[8] == ' ' && (crp[9] == '+' || crp[9] == '-')){
+        ts.tm_sec -= ((crp[10] - '0') * 36000 + (crp[11] - '0') * 3600 +
+                      (crp[12] - '0') * 600 + (crp[13] - '0') * 60) * (crp[9] == '+' ? 1 : -1);
+      } else if(clen > 9){
+        if(!strcmp(crp + 9, "JST")){
+          ts.tm_sec -= 9 * 3600;
+        } else if(!strcmp(crp + 9, "CCT")){
+          ts.tm_sec -= 8 * 3600;
+        } else if(!strcmp(crp + 9, "KST")){
+          ts.tm_sec -= 9 * 3600;
+        } else if(!strcmp(crp + 9, "EDT")){
+          ts.tm_sec -= -4 * 3600;
+        } else if(!strcmp(crp + 9, "EST")){
+          ts.tm_sec -= -5 * 3600;
+        } else if(!strcmp(crp + 9, "CDT")){
+          ts.tm_sec -= -5 * 3600;
+        } else if(!strcmp(crp + 9, "CST")){
+          ts.tm_sec -= -6 * 3600;
+        } else if(!strcmp(crp + 9, "MDT")){
+          ts.tm_sec -= -6 * 3600;
+        } else if(!strcmp(crp + 9, "MST")){
+          ts.tm_sec -= -7 * 3600;
+        } else if(!strcmp(crp + 9, "PDT")){
+          ts.tm_sec -= -7 * 3600;
+        } else if(!strcmp(crp + 9, "PST")){
+          ts.tm_sec -= -8 * 3600;
+        } else if(!strcmp(crp + 9, "HDT")){
+          ts.tm_sec -= -9 * 3600;
+        } else if(!strcmp(crp + 9, "HST")){
+          ts.tm_sec -= -10 * 3600;
+        }
+      }
+    }
+    ts.tm_sec += cbjetlag();
+    return mktime(&ts);
+  }
+  return -1;
+}
+
+
+/* Get user and system processing times. */
+void cbproctime(double *usrp, double *sysp){
+  struct tms buf;
+  times(&buf);
+  if(usrp) *usrp = (double)buf.tms_utime / sysconf(_SC_CLK_TCK);
+  if(sysp) *sysp = (double)buf.tms_stime / sysconf(_SC_CLK_TCK);
+}
+
+
+/* Ensure that the standard I/O is binary mode. */
+void cbstdiobin(void){
+  if(setmode(0, O_BINARY) == -1 || setmode(1, O_BINARY) == -1 || setmode(2, O_BINARY) == -1)
+    cbmyfatal("setmode failed");
+}
+
+
+
+/*************************************************************************************************
+ * features for experts
+ *************************************************************************************************/
+
+
+/* Show error message on the standard error output and exit. */
+void *cbmyfatal(const char *message){
+  char buf[CB_MSGBUFSIZ];
+  assert(message);
+  if(cbfatalfunc){
+    cbfatalfunc(message);
+  } else {
+    sprintf(buf, "fatal error: %s\n", message);
+    write(2, buf, strlen(buf));
+  }
+  exit(1);
+  return NULL;
+}
+
+
+/* Create a datum handle from an allocated region. */
+CBDATUM *cbdatumopenbuf(char *ptr, int size){
+  CBDATUM *datum;
+  assert(ptr && size >= 0);
+  CB_REALLOC(ptr, size + 1);
+  CB_MALLOC(datum, sizeof(*datum));
+  datum->dptr = ptr;
+  datum->dptr[size] = '\0';
+  datum->dsize = size;
+  datum->asize = size;
+  return datum;
+}
+
+
+/* Set a buffer to a datum handle. */
+void cbdatumsetbuf(CBDATUM *datum, char *ptr, int size){
+  assert(datum && ptr && size >= 0);
+  free(datum->dptr);
+  CB_REALLOC(ptr, size + 1);
+  datum->dptr = ptr;
+  datum->dptr[size] = '\0';
+  datum->dsize = size;
+  datum->asize = size;
+}
+
+
+/* Add an allocated element at the end of a list. */
+void cblistpushbuf(CBLIST *list, char *ptr, int size){
+  int index;
+  assert(list && ptr && size >= 0);
+  index = list->start + list->num;
+  if(index >= list->anum){
+    list->anum *= 2;
+    CB_REALLOC(list->array, list->anum * sizeof(list->array[0]));
+  }
+  list->array[index].dptr = ptr;
+  list->array[index].dsize = size;
+  list->num++;
+}
+
+
+/* Get a map handle with specifying the number of buckets. */
+CBMAP *cbmapopenex(int bnum){
+  CBMAP *map;
+  int i;
+  assert(bnum > 0);
+  CB_MALLOC(map, sizeof(*map));
+  CB_MALLOC(map->buckets, sizeof(map->buckets[0]) * bnum);
+  for(i = 0; i < bnum; i++){
+    map->buckets[i] = NULL;
+  }
+  map->first = NULL;
+  map->last = NULL;
+  map->cur = NULL;
+  map->bnum = bnum;
+  map->rnum = 0;
+  return map;
+}
+
+
+
+/*************************************************************************************************
+ * private objects
+ *************************************************************************************************/
+
+
+/* Handler to invoke the global garbage collector. */
+static void cbggchandler(void){
+  cbggckeeper(NULL, NULL);
+}
+
+
+/* Manage resources of the global garbage collector.
+   `ptr' specifies the pointer to add to the collection.  If it is `NULL', all resources are
+   released.
+   `func' specifies the pointer to the function to release the resources. */
+static void cbggckeeper(void *ptr, void (*func)(void *)){
+  static void **parray = NULL;
+  static void (**farray)(void *) = NULL;
+  static int onum = 0;
+  static int asiz = CB_GCUNIT;
+  int i;
+  if(!ptr){
+    if(!parray) return;
+    for(i = onum - 1; i >= 0; i--){
+      farray[i](parray[i]);
+    }
+    free(parray);
+    free(farray);
+    parray = NULL;
+    farray = NULL;
+    onum = 0;
+    asiz = CB_GCUNIT;
+    return;
+  }
+  if(!parray){
+    CB_MALLOC(parray, sizeof(void *) * asiz);
+    CB_MALLOC(farray, sizeof(void *) * asiz);
+    if(atexit(cbggchandler) != 0) cbmyfatal("gc failed");
+  }
+  if(onum >= asiz){
+    asiz *= 2;
+    CB_REALLOC(parray, sizeof(void *) * asiz);
+    CB_REALLOC(farray, sizeof(void *) * asiz);
+  }
+  parray[onum] = ptr;
+  farray[onum] = func;
+  onum++;
+}
+
+
+/* Utility function for quick sort.
+   `bp' specifies the pointer to the pointer to an array.
+   `nmemb' specifies the number of elements of the array.
+   `size' specifies the size of each element.
+   `pswap' specifies the pointer to the swap region for a pivot.
+   `vswap' specifies the pointer to the swap region for elements.
+   `compar' specifies the pointer to comparing function. */
+static void cbqsortsub(char *bp, int nmemb, int size, char *pswap, char *vswap,
+                       int(*compar)(const void *, const void *)){
+  int top, bottom;
+  assert(bp && nmemb >= 0 && size > 0 && pswap && vswap && compar);
+  if(nmemb < 10){
+    if(nmemb > 1) cbisort(bp, nmemb, size, compar);
+    return;
+  }
+  top = 0;
+  bottom = nmemb - 1;
+  memcpy(pswap, bp + (nmemb / 2) * size, size);
+  while(top - 1 < bottom){
+    if(compar(bp + top * size, pswap) < 0){
+      top++;
+    } else if(compar(bp + bottom * size, pswap) > 0){
+      bottom--;
+    } else {
+      if(top != bottom){
+        memcpy(vswap, bp + top * size, size);
+        memcpy(bp + top * size, bp + bottom * size, size);
+        memcpy(bp + bottom * size, vswap, size);
+      }
+      top++;
+      bottom--;
+    }
+  }
+  cbqsortsub(bp, top, size, pswap, vswap, compar);
+  cbqsortsub(bp + (bottom + 1) * size, nmemb - bottom - 1, size, pswap, vswap, compar);
+}
+
+
+/* Compare two list elements.
+   `a' specifies the pointer to one element.
+   `b' specifies the pointer to the other element.
+   The return value is positive if a is big, negative if b is big, else, it is 0. */
+static int cblistelemcmp(const void *a, const void *b){
+  int i, size;
+  CBLISTDATUM *ap, *bp;
+  char *ao, *bo;
+  assert(a && b);
+  ap = (CBLISTDATUM *)a;
+  bp = (CBLISTDATUM *)b;
+  ao = ap->dptr;
+  bo = bp->dptr;
+  size = ap->dsize < bp->dsize ? ap->dsize : bp->dsize;
+  for(i = 0; i < size; i++){
+    if(ao[i] > bo[i]) return 1;
+    if(ao[i] < bo[i]) return -1;
+  }
+  return ap->dsize - bp->dsize;
+}
+
+
+/* Compare two keys.
+   `abuf' specifies the pointer to the region of the former.
+   `asiz' specifies the size of the region.
+   `bbuf' specifies the pointer to the region of the latter.
+   `bsiz' specifies the size of the region.
+   The return value is 0 if two equals, positive if the formar is big, else, negative. */
+static int cbkeycmp(const char *abuf, int asiz, const char *bbuf, int bsiz){
+  assert(abuf && asiz >= 0 && bbuf && bsiz >= 0);
+  if(asiz > bsiz) return 1;
+  if(asiz < bsiz) return -1;
+  return memcmp(abuf, bbuf, asiz);
+}
+
+
+
+/* END OF FILE */

Deleted: box/trunk/qdbm/cabin.h
===================================================================
--- box/trunk/qdbm/cabin.h	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/cabin.h	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,1544 +0,0 @@
-/*************************************************************************************************
- * The utitlity API of QDBM
- *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#ifndef _CABIN_H                         /* duplication check */
-#define _CABIN_H
-
-#if defined(__cplusplus)                 /* export for C++ */
-extern "C" {
-#endif
-
-
-#include <stdlib.h>
-#include <time.h>
-
-
-#if defined(_MSC_VER) && !defined(QDBM_INTERNAL) && !defined(QDBM_STATIC)
-#define MYEXTERN extern __declspec(dllimport)
-#else
-#define MYEXTERN extern
-#endif
-
-
-
-/*************************************************************************************************
- * API
- *************************************************************************************************/
-
-
-#define CB_DATUMUNIT   12                /* allocation unit size of a datum handle */
-#define CB_LISTUNIT    64                /* allocation unit number of a list handle */
-#define CB_MAPBNUM     4093              /* bucket size of a map handle */
-
-typedef struct {                         /* type of structure for a basic datum */
-  char *dptr;                            /* pointer to the region */
-  int dsize;                             /* size of the region */
-  int asize;                             /* size of the allocated region */
-} CBDATUM;
-
-typedef struct {                         /* type of structure for an element of a list */
-  char *dptr;                            /* pointer to the region */
-  int dsize;                             /* size of the effective region */
-} CBLISTDATUM;
-
-typedef struct {                         /* type of structure for a list */
-  CBLISTDATUM *array;                    /* array of data */
-  int anum;                              /* number of the elements of the array */
-  int start;                             /* start index of using elements */
-  int num;                               /* number of using elements */
-} CBLIST;
-
-typedef struct _CBMAPDATUM {             /* type of structure for an element of a map */
-  int ksiz;                              /* size of the region of the key */
-  int vsiz;                              /* size of the region of the value */
-  int hash;                              /* second hash value */
-  struct _CBMAPDATUM *left;              /* pointer to the left child */
-  struct _CBMAPDATUM *right;             /* pointer to the right child */
-  struct _CBMAPDATUM *prev;              /* pointer to the previous element */
-  struct _CBMAPDATUM *next;              /* pointer to the next element */
-} CBMAPDATUM;
-
-typedef struct {                         /* type of structure for a map */
-  CBMAPDATUM **buckets;                  /* bucket array */
-  CBMAPDATUM *first;                     /* pointer to the first element */
-  CBMAPDATUM *last;                      /* pointer to the last element */
-  CBMAPDATUM *cur;                       /* pointer to the current element */
-  int bnum;                              /* number of buckets */
-  int rnum;                              /* number of records */
-} CBMAP;
-
-typedef struct {                         /* type of structure for a heap */
-  char *base;                            /* base pointer */
-  char *swap;                            /* region for swapping */
-  int size;                              /* size of each record */
-  int num;                               /* currnet number of records */
-  int max;                               /* maximum number of records */
-  int(*compar)(const void *, const void *);  /* comparing function */
-} CBHEAP;
-
-
-/* Call back function for handling a fatal error.
-   The argument specifies the error message.  The initial value of this variable is `NULL'.
-   If the value is `NULL', the default function is called when a fatal error occurs. A fatal
-   error occurs when memory allocation is failed. */
-MYEXTERN void (*cbfatalfunc)(const char *);
-
-
-/* Allocate a region on memory.
-   `size' specifies the size of the region.
-   The return value is the pointer to the allocated region.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-void *cbmalloc(size_t size);
-
-
-/* Re-allocate a region on memory.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.
-   The return value is the pointer to the re-allocated region.
-   Because the region of the return value is allocated with the `realloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-void *cbrealloc(void *ptr, size_t size);
-
-
-/* Duplicate a region on memory.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the pointer to the allocated region of the duplicate.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if
-   it is no longer in use. */
-char *cbmemdup(const char *ptr, int size);
-
-
-/* Free a region on memory.
-   `ptr' specifies the pointer to a region.  If it is `NULL', this function has no effect.
-   Although this function is just a wrapper of `free' call, this is useful in applications using
-   another package of the `malloc' series. */
-void cbfree(void *ptr);
-
-
-/* Register the pointer or handle of an object to the global garbage collector.
-   `ptr' specifies the pointer or handle of an object.
-   `func' specifies the pointer to a function to release resources of the object.  Its argument
-   is the pointer or handle of the object to release.
-   This function assures that resources of an object are released when the process exits
-   normally by returning from the `main' function or calling the `exit' function. */
-void cbglobalgc(void *ptr, void (*func)(void *));
-
-
-/* Exercise the global garbage collector explicitly.
-   Note that you should not use objects registered to the global garbage collector any longer
-   after calling this function.  Because the global garbage collecter is initialized and you
-   can register new objects into it. */
-void cbggcsweep(void);
-
-
-/* Check availability of allocation of the virtual memory.
-   `size' specifies the size of region to be allocated newly.
-   The return value is true if allocation should be success, or false if not. */
-int cbvmemavail(size_t size);
-
-
-/* Sort an array using insert sort.
-   `base' spacifies the pointer to an array.
-   `nmemb' specifies the number of elements of the array.
-   `size' specifies the size of each element.
-   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
-   of elements.  The comparing function should returns positive if the former is big, negative
-   if the latter is big, 0 if both are equal.
-   Insert sort is useful only if most elements have been sorted already. */
-void cbisort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
-
-
-/* Sort an array using shell sort.
-   `base' spacifies the pointer to an array.
-   `nmemb' specifies the number of elements of the array.
-   `size' specifies the size of each element.
-   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
-   of elements.  The comparing function should returns positive if the former is big, negative
-   if the latter is big, 0 if both are equal.
-   If most elements have been sorted, shell sort may be faster than heap sort or quick sort. */
-void cbssort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
-
-
-/* Sort an array using heap sort.
-   `base' spacifies the pointer to an array.
-   `nmemb' specifies the number of elements of the array.
-   `size' specifies the size of each element.
-   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
-   of elements.  The comparing function should returns positive if the former is big, negative
-   if the latter is big, 0 if both are equal.
-   Although heap sort is robust against bias of input, quick sort is faster in most cases. */
-void cbhsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
-
-
-/* Sort an array using quick sort.
-   `base' spacifies the pointer to an array.
-   `nmemb' specifies the number of elements of the array.
-   `size' specifies the size of each element.
-   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
-   of elements.  The comparing function should returns positive if the former is big, negative
-   if the latter is big, 0 if both are equal.
-   Being sensitive to bias of input, quick sort is the fastest sorting algorithm. */
-void cbqsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
-
-
-/* Compare two strings with case insensitive evaluation.
-   `astr' specifies the pointer of one string.
-   `astr' specifies the pointer of the other string.
-   The return value is positive if the former is big, negative if the latter is big, 0 if both
-   are equivalent.
-   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
-int cbstricmp(const char *astr, const char *bstr);
-
-
-/* Check whether a string begins with a key.
-   `str' specifies the pointer of a target string.
-   `key' specifies the pointer of a forward matching key string.
-   The return value is true if the target string begins with the key, else, it is false. */
-int cbstrfwmatch(const char *str, const char *key);
-
-
-/* Check whether a string begins with a key, with case insensitive evaluation.
-   `str' specifies the pointer of a target string.
-   `key' specifies the pointer of a forward matching key string.
-   The return value is true if the target string begins with the key, else, it is false.
-   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
-int cbstrfwimatch(const char *str, const char *key);
-
-
-/* Check whether a string ends with a key.
-   `str' specifies the pointer of a target string.
-   `key' specifies the pointer of a backward matching key string.
-   The return value is true if the target string ends with the key, else, it is false. */
-int cbstrbwmatch(const char *str, const char *key);
-
-
-/* Check whether a string ends with a key, with case insensitive evaluation.
-   `str' specifies the pointer of a target string.
-   `key' specifies the pointer of a backward matching key string.
-   The return value is true if the target string ends with the key, else, it is false.
-   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
-int cbstrbwimatch(const char *str, const char *key);
-
-
-/* Locate a substring in a string using KMP method.
-   `haystack' specifies the pointer of a target string.
-   `needle' specifies the pointer of a substring to be found.
-   The return value is the pointer to the beginning of the substring or `NULL' if the substring
-   is not found.
-   In most cases, `strstr' as a built-in function of the compiler is faster than this function. */
-char *cbstrstrkmp(const char *haystack, const char *needle);
-
-
-/* Locate a substring in a string using BM method.
-   `haystack' specifies the pointer of a target string.
-   `needle' specifies the pointer of a substring to be found.
-   The return value is the pointer to the beginning of the substring or `NULL' if the substring
-   is not found.
-   In most cases, `strstr' as a built-in function of the compiler is faster than this function. */
-char *cbstrstrbm(const char *haystack, const char *needle);
-
-
-/* Convert the letters of a string to upper case.
-   `str' specifies the pointer of a string to convert.
-   The return value is the pointer to the string. */
-char *cbstrtoupper(char *str);
-
-
-/* Convert the letters of a string to lower case.
-   `str' specifies the pointer of a string to convert.
-   The return value is the pointer to the string. */
-char *cbstrtolower(char *str);
-
-
-/* Cut space characters at head or tail of a string.
-   `str' specifies the pointer of a string to convert.
-   The return value is the pointer to the string. */
-char *cbstrtrim(char *str);
-
-
-/* Squeeze space characters in a string and trim it.
-   `str' specifies the pointer of a string to convert.
-   The return value is the pointer to the string. */
-char *cbstrsqzspc(char *str);
-
-
-/* Count the number of characters in a string of UTF-8.
-   `str' specifies the pointer of a string of UTF-8.
-   The return value is the number of characters in the string. */
-int cbstrcountutf(const char *str);
-
-
-/* Cut a string of UTF-8 at the specified number of characters.
-   `str' specifies the pointer of a string of UTF-8.
-   `num' specifies the number of characters to be kept.
-   The return value is the pointer to the string. */
-char *cbstrcututf(char *str, int num);
-
-
-/* Get a datum handle.
-   `ptr' specifies the pointer to the region of the initial content.  If it is `NULL', an empty
-   datum is created.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is a datum handle. */
-CBDATUM *cbdatumopen(const char *ptr, int size);
-
-
-/* Copy a datum.
-   `datum' specifies a datum handle.
-   The return value is a new datum handle. */
-CBDATUM *cbdatumdup(const CBDATUM *datum);
-
-
-/* Free a datum handle.
-   `datum' specifies a datum handle.
-   Because the region of a closed handle is released, it becomes impossible to use the handle. */
-void cbdatumclose(CBDATUM *datum);
-
-
-/* Concatenate a datum and a region.
-   `datum' specifies a datum handle.
-   `ptr' specifies the pointer to the region to be appended.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'. */
-void cbdatumcat(CBDATUM *datum, const char *ptr, int size);
-
-
-/* Get the pointer of the region of a datum.
-   `datum' specifies a datum handle.
-   The return value is the pointer of the region of a datum.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string. */
-const char *cbdatumptr(const CBDATUM *datum);
-
-
-/* Get the size of the region of a datum.
-   `datum' specifies a datum handle.
-   The return value is the size of the region of a datum. */
-int cbdatumsize(const CBDATUM *datum);
-
-
-/* Change the size of the region of a datum.
-   `datum' specifies a datum handle.
-   `size' specifies the new size of the region.
-   If the new size is bigger than the one of old, the surplus region is filled with zero codes. */
-void cbdatumsetsize(CBDATUM *datum, int size);
-
-
-/* Perform formatted output into a datum.
-   `format' specifies a printf-like format string.
-   The conversion character `%' can be used with such flag characters as `s', `d', `o', `u',
-   `x', `X', `c', `e', `E', `f', `g', `G', `@', `?', `:', `%'.  `@' works as with `s' but escapes
-   meta characters of XML.  `?' works as with `s' but escapes meta characters of URL.  `:' works
-   as with `s' but performs MIME encoding as UTF-8.  The other conversion character work as with
-   each original. */
-void cbdatumprintf(CBDATUM *datum, const char *format, ...);
-
-
-/* Convert a datum to an allocated region.
-   `datum' specifies a datum handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the datum.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  Because the region of the original datam is released, it should not be
-   released again. */
-char *cbdatumtomalloc(CBDATUM *datum, int *sp);
-
-
-/* Get a list handle.
-   The return value is a list handle. */
-CBLIST *cblistopen(void);
-
-
-/* Copy a list.
-   `list' specifies a list handle.
-   The return value is a new list handle. */
-CBLIST *cblistdup(const CBLIST *list);
-
-
-/* Close a list handle.
-   `list' specifies a list handle.
-   Because the region of a closed handle is released, it becomes impossible to use the handle. */
-void cblistclose(CBLIST *list);
-
-
-/* Get the number of elements of a list.
-   `list' specifies a list handle.
-   The return value is the number of elements of the list. */
-int cblistnum(const CBLIST *list);
-
-
-/* Get the pointer to the region of an element of a list.
-   `list' specifies a list handle.
-   `index' specifies the index of an element.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the value.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  If `index' is equal to or more than
-   the number of elements, the return value is `NULL'. */
-const char *cblistval(const CBLIST *list, int index, int *sp);
-
-
-/* Add an element at the end of a list.
-   `list' specifies a list handle.
-   `ptr' specifies the pointer to the region of an element.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'. */
-void cblistpush(CBLIST *list, const char *ptr, int size);
-
-
-/* Remove an element of the end of a list.
-   `list' specifies a list handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the value.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  If the list is empty, the return value is `NULL'. */
-char *cblistpop(CBLIST *list, int *sp);
-
-
-/* Add an element at the top of a list.
-   `list' specifies a list handle.
-   `ptr' specifies the pointer to the region of an element.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'. */
-void cblistunshift(CBLIST *list, const char *ptr, int size);
-
-
-/* Remove an element of the top of a list.
-   `list' specifies a list handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the value.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  If the list is empty, the return value is `NULL'. */
-char *cblistshift(CBLIST *list, int *sp);
-
-
-/* Add an element at the specified location of a list.
-   `list' specifies a list handle.
-   `index' specifies the index of an element.
-   `ptr' specifies the pointer to the region of the element.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'. */
-void cblistinsert(CBLIST *list, int index, const char *ptr, int size);
-
-
-/* Remove an element at the specified location of a list.
-   `list' specifies a list handle.
-   `index' specifies the index of an element.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the value.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  If `index' is equal to or more than the number of elements, no element
-   is removed and the return value is `NULL'. */
-char *cblistremove(CBLIST *list, int index, int *sp);
-
-
-/* Overwrite an element at the specified location of a list.
-   `list' specifies a list handle.
-   `index' specifies the index of an element.
-   `ptr' specifies the pointer to the region of the new content.
-   `size' specifies the size of the new content.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   If `index' is equal to or more than the number of elements, this function has no effect. */
-void cblistover(CBLIST *list, int index, const char *ptr, int size);
-
-
-/* Sort elements of a list in lexical order.
-   `list' specifies a list handle.
-   Quick sort is used for sorting. */
-void cblistsort(CBLIST *list);
-
-
-/* Search a list for an element using liner search.
-   `list' specifies a list handle.
-   `ptr' specifies the pointer to the region of a key.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the index of a corresponding element or -1 if there is no corresponding
-   element.  If two or more elements corresponds, the former returns. */
-int cblistlsearch(const CBLIST *list, const char *ptr, int size);
-
-
-/* Search a list for an element using binary search.
-   `list' specifies a list handle.  It should be sorted in lexical order.
-   `ptr' specifies the pointer to the region of a key.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the index of a corresponding element or -1 if there is no corresponding
-   element.  If two or more elements corresponds, which returns is not defined. */
-int cblistbsearch(const CBLIST *list, const char *ptr, int size);
-
-
-/* Serialize a list into a byte array.
-   `list' specifies a list handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   The return value is the pointer to the region of the result serial region.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cblistdump(const CBLIST *list, int *sp);
-
-
-/* Redintegrate a serialized list.
-   `ptr' specifies the pointer to a byte array.
-   `size' specifies the size of the region.
-   The return value is a new list handle. */
-CBLIST *cblistload(const char *ptr, int size);
-
-
-/* Get a map handle.
-   The return value is a map handle. */
-CBMAP *cbmapopen(void);
-
-
-/* Copy a map.
-   `map' specifies a map handle.
-   The return value is a new map handle.
-   The iterator of the source map is initialized. */
-CBMAP *cbmapdup(CBMAP *map);
-
-
-/* Close a map handle.
-   `map' specifies a map handle.
-   Because the region of a closed handle is released, it becomes impossible to use the handle. */
-void cbmapclose(CBMAP *map);
-
-
-/* Store a record into a map.
-   `map' specifies a map handle.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   `vbuf' specifies the pointer to the region of a value.
-   `vsiz' specifies the size of the region of the value.  If it is negative, the size is
-   assigned with `strlen(vbuf)'.
-   `over' specifies whether the value of the duplicated record is overwritten or not.
-   If `over' is false and the key is duplicated, the return value is false, else, it is true. */
-int cbmapput(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int over);
-
-
-/* Concatenate a value at the end of the value of the existing record.
-   `map' specifies a map handle.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   `vbuf' specifies the pointer to the region of a value.
-   `vsiz' specifies the size of the region of the value.  If it is negative, the size is
-   assigned with `strlen(vbuf)'.
-   If there is no corresponding record, a new record is created. */
-void cbmapputcat(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz);
-
-
-/* Delete a record in a map.
-   `map' specifies a map handle.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   If successful, the return value is true.  False is returned when no record corresponds to
-   the specified key. */
-int cbmapout(CBMAP *map, const char *kbuf, int ksiz);
-
-
-/* Retrieve a record in a map.
-   `map' specifies a map handle.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the region of the value of the
-   corresponding record.  `NULL' is returned when no record corresponds.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string. */
-const char *cbmapget(const CBMAP *map, const char *kbuf, int ksiz, int *sp);
-
-
-/* Move a record to the edge of a map.
-   `map' specifies a map handle.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   `head' specifies the destination which is head if it is true or tail if else.
-   If successful, the return value is true.  False is returned when no record corresponds to
-   the specified key. */
-int cbmapmove(CBMAP *map, const char *kbuf, int ksiz, int head);
-
-
-/* Initialize the iterator of a map.
-   `map' specifies a map handle.
-   The iterator is used in order to access the key of every record stored in a map. */
-void cbmapiterinit(CBMAP *map);
-
-
-/* Get the next key of the iterator of a map.
-   `map' specifies a map handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the region of the next key, else, it is
-   `NULL'.  `NULL' is returned when no record is to be get out of the iterator.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  The order of iteration is assured
-   to be the same of the one of storing. */
-const char *cbmapiternext(CBMAP *map, int *sp);
-
-
-/* Get the value binded to the key fetched from the iterator of a map.
-   `kbuf' specifies the pointer to the region of a iteration key.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the value of the corresponding record.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string. */
-const char *cbmapiterval(const char *kbuf, int *sp);
-
-
-/* Get the number of the records stored in a map.
-   `map' specifies a map handle.
-   The return value is the number of the records stored in the map. */
-int cbmaprnum(const CBMAP *map);
-
-
-/* Get the list handle contains all keys in a map.
-   `map' specifies a map handle.
-   The return value is the list handle contains all keys in the map.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbmapkeys(CBMAP *map);
-
-
-/* Get the list handle contains all values in a map.
-   `map' specifies a map handle.
-   The return value is the list handle contains all values in the map.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbmapvals(CBMAP *map);
-
-
-/* Serialize a map into a byte array.
-   `map' specifies a map handle.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   The return value is the pointer to the region of the result serial region.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbmapdump(CBMAP *map, int *sp);
-
-
-/* Redintegrate a serialized map.
-   `ptr' specifies the pointer to a byte array.
-   `size' specifies the size of the region.
-   The return value is a new map handle. */
-CBMAP *cbmapload(const char *ptr, int size);
-
-
-/* Extract a record from a serialized map.
-   `ptr' specifies the pointer to a byte array.
-   `size' specifies the size of the region.
-   `kbuf' specifies the pointer to the region of a key.
-   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
-   with `strlen(kbuf)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the region of the value of the
-   corresponding record.  `NULL' is returned when no record corresponds.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string. */
-char *cbmaploadone(const char *ptr, int size, const char *kbuf, int ksiz, int *sp);
-
-
-/* Get a heap handle.
-   `size' specifies the size of each record.
-   `max' specifies the maximum number of records in the heap.
-   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
-   of records.  The comparing function should returns positive if the former is big, negative
-   if the latter is big, 0 if both are equal.
-   The return value is a heap handle. */
-CBHEAP *cbheapopen(int size, int max, int(*compar)(const void *, const void *));
-
-
-/* Copy a heap.
-   `heap' specifies a heap handle.
-   The return value is a new heap handle. */
-CBHEAP *cbheapdup(CBHEAP *heap);
-
-
-/* Close a heap handle.
-   `heap' specifies a heap handle.
-   Because the region of a closed handle is released, it becomes impossible to use the handle. */
-void cbheapclose(CBHEAP *heap);
-
-
-/* Get the number of the records stored in a heap.
-   `heap' specifies a heap handle.
-   The return value is the number of the records stored in the heap. */
-int cbheapnum(CBHEAP *heap);
-
-
-/* Insert a record into a heap.
-   `heap' specifies a heap handle.
-   `ptr' specifies the pointer to the region of a record.
-   The return value is true if the record is added, else false.
-   If the new record is bigger than the biggest existing regord, the new record is not added.
-   If the new record is added and the number of records exceeds the maximum number, the biggest
-   existing record is removed. */
-int cbheapinsert(CBHEAP *heap, const void *ptr);
-
-
-/* Get the pointer to the region of a record in a heap.
-   `heap' specifies a heap handle.
-   `index' specifies the index of a record.
-   The return value is the pointer to the region of the record.
-   If `index' is equal to or more than the number of records, the return value is `NULL'.  Note
-   that records are organized by the nagative order the comparing function. */
-const void *cbheapval(CBHEAP *heap, int index);
-
-
-/* Convert a heap to an allocated region.
-   `heap' specifies a heap handle.
-   `np' specifies the pointer to a variable to which the number of records of the return value
-   is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the heap.  Records are sorted.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use.  Because the region of the original
-   heap is released, it should not be released again. */
-void *cbheaptomalloc(CBHEAP *heap, int *np);
-
-
-/* Allocate a formatted string on memory.
-   `format' specifies a printf-like format string.  The conversion character `%' can be used
-   with such flag characters as `d', `o', `u', `x', `X', `e', `E', `f', `g', `G', `c', `s', and
-   `%'.  Specifiers of the field length and the precision can be put between the conversion
-   characters and the flag characters.  The specifiers consist of decimal characters, `.', `+',
-   `-', and the space character.
-   The other arguments are used according to the format string.
-   The return value is the pointer to the allocated region of the result string.  Because the
-   region of the return value is allocated with the `malloc' call, it should be released with
-   the `free' call if it is no longer in use. */
-char *cbsprintf(const char *format, ...);
-
-
-/* Replace some patterns in a string.
-   `str' specifies the pointer to a source string.
-   `pairs' specifies the handle of a map composed of pairs of replacement.  The key of each pair
-   specifies a pattern before replacement and its value specifies the pattern after replacement.
-   The return value is the pointer to the allocated region of the result string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbreplace(const char *str, CBMAP *pairs);
-
-
-/* Make a list by splitting a serial datum.
-   `ptr' specifies the pointer to the region of the source content.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `delim' specifies a string containing delimiting characters.  If it is `NULL', zero code is
-   used as a delimiter.
-   The return value is a list handle.
-   If two delimiters are successive, it is assumed that an empty element is between the two.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose'. */
-CBLIST *cbsplit(const char *ptr, int size, const char *delim);
-
-
-/* Read whole data of a file.
-   `name' specifies the name of a file.  If it is `NULL', the standard input is specified.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the allocated region of the read data.  Because an
-   additional zero code is appended at the end of the region of the return value, the return
-   value can be treated as a character string.  Because the region of the return value is
-   allocated with the `malloc' call, it should be released with the `free' call if it is no
-   longer in use.  */
-char *cbreadfile(const char *name, int *sp);
-
-
-/* Write a serial datum into a file.
-   `name specifies the name of a file.  If it is `NULL', the standard output is specified.
-   `ptr' specifies the pointer to the region of the source content.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   If successful, the return value is true, else, it is false.
-   If the file exists, it is overwritten.  Else, a new file is created. */
-int cbwritefile(const char *name, const char *ptr, int size);
-
-
-/* Read every line of a file.
-   `name' specifies the name of a file.  If it is `NULL', the standard input is specified.
-   The return value is a list handle of the lines if successful, else it is NULL.  Line
-   separators are cut out.  Because the handle of the return value is opened with the function
-   `cblistopen', it should be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbreadlines(const char *name);
-
-
-/* Read names of files in a directory.
-   `name' specifies the name of a directory.
-   The return value is a list handle of names if successful, else it is NULL.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbdirlist(const char *name);
-
-
-/* Get the status of a file or a directory.
-   `name' specifies the name of a file or a directory.
-   `dirp' specifies the pointer to a variable to which whether the file is a directory is
-   assigned.  If it is `NULL', it is not used.
-   `sizep' specifies the pointer to a variable to which the size of the file is assigned.  If it
-   is `NULL', it is not used.
-   `mtimep' specifies the pointer to a variable to which the last modified time of the file is
-   assigned.  If it is `NULL', it is not used.
-   If successful, the return value is true, else, false.  False is returned when the file does
-   not exist or the permission is denied. */
-int cbfilestat(const char *name, int *isdirp, int *sizep, time_t *mtimep);
-
-
-/* Remove a file or a directory and its sub ones recursively.
-   `name' specifies the name of a file or a directory.
-   If successful, the return value is true, else, false.  False is returned when the file does
-   not exist or the permission is denied. */
-int cbremove(const char *name);
-
-
-/* Break up a URL into elements.
-   `str' specifies the pointer to a string of URL.
-   The return value is a map handle.  Each key of the map is the name of an element.  The key
-   "self" specifies the URL itself.  The key "scheme" specifies the scheme.  The key "host"
-   specifies the host of the server.  The key "port" specifies the port number of the server.
-   The key "authority" specifies the authority information.  The key "path" specifies the path
-   of the resource.  The key "file" specifies the file name without the directory section.  The
-   key "query" specifies the query string.  The key "fragment" specifies the fragment string.
-   Supported schema are HTTP, HTTPS, FTP, and FILE.  Absolute URL and relative URL are supported.
-   Because the handle of the return value is opened with the function `cbmapopen', it should
-   be closed with the function `cbmapclose' if it is no longer in use. */
-CBMAP *cburlbreak(const char *str);
-
-
-/* Resolve a relative URL with another absolute URL.
-   `base' specifies an absolute URL of a base location.
-   `target' specifies a URL to be resolved.
-   The return value is a resolved URL.  If the target URL is relative, a new URL of relative
-   location from the base location is returned.  Else, a copy of the target URL is returned.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cburlresolve(const char *base, const char *target);
-
-
-/* Encode a serial object with URL encoding.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the pointer to the result string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cburlencode(const char *ptr, int size);
-
-
-/* Decode a string encoded with URL encoding.
-   `str' specifies the pointer to an encoded string.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the result.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if
-   it is no longer in use. */
-char *cburldecode(const char *str, int *sp);
-
-
-/* Encode a serial object with Base64 encoding.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the pointer to the result string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbbaseencode(const char *ptr, int size);
-
-
-/* Decode a string encoded with Base64 encoding.
-   `str' specifies the pointer to an encoded string.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the result.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if
-   it is no longer in use. */
-char *cbbasedecode(const char *str, int *sp);
-
-
-/* Encode a serial object with quoted-printable encoding.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the pointer to the result string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbquoteencode(const char *ptr, int size);
-
-
-/* Decode a string encoded with quoted-printable encoding.
-   `str' specifies the pointer to an encoded string.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer to the region of the result.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if
-   it is no longer in use. */
-char *cbquotedecode(const char *str, int *sp);
-
-
-/* Split a string of MIME into headers and the body.
-   `ptr' specifies the pointer to the region of MIME data.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `attrs' specifies a map handle to store attributes.  If it is `NULL', it is not used.  Each
-   key of the map is an attribute name uncapitalized.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   The return value is the pointer of the body data.
-   If the content type is defined, the attribute map has the key "TYPE" specifying the type.  If
-   the character encoding is defined, the key "CHARSET" specifies the encoding name.  If the
-   boundary string of multipart is defined, the key "BOUNDARY" specifies the string.  If the
-   content disposition is defined, the key "DISPOSITION" specifies the direction.  If the file
-   name is defined, the key "FILENAME" specifies the name.  If the attribute name is defined,
-   the key "NAME" specifies the name.  Because the region of the return value is allocated with
-   the `malloc' call, it should be released with the `free' call if it is no longer in use. */
-char *cbmimebreak(const char *ptr, int size, CBMAP *attrs, int *sp);
-
-
-/* Split multipart data of MIME into its parts.
-   `ptr' specifies the pointer to the region of multipart data of MIME.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `boundary' specifies the pointer to the region of the boundary string.
-   The return value is a list handle.  Each element of the list is the string of a part.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbmimeparts(const char *ptr, int size, const char *boundary);
-
-
-/* Encode a string with MIME encoding.
-   `str' specifies the pointer to a string.
-   `encname' specifies a string of the name of the character encoding.
-   The return value is the pointer to the result string.
-   `base' specifies whether to use Base64 encoding.  If it is false, quoted-printable is used.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbmimeencode(const char *str, const char *encname, int base);
-
-
-/* Decode a string encoded with MIME encoding.
-   `str' specifies the pointer to an encoded string.
-   `enp' specifies the pointer to a region into which the name of encoding is written.  If it is
-   `NULL', it is not used.  The size of the buffer should be equal to or more than 32 bytes.
-   The return value is the pointer to the result string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbmimedecode(const char *str, char *enp);
-
-
-/* Split a string of CSV into rows.
-   `str' specifies the pointer to the region of an CSV string.
-   The return value is a list handle.  Each element of the list is a string of a row.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use.  The character encoding
-   of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS.  Being
-   compatible with MS-Excel, these functions for CSV can handle cells including such meta
-   characters as comma, between double quotation marks. */
-CBLIST *cbcsvrows(const char *str);
-
-
-/* Split the string of a row of CSV into cells.
-   `str' specifies the pointer to the region of a row of CSV.
-   The return value is a list handle.  Each element of the list is the unescaped string of a
-   cell of the row.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use. */
-CBLIST *cbcsvcells(const char *str);
-
-
-/* Escape a string with the meta characters of CSV.
-   `str' specifies the pointer to the region of a string.
-   The return value is the pointer to the escaped string sanitized of meta characters.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbcsvescape(const char *str);
-
-
-/* Unescape a string with the escaped meta characters of CSV.
-   `str' specifies the pointer to the region of a string with meta characters.
-   The return value is the pointer to the unescaped string.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbcsvunescape(const char *str);
-
-
-/* Split a string of XML into tags and text sections.
-   `str' specifies the pointer to the region of an XML string.
-   `cr' specifies whether to remove comments.
-   The return value is a list handle.  Each element of the list is the string of a tag or a
-   text section.
-   Because the handle of the return value is opened with the function `cblistopen', it should
-   be closed with the function `cblistclose' if it is no longer in use.  The character encoding
-   of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS.  Because
-   these functions for XML are not XML parser with validation check, it can handle also HTML
-   and SGML. */
-CBLIST *cbxmlbreak(const char *str, int cr);
-
-
-/* Get the map of attributes of an XML tag.
-   `str' specifies the pointer to the region of a tag string.
-   The return value is a map handle.  Each key of the map is the name of an attribute.  Each
-   value is unescaped.  You can get the name of the tag with the key of an empty string.
-   Because the handle of the return value is opened with the function `cbmapopen', it should
-   be closed with the function `cbmapclose' if it is no longer in use. */
-CBMAP *cbxmlattrs(const char *str);
-
-
-/* Escape a string with the meta characters of XML.
-   `str' specifies the pointer to the region of a string.
-   The return value is the pointer to the escaped string sanitized of meta characters.
-   This function converts only `&', `<', `>', and `"'.  Because the region of the return value
-   is allocated with the `malloc' call, it should be released with the `free' call if it is no
-   longer in use. */
-char *cbxmlescape(const char *str);
-
-
-/* Unescape a string with the entity references of XML.
-   `str' specifies the pointer to the region of a string with meta characters.
-   The return value is the pointer to the unescaped string.
-   This function restores only `&', `<', `>', and `"'.  Because the region of the
-   return value is allocated with the `malloc' call, it should be released with the `free' call
-   if it is no longer in use. */
-char *cbxmlunescape(const char *str);
-
-
-/* Compress a serial object with ZLIB.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use.  This function is available only if
-   QDBM was built with ZLIB enabled. */
-char *cbdeflate(const char *ptr, int size, int *sp);
-
-
-/* Decompress a serial object compressed with ZLIB.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  This function is available only if QDBM was built with ZLIB enabled. */
-char *cbinflate(const char *ptr, int size, int *sp);
-
-
-/* Compress a serial object with GZIP.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use.  This function is available only if
-   QDBM was built with ZLIB enabled. */
-char *cbgzencode(const char *ptr, int size, int *sp);
-
-
-/* Decompress a serial object compressed with GZIP.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  This function is available only if QDBM was built with ZLIB enabled. */
-char *cbgzdecode(const char *ptr, int size, int *sp);
-
-
-/* Get the CRC32 checksum of a serial object.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the CRC32 checksum of the object.
-   This function is available only if QDBM was built with ZLIB enabled. */
-unsigned int cbgetcrc(const char *ptr, int size);
-
-
-/* Compress a serial object with LZO.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use.  This function is available only if
-   QDBM was built with LZO enabled. */
-char *cblzoencode(const char *ptr, int size, int *sp);
-
-
-/* Decompress a serial object compressed with LZO.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  This function is available only if QDBM was built with LZO enabled. */
-char *cblzodecode(const char *ptr, int size, int *sp);
-
-
-/* Compress a serial object with BZIP2.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use.  This function is available only if
-   QDBM was built with LZO enabled. */
-char *cbbzencode(const char *ptr, int size, int *sp);
-
-
-/* Decompress a serial object compressed with BZIP2.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  This function is available only if QDBM was built with LZO enabled. */
-char *cbbzdecode(const char *ptr, int size, int *sp);
-
-
-/* Convert the character encoding of a string.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   `icode' specifies the name of encoding of the input string.
-   `ocode' specifies the name of encoding of the output string.
-   `sp' specifies the pointer to a variable to which the size of the region of the return
-   value is assigned.  If it is `NULL', it is not used.
-   `mp' specifies the pointer to a variable to which the number of missing characters by failure
-   of conversion is assigned.  If it is `NULL', it is not used.
-   If successful, the return value is the pointer to the result object, else, it is `NULL'.
-   Because an additional zero code is appended at the end of the region of the return value,
-   the return value can be treated as a character string.  Because the region of the return
-   value is allocated with the `malloc' call, it should be released with the `free' call if it
-   is no longer in use.  This function is available only if QDBM was built with ICONV enabled. */
-char *cbiconv(const char *ptr, int size, const char *icode, const char *ocode, int *sp, int *mp);
-
-
-/* Detect the encoding of a string automatically.
-   `ptr' specifies the pointer to a region.
-   `size' specifies the size of the region.  If it is negative, the size is assigned with
-   `strlen(ptr)'.
-   The return value is the string of the encoding name of the string.
-   As it stands, US-ASCII, ISO-2022-JP, Shift_JIS, CP932, EUC-JP, UTF-8, UTF-16, UTF-16BE,
-   and UTF-16LE are supported.  If none of them matches, ISO-8859-1 is selected.  This function
-   is available only if QDBM was built with ICONV enabled. */
-const char *cbencname(const char *ptr, int size);
-
-
-/* Get the jet lag of the local time in seconds.
-   The return value is the jet lag of the local time in seconds. */
-int cbjetlag(void);
-
-
-/* Get the Gregorian calendar of a time.
-   `t' specifies a source time.  If it is negative, the current time is specified.
-   `jl' specifies the jet lag of a location in seconds.
-   `yearp' specifies the pointer to a variable to which the year is assigned.  If it is `NULL',
-   it is not used.
-   `monp' specifies the pointer to a variable to which the month is assigned.  If it is `NULL',
-   it is not used.  1 means January and 12 means December.
-   `dayp' specifies the pointer to a variable to which the day of the month is assigned.  If it
-   is `NULL', it is not used.
-   `hourp' specifies the pointer to a variable to which the hours is assigned.  If it is `NULL',
-   it is not used.
-   `minp' specifies the pointer to a variable to which the minutes is assigned.  If it is `NULL',
-   it is not used.
-   `secp' specifies the pointer to a variable to which the seconds is assigned.  If it is `NULL',
-   it is not used. */
-void cbcalendar(time_t t, int jl, int *yearp, int *monp, int *dayp,
-                int *hourp, int *minp, int *secp);
-
-
-/* Get the day of week of a date.
-   `year' specifies the year of a date.
-   `mon' specifies the month of the date.
-   `day' specifies the day of the date.
-   The return value is the day of week of the date.  0 means Sunday and 6 means Saturday. */
-int cbdayofweek(int year, int mon, int day);
-
-
-/* Get the string for a date in W3CDTF.
-   `t' specifies a source time.  If it is negative, the current time is specified.
-   `jl' specifies the jet lag of a location in seconds.
-   The return value is the string of the date in W3CDTF (YYYY-MM-DDThh:mm:ddTZD).
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbdatestrwww(time_t t, int jl);
-
-
-/* Get the string for a date in RFC 1123 format.
-   `t' specifies a source time.  If it is negative, the current time is specified.
-   `jl' specifies the jet lag of a location in seconds.
-   The return value is the string of the date in RFC 1123 format (Wdy, DD-Mon-YYYY hh:mm:dd TZD).
-   Because the region of the return value is allocated with the `malloc' call, it should be
-   released with the `free' call if it is no longer in use. */
-char *cbdatestrhttp(time_t t, int jl);
-
-
-/* Get the time value of a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123).
-   `str' specifies a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123).
-   The return value is the time value of the date or -1 if the format is invalid.
-   Decimal can be trailed by "s" for in seconds, "m" for in minutes, "h" for in hours,
-   and "d" for in days. */
-time_t cbstrmktime(const char *str);
-
-
-/* Get user and system processing times.
-   `usrp' specifies the pointer to a variable to which the user processing time is assigned.
-   If it is `NULL', it is not used.  The unit of time is seconds.
-   `sysp' specifies the pointer to a variable to which the system processing time is assigned.
-   If it is `NULL', it is not used.  The unit of time is seconds. */
-void cbproctime(double *usrp, double *sysp);
-
-
-/* Ensure that the standard I/O is binary mode.
-   This function is useful for applications on dosish file systems. */
-void cbstdiobin(void);
-
-
-
-/*************************************************************************************************
- * features for experts
- *************************************************************************************************/
-
-
-/* Show error message on the standard error output and exit.
-   `message' specifies an error message.
-   This function does not return. */
-void *cbmyfatal(const char *message);
-
-
-/* Create a datum handle from an allocated region.
-   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
-   malloc and it is released by the function.
-   `size' specifies the size of the region. */
-CBDATUM *cbdatumopenbuf(char *ptr, int size);
-
-
-/* Set a buffer to a datum handle.
-   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
-   malloc and it is released by the function.
-   `size' specifies the size of the region. */
-void cbdatumsetbuf(CBDATUM *datum, char *ptr, int size);
-
-
-/* Add an allocated element at the end of a list.
-   `list' specifies a list handle.
-   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
-   malloc and it is released by the function.
-   `size' specifies the size of the region. */
-void cblistpushbuf(CBLIST *list, char *ptr, int size);
-
-
-/* Get a map handle with specifying the number of buckets.
-   `bnum' specifies the number of buckets.
-   The return value is a map handle. */
-CBMAP *cbmapopenex(int bnum);
-
-
-/* Alias of `cbmalloc'. */
-#define CB_MALLOC(CB_ptr, CB_size) \
-  (((CB_ptr) = malloc(CB_size)) ? (CB_ptr) : cbmyfatal("out of memory"))
-
-
-/* Alias of `cbrealloc'. */
-#define CB_REALLOC(CB_ptr, CB_size) \
-  (((CB_ptr) = realloc((CB_ptr), (CB_size))) ? (CB_ptr) : cbmyfatal("out of memory"))
-
-
-/* Alias of `cbmemdup'.
-   However, `size' should not be negative. */
-#define CB_MEMDUP(CB_res, CB_ptr, CB_size) \
-  do { \
-    CB_MALLOC((CB_res), (CB_size) + 1); \
-    memcpy((CB_res), (CB_ptr), (CB_size)); \
-    (CB_res)[(CB_size)] = '\0'; \
-  } while(FALSE)
-
-
-/* Get the size of padding bytes for pointer alignment.
-   `hsiz' specifies the header size of the object.
-   The return value is the size of padding bytes. */
-#define CB_ALIGNPAD(CB_hsiz) \
-  (((CB_hsiz | ~-(int)sizeof(void *)) + 1) - CB_hsiz)
-
-
-/* Alias of `cbdatumopen'.
-   However, no dafault data is specified. */
-#define CB_DATUMOPEN(CB_datum) \
-  do { \
-    CB_MALLOC((CB_datum), sizeof(*(CB_datum))); \
-    CB_MALLOC((CB_datum)->dptr, CB_DATUMUNIT); \
-    (CB_datum)->dptr[0] = '\0'; \
-    (CB_datum)->dsize = 0; \
-    (CB_datum)->asize = CB_DATUMUNIT; \
-  } while(FALSE)
-
-
-/* Alias of `cbdatumopen'.
-   However, `size' should not be negative. */
-#define CB_DATUMOPEN2(CB_datum, CB_ptr, CB_size) \
-  do { \
-    CB_DATUMOPEN((CB_datum)); \
-    CB_DATUMCAT((CB_datum), (CB_ptr), (CB_size)); \
-  } while(FALSE)
-
-
-/* Alias of `cbdatumclose'. */
-#define CB_DATUMCLOSE(CB_datum) \
-  do { \
-    free((CB_datum)->dptr); \
-    free((CB_datum)); \
-  } while(FALSE)
-
-
-/* Alias of `cbdatumcat'.
-   However, `size' should not be negative. */
-#define CB_DATUMCAT(CB_datum, CB_ptr, CB_size) \
-  do { \
-    if((CB_datum)->dsize + (CB_size) >= (CB_datum)->asize){ \
-      (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \
-      CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \
-    } \
-    memcpy((CB_datum)->dptr + (CB_datum)->dsize, (CB_ptr), (CB_size)); \
-    (CB_datum)->dsize += (CB_size); \
-    (CB_datum)->dptr[(CB_datum)->dsize] = '\0'; \
-  } while(FALSE)
-
-
-/* Alias of `cbdatumptr'. */
-#define CB_DATUMPTR(CB_datum) ((const char *)((CB_datum)->dptr))
-
-
-/* Alias of `cbdatumsize'. */
-#define CB_DATUMSIZE(CB_datum) ((int)((CB_datum)->dsize))
-
-
-/* Alias of `cbdatumsetsize'. */
-#define CB_DATUMSETSIZE(CB_datum, CB_size) \
-  do { \
-    if((CB_size) <= (CB_datum)->dsize){ \
-      (CB_datum)->dsize = (CB_size); \
-      (CB_datum)->dptr[(CB_size)] = '\0'; \
-    } else { \
-      if((CB_size) >= (CB_datum)->asize){ \
-        (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \
-        CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \
-      } \
-      memset((CB_datum)->dptr + (CB_datum)->dsize, 0, ((CB_size) - (CB_datum)->dsize) + 1); \
-      (CB_datum)->dsize = (CB_size); \
-    } \
-  } while(FALSE)
-
-
-/* Alias of `cbdatumtomalloc'. */
-#define CB_DATUMTOMALLOC(CB_datum, CB_ptr, CB_size) \
-  do { \
-    (CB_ptr) = (CB_datum)->dptr; \
-    (CB_size) = (CB_datum)->dsize; \
-    free((CB_datum)); \
-  } while(FALSE)
-
-
-/* Alias of `cblistopen'. */
-#define CB_LISTOPEN(CB_list) \
-  do { \
-    CB_MALLOC((CB_list), sizeof(*(CB_list))); \
-    (CB_list)->anum = CB_LISTUNIT; \
-    CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \
-    (CB_list)->start = 0; \
-    (CB_list)->num = 0; \
-  } while(FALSE)
-
-
-/* Alias of `cblistopen'.
-   However, `anum' is specified for the number of initial allocated elements. */
-#define CB_LISTOPEN2(CB_list, CB_anum) \
-  do { \
-    CB_MALLOC((CB_list), sizeof(*(CB_list))); \
-    (CB_list)->anum = (CB_anum) > 4 ? (CB_anum) : 4; \
-    CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \
-    (CB_list)->start = 0; \
-    (CB_list)->num = 0; \
-  } while(FALSE)
-
-
-/* Alias of `cblistclose'. */
-#define CB_LISTCLOSE(CB_list) \
-  do { \
-    int _CB_i, _CB_end; \
-    _CB_end = (CB_list)->start + (CB_list)->num; \
-    for(_CB_i = (CB_list)->start; _CB_i < _CB_end; _CB_i++){ \
-      free((CB_list)->array[_CB_i].dptr); \
-    } \
-    free((CB_list)->array); \
-    free((CB_list)); \
-  } while(FALSE)
-
-
-/* Alias of `cblistnum'. */
-#define CB_LISTNUM(CB_list) \
-  ((int)((CB_list)->num))
-
-
-/* Alias of `cblistval'.
-   However, `sp' is ignored. */
-#define CB_LISTVAL(CB_list, CB_index) \
-  ((const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr))
-
-
-/* Alias of `cblistval'.
-   However, `size' is used instead of `sp'. */
-#define CB_LISTVAL2(CB_list, CB_index, CB_size) \
-  ((CB_size) = (CB_list)->array[(CB_list)->start+(CB_index)].dsize, \
-  (const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr))
-
-
-/* Alias of `cblistpush'.
-   However, `size' should not be negative. */
-#define CB_LISTPUSH(CB_list, CB_ptr, CB_size) \
-  do { \
-    int _CB_index; \
-    _CB_index = (CB_list)->start + (CB_list)->num; \
-    if(_CB_index >= (CB_list)->anum){ \
-      (CB_list)->anum *= 2; \
-      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
-    } \
-    CB_MALLOC((CB_list)->array[_CB_index].dptr, \
-              ((CB_size) < CB_DATUMUNIT ? CB_DATUMUNIT : (CB_size)) + 1); \
-    memcpy((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \
-    (CB_list)->array[_CB_index].dptr[(CB_size)] = '\0'; \
-    (CB_list)->array[_CB_index].dsize = (CB_size); \
-    (CB_list)->num++; \
-  } while(FALSE)
-
-
-/* Remove and free an element of the end of a list.
-   `list' specifies a list handle. */
-#define CB_LISTDROP(CB_list) \
-  do { \
-    if((CB_list)->num > 0){ \
-      free((CB_list)->array[(CB_list)->start+(CB_list)->num-1].dptr); \
-      (CB_list)->num--; \
-    } \
-  } while(FALSE)
-
-
-/* Alias of `cblistinsert'.
-   However, `index' is not checked and `size' should not be negative. */
-#define CB_LISTINSERT(CB_list, CB_index, CB_ptr, CB_size) \
-  do { \
-    int _CB_index = (CB_index); \
-    _CB_index += (CB_list)->start; \
-    if((CB_list)->start + (CB_list)->num >= (CB_list)->anum){ \
-      (CB_list)->anum *= 2; \
-      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
-    } \
-    memmove((CB_list)->array + _CB_index + 1, (CB_list)->array + _CB_index, \
-            sizeof((CB_list)->array[0]) * ((CB_list)->start + (CB_list)->num - _CB_index)); \
-    CB_MEMDUP((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \
-    (CB_list)->array[_CB_index].dsize = (CB_size); \
-    (CB_list)->num++; \
-  } while(FALSE)
-
-
-/* Alias of `cblistpushbuf'. */
-#define CB_LISTPUSHBUF(CB_list, CB_ptr, CB_size) \
-  do{ \
-    int _CB_index; \
-    _CB_index = (CB_list)->start + (CB_list)->num; \
-    if(_CB_index >= (CB_list)->anum){ \
-      (CB_list)->anum *= 2; \
-      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
-    } \
-    (CB_list)->array[_CB_index].dptr = (CB_ptr); \
-    (CB_list)->array[_CB_index].dsize = (CB_size); \
-    (CB_list)->num++; \
-  } while(FALSE) \
-
-
-/* Alias of `cbmapiterval'.
-   However, `size' is used instead of `sp'. */
-#define CB_MAPITERVAL(CB_vbuf, CB_kbuf, CB_vsiz) \
-  do { \
-    CBMAPDATUM *_CB_datum; \
-    _CB_datum = (CBMAPDATUM *)((CB_kbuf) - sizeof(*_CB_datum)); \
-    (CB_vsiz) = _CB_datum->vsiz; \
-    (CB_vbuf) = (char *)_CB_datum + sizeof(*_CB_datum) + \
-      _CB_datum->ksiz + CB_ALIGNPAD(_CB_datum->ksiz); \
-  } while(FALSE)
-
-
-
-#undef MYEXTERN
-
-#if defined(__cplusplus)                 /* export for C++ */
-}
-#endif
-
-#endif                                   /* duplication check */
-
-
-/* END OF FILE */

Copied: box/trunk/qdbm/cabin.h (from rev 2716, box/trunk/qdbm/cabin.h)
===================================================================
--- box/trunk/qdbm/cabin.h	                        (rev 0)
+++ box/trunk/qdbm/cabin.h	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,1544 @@
+/*************************************************************************************************
+ * The utitlity API of QDBM
+ *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
+ * This file is part of QDBM, Quick Database Manager.
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
+ * Lesser General Public License as published by the Free Software Foundation; either version
+ * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
+ * details.
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ *************************************************************************************************/
+
+
+#ifndef _CABIN_H                         /* duplication check */
+#define _CABIN_H
+
+#if defined(__cplusplus)                 /* export for C++ */
+extern "C" {
+#endif
+
+
+#include <stdlib.h>
+#include <time.h>
+
+
+#if defined(_MSC_VER) && !defined(QDBM_INTERNAL) && !defined(QDBM_STATIC)
+#define MYEXTERN extern __declspec(dllimport)
+#else
+#define MYEXTERN extern
+#endif
+
+
+
+/*************************************************************************************************
+ * API
+ *************************************************************************************************/
+
+
+#define CB_DATUMUNIT   12                /* allocation unit size of a datum handle */
+#define CB_LISTUNIT    64                /* allocation unit number of a list handle */
+#define CB_MAPBNUM     4093              /* bucket size of a map handle */
+
+typedef struct {                         /* type of structure for a basic datum */
+  char *dptr;                            /* pointer to the region */
+  int dsize;                             /* size of the region */
+  int asize;                             /* size of the allocated region */
+} CBDATUM;
+
+typedef struct {                         /* type of structure for an element of a list */
+  char *dptr;                            /* pointer to the region */
+  int dsize;                             /* size of the effective region */
+} CBLISTDATUM;
+
+typedef struct {                         /* type of structure for a list */
+  CBLISTDATUM *array;                    /* array of data */
+  int anum;                              /* number of the elements of the array */
+  int start;                             /* start index of using elements */
+  int num;                               /* number of using elements */
+} CBLIST;
+
+typedef struct _CBMAPDATUM {             /* type of structure for an element of a map */
+  int ksiz;                              /* size of the region of the key */
+  int vsiz;                              /* size of the region of the value */
+  int hash;                              /* second hash value */
+  struct _CBMAPDATUM *left;              /* pointer to the left child */
+  struct _CBMAPDATUM *right;             /* pointer to the right child */
+  struct _CBMAPDATUM *prev;              /* pointer to the previous element */
+  struct _CBMAPDATUM *next;              /* pointer to the next element */
+} CBMAPDATUM;
+
+typedef struct {                         /* type of structure for a map */
+  CBMAPDATUM **buckets;                  /* bucket array */
+  CBMAPDATUM *first;                     /* pointer to the first element */
+  CBMAPDATUM *last;                      /* pointer to the last element */
+  CBMAPDATUM *cur;                       /* pointer to the current element */
+  int bnum;                              /* number of buckets */
+  int rnum;                              /* number of records */
+} CBMAP;
+
+typedef struct {                         /* type of structure for a heap */
+  char *base;                            /* base pointer */
+  char *swap;                            /* region for swapping */
+  int size;                              /* size of each record */
+  int num;                               /* currnet number of records */
+  int max;                               /* maximum number of records */
+  int(*compar)(const void *, const void *);  /* comparing function */
+} CBHEAP;
+
+
+/* Call back function for handling a fatal error.
+   The argument specifies the error message.  The initial value of this variable is `NULL'.
+   If the value is `NULL', the default function is called when a fatal error occurs. A fatal
+   error occurs when memory allocation is failed. */
+MYEXTERN void (*cbfatalfunc)(const char *);
+
+
+/* Allocate a region on memory.
+   `size' specifies the size of the region.
+   The return value is the pointer to the allocated region.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+void *cbmalloc(size_t size);
+
+
+/* Re-allocate a region on memory.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.
+   The return value is the pointer to the re-allocated region.
+   Because the region of the return value is allocated with the `realloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+void *cbrealloc(void *ptr, size_t size);
+
+
+/* Duplicate a region on memory.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the pointer to the allocated region of the duplicate.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if
+   it is no longer in use. */
+char *cbmemdup(const char *ptr, int size);
+
+
+/* Free a region on memory.
+   `ptr' specifies the pointer to a region.  If it is `NULL', this function has no effect.
+   Although this function is just a wrapper of `free' call, this is useful in applications using
+   another package of the `malloc' series. */
+void cbfree(void *ptr);
+
+
+/* Register the pointer or handle of an object to the global garbage collector.
+   `ptr' specifies the pointer or handle of an object.
+   `func' specifies the pointer to a function to release resources of the object.  Its argument
+   is the pointer or handle of the object to release.
+   This function assures that resources of an object are released when the process exits
+   normally by returning from the `main' function or calling the `exit' function. */
+void cbglobalgc(void *ptr, void (*func)(void *));
+
+
+/* Exercise the global garbage collector explicitly.
+   Note that you should not use objects registered to the global garbage collector any longer
+   after calling this function.  Because the global garbage collecter is initialized and you
+   can register new objects into it. */
+void cbggcsweep(void);
+
+
+/* Check availability of allocation of the virtual memory.
+   `size' specifies the size of region to be allocated newly.
+   The return value is true if allocation should be success, or false if not. */
+int cbvmemavail(size_t size);
+
+
+/* Sort an array using insert sort.
+   `base' spacifies the pointer to an array.
+   `nmemb' specifies the number of elements of the array.
+   `size' specifies the size of each element.
+   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
+   of elements.  The comparing function should returns positive if the former is big, negative
+   if the latter is big, 0 if both are equal.
+   Insert sort is useful only if most elements have been sorted already. */
+void cbisort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
+
+
+/* Sort an array using shell sort.
+   `base' spacifies the pointer to an array.
+   `nmemb' specifies the number of elements of the array.
+   `size' specifies the size of each element.
+   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
+   of elements.  The comparing function should returns positive if the former is big, negative
+   if the latter is big, 0 if both are equal.
+   If most elements have been sorted, shell sort may be faster than heap sort or quick sort. */
+void cbssort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
+
+
+/* Sort an array using heap sort.
+   `base' spacifies the pointer to an array.
+   `nmemb' specifies the number of elements of the array.
+   `size' specifies the size of each element.
+   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
+   of elements.  The comparing function should returns positive if the former is big, negative
+   if the latter is big, 0 if both are equal.
+   Although heap sort is robust against bias of input, quick sort is faster in most cases. */
+void cbhsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
+
+
+/* Sort an array using quick sort.
+   `base' spacifies the pointer to an array.
+   `nmemb' specifies the number of elements of the array.
+   `size' specifies the size of each element.
+   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
+   of elements.  The comparing function should returns positive if the former is big, negative
+   if the latter is big, 0 if both are equal.
+   Being sensitive to bias of input, quick sort is the fastest sorting algorithm. */
+void cbqsort(void *base, int nmemb, int size, int(*compar)(const void *, const void *));
+
+
+/* Compare two strings with case insensitive evaluation.
+   `astr' specifies the pointer of one string.
+   `astr' specifies the pointer of the other string.
+   The return value is positive if the former is big, negative if the latter is big, 0 if both
+   are equivalent.
+   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
+int cbstricmp(const char *astr, const char *bstr);
+
+
+/* Check whether a string begins with a key.
+   `str' specifies the pointer of a target string.
+   `key' specifies the pointer of a forward matching key string.
+   The return value is true if the target string begins with the key, else, it is false. */
+int cbstrfwmatch(const char *str, const char *key);
+
+
+/* Check whether a string begins with a key, with case insensitive evaluation.
+   `str' specifies the pointer of a target string.
+   `key' specifies the pointer of a forward matching key string.
+   The return value is true if the target string begins with the key, else, it is false.
+   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
+int cbstrfwimatch(const char *str, const char *key);
+
+
+/* Check whether a string ends with a key.
+   `str' specifies the pointer of a target string.
+   `key' specifies the pointer of a backward matching key string.
+   The return value is true if the target string ends with the key, else, it is false. */
+int cbstrbwmatch(const char *str, const char *key);
+
+
+/* Check whether a string ends with a key, with case insensitive evaluation.
+   `str' specifies the pointer of a target string.
+   `key' specifies the pointer of a backward matching key string.
+   The return value is true if the target string ends with the key, else, it is false.
+   Upper cases and lower cases of alphabets in ASCII code are not distinguished. */
+int cbstrbwimatch(const char *str, const char *key);
+
+
+/* Locate a substring in a string using KMP method.
+   `haystack' specifies the pointer of a target string.
+   `needle' specifies the pointer of a substring to be found.
+   The return value is the pointer to the beginning of the substring or `NULL' if the substring
+   is not found.
+   In most cases, `strstr' as a built-in function of the compiler is faster than this function. */
+char *cbstrstrkmp(const char *haystack, const char *needle);
+
+
+/* Locate a substring in a string using BM method.
+   `haystack' specifies the pointer of a target string.
+   `needle' specifies the pointer of a substring to be found.
+   The return value is the pointer to the beginning of the substring or `NULL' if the substring
+   is not found.
+   In most cases, `strstr' as a built-in function of the compiler is faster than this function. */
+char *cbstrstrbm(const char *haystack, const char *needle);
+
+
+/* Convert the letters of a string to upper case.
+   `str' specifies the pointer of a string to convert.
+   The return value is the pointer to the string. */
+char *cbstrtoupper(char *str);
+
+
+/* Convert the letters of a string to lower case.
+   `str' specifies the pointer of a string to convert.
+   The return value is the pointer to the string. */
+char *cbstrtolower(char *str);
+
+
+/* Cut space characters at head or tail of a string.
+   `str' specifies the pointer of a string to convert.
+   The return value is the pointer to the string. */
+char *cbstrtrim(char *str);
+
+
+/* Squeeze space characters in a string and trim it.
+   `str' specifies the pointer of a string to convert.
+   The return value is the pointer to the string. */
+char *cbstrsqzspc(char *str);
+
+
+/* Count the number of characters in a string of UTF-8.
+   `str' specifies the pointer of a string of UTF-8.
+   The return value is the number of characters in the string. */
+int cbstrcountutf(const char *str);
+
+
+/* Cut a string of UTF-8 at the specified number of characters.
+   `str' specifies the pointer of a string of UTF-8.
+   `num' specifies the number of characters to be kept.
+   The return value is the pointer to the string. */
+char *cbstrcututf(char *str, int num);
+
+
+/* Get a datum handle.
+   `ptr' specifies the pointer to the region of the initial content.  If it is `NULL', an empty
+   datum is created.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is a datum handle. */
+CBDATUM *cbdatumopen(const char *ptr, int size);
+
+
+/* Copy a datum.
+   `datum' specifies a datum handle.
+   The return value is a new datum handle. */
+CBDATUM *cbdatumdup(const CBDATUM *datum);
+
+
+/* Free a datum handle.
+   `datum' specifies a datum handle.
+   Because the region of a closed handle is released, it becomes impossible to use the handle. */
+void cbdatumclose(CBDATUM *datum);
+
+
+/* Concatenate a datum and a region.
+   `datum' specifies a datum handle.
+   `ptr' specifies the pointer to the region to be appended.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'. */
+void cbdatumcat(CBDATUM *datum, const char *ptr, int size);
+
+
+/* Get the pointer of the region of a datum.
+   `datum' specifies a datum handle.
+   The return value is the pointer of the region of a datum.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string. */
+const char *cbdatumptr(const CBDATUM *datum);
+
+
+/* Get the size of the region of a datum.
+   `datum' specifies a datum handle.
+   The return value is the size of the region of a datum. */
+int cbdatumsize(const CBDATUM *datum);
+
+
+/* Change the size of the region of a datum.
+   `datum' specifies a datum handle.
+   `size' specifies the new size of the region.
+   If the new size is bigger than the one of old, the surplus region is filled with zero codes. */
+void cbdatumsetsize(CBDATUM *datum, int size);
+
+
+/* Perform formatted output into a datum.
+   `format' specifies a printf-like format string.
+   The conversion character `%' can be used with such flag characters as `s', `d', `o', `u',
+   `x', `X', `c', `e', `E', `f', `g', `G', `@', `?', `:', `%'.  `@' works as with `s' but escapes
+   meta characters of XML.  `?' works as with `s' but escapes meta characters of URL.  `:' works
+   as with `s' but performs MIME encoding as UTF-8.  The other conversion character work as with
+   each original. */
+void cbdatumprintf(CBDATUM *datum, const char *format, ...);
+
+
+/* Convert a datum to an allocated region.
+   `datum' specifies a datum handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the datum.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  Because the region of the original datam is released, it should not be
+   released again. */
+char *cbdatumtomalloc(CBDATUM *datum, int *sp);
+
+
+/* Get a list handle.
+   The return value is a list handle. */
+CBLIST *cblistopen(void);
+
+
+/* Copy a list.
+   `list' specifies a list handle.
+   The return value is a new list handle. */
+CBLIST *cblistdup(const CBLIST *list);
+
+
+/* Close a list handle.
+   `list' specifies a list handle.
+   Because the region of a closed handle is released, it becomes impossible to use the handle. */
+void cblistclose(CBLIST *list);
+
+
+/* Get the number of elements of a list.
+   `list' specifies a list handle.
+   The return value is the number of elements of the list. */
+int cblistnum(const CBLIST *list);
+
+
+/* Get the pointer to the region of an element of a list.
+   `list' specifies a list handle.
+   `index' specifies the index of an element.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the value.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  If `index' is equal to or more than
+   the number of elements, the return value is `NULL'. */
+const char *cblistval(const CBLIST *list, int index, int *sp);
+
+
+/* Add an element at the end of a list.
+   `list' specifies a list handle.
+   `ptr' specifies the pointer to the region of an element.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'. */
+void cblistpush(CBLIST *list, const char *ptr, int size);
+
+
+/* Remove an element of the end of a list.
+   `list' specifies a list handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the value.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  If the list is empty, the return value is `NULL'. */
+char *cblistpop(CBLIST *list, int *sp);
+
+
+/* Add an element at the top of a list.
+   `list' specifies a list handle.
+   `ptr' specifies the pointer to the region of an element.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'. */
+void cblistunshift(CBLIST *list, const char *ptr, int size);
+
+
+/* Remove an element of the top of a list.
+   `list' specifies a list handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the value.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  If the list is empty, the return value is `NULL'. */
+char *cblistshift(CBLIST *list, int *sp);
+
+
+/* Add an element at the specified location of a list.
+   `list' specifies a list handle.
+   `index' specifies the index of an element.
+   `ptr' specifies the pointer to the region of the element.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'. */
+void cblistinsert(CBLIST *list, int index, const char *ptr, int size);
+
+
+/* Remove an element at the specified location of a list.
+   `list' specifies a list handle.
+   `index' specifies the index of an element.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the value.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  If `index' is equal to or more than the number of elements, no element
+   is removed and the return value is `NULL'. */
+char *cblistremove(CBLIST *list, int index, int *sp);
+
+
+/* Overwrite an element at the specified location of a list.
+   `list' specifies a list handle.
+   `index' specifies the index of an element.
+   `ptr' specifies the pointer to the region of the new content.
+   `size' specifies the size of the new content.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   If `index' is equal to or more than the number of elements, this function has no effect. */
+void cblistover(CBLIST *list, int index, const char *ptr, int size);
+
+
+/* Sort elements of a list in lexical order.
+   `list' specifies a list handle.
+   Quick sort is used for sorting. */
+void cblistsort(CBLIST *list);
+
+
+/* Search a list for an element using liner search.
+   `list' specifies a list handle.
+   `ptr' specifies the pointer to the region of a key.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the index of a corresponding element or -1 if there is no corresponding
+   element.  If two or more elements corresponds, the former returns. */
+int cblistlsearch(const CBLIST *list, const char *ptr, int size);
+
+
+/* Search a list for an element using binary search.
+   `list' specifies a list handle.  It should be sorted in lexical order.
+   `ptr' specifies the pointer to the region of a key.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the index of a corresponding element or -1 if there is no corresponding
+   element.  If two or more elements corresponds, which returns is not defined. */
+int cblistbsearch(const CBLIST *list, const char *ptr, int size);
+
+
+/* Serialize a list into a byte array.
+   `list' specifies a list handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   The return value is the pointer to the region of the result serial region.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cblistdump(const CBLIST *list, int *sp);
+
+
+/* Redintegrate a serialized list.
+   `ptr' specifies the pointer to a byte array.
+   `size' specifies the size of the region.
+   The return value is a new list handle. */
+CBLIST *cblistload(const char *ptr, int size);
+
+
+/* Get a map handle.
+   The return value is a map handle. */
+CBMAP *cbmapopen(void);
+
+
+/* Copy a map.
+   `map' specifies a map handle.
+   The return value is a new map handle.
+   The iterator of the source map is initialized. */
+CBMAP *cbmapdup(CBMAP *map);
+
+
+/* Close a map handle.
+   `map' specifies a map handle.
+   Because the region of a closed handle is released, it becomes impossible to use the handle. */
+void cbmapclose(CBMAP *map);
+
+
+/* Store a record into a map.
+   `map' specifies a map handle.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   `vbuf' specifies the pointer to the region of a value.
+   `vsiz' specifies the size of the region of the value.  If it is negative, the size is
+   assigned with `strlen(vbuf)'.
+   `over' specifies whether the value of the duplicated record is overwritten or not.
+   If `over' is false and the key is duplicated, the return value is false, else, it is true. */
+int cbmapput(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int over);
+
+
+/* Concatenate a value at the end of the value of the existing record.
+   `map' specifies a map handle.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   `vbuf' specifies the pointer to the region of a value.
+   `vsiz' specifies the size of the region of the value.  If it is negative, the size is
+   assigned with `strlen(vbuf)'.
+   If there is no corresponding record, a new record is created. */
+void cbmapputcat(CBMAP *map, const char *kbuf, int ksiz, const char *vbuf, int vsiz);
+
+
+/* Delete a record in a map.
+   `map' specifies a map handle.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   If successful, the return value is true.  False is returned when no record corresponds to
+   the specified key. */
+int cbmapout(CBMAP *map, const char *kbuf, int ksiz);
+
+
+/* Retrieve a record in a map.
+   `map' specifies a map handle.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the region of the value of the
+   corresponding record.  `NULL' is returned when no record corresponds.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string. */
+const char *cbmapget(const CBMAP *map, const char *kbuf, int ksiz, int *sp);
+
+
+/* Move a record to the edge of a map.
+   `map' specifies a map handle.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   `head' specifies the destination which is head if it is true or tail if else.
+   If successful, the return value is true.  False is returned when no record corresponds to
+   the specified key. */
+int cbmapmove(CBMAP *map, const char *kbuf, int ksiz, int head);
+
+
+/* Initialize the iterator of a map.
+   `map' specifies a map handle.
+   The iterator is used in order to access the key of every record stored in a map. */
+void cbmapiterinit(CBMAP *map);
+
+
+/* Get the next key of the iterator of a map.
+   `map' specifies a map handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the region of the next key, else, it is
+   `NULL'.  `NULL' is returned when no record is to be get out of the iterator.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  The order of iteration is assured
+   to be the same of the one of storing. */
+const char *cbmapiternext(CBMAP *map, int *sp);
+
+
+/* Get the value binded to the key fetched from the iterator of a map.
+   `kbuf' specifies the pointer to the region of a iteration key.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the value of the corresponding record.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string. */
+const char *cbmapiterval(const char *kbuf, int *sp);
+
+
+/* Get the number of the records stored in a map.
+   `map' specifies a map handle.
+   The return value is the number of the records stored in the map. */
+int cbmaprnum(const CBMAP *map);
+
+
+/* Get the list handle contains all keys in a map.
+   `map' specifies a map handle.
+   The return value is the list handle contains all keys in the map.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbmapkeys(CBMAP *map);
+
+
+/* Get the list handle contains all values in a map.
+   `map' specifies a map handle.
+   The return value is the list handle contains all values in the map.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbmapvals(CBMAP *map);
+
+
+/* Serialize a map into a byte array.
+   `map' specifies a map handle.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   The return value is the pointer to the region of the result serial region.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbmapdump(CBMAP *map, int *sp);
+
+
+/* Redintegrate a serialized map.
+   `ptr' specifies the pointer to a byte array.
+   `size' specifies the size of the region.
+   The return value is a new map handle. */
+CBMAP *cbmapload(const char *ptr, int size);
+
+
+/* Extract a record from a serialized map.
+   `ptr' specifies the pointer to a byte array.
+   `size' specifies the size of the region.
+   `kbuf' specifies the pointer to the region of a key.
+   `ksiz' specifies the size of the region of the key.  If it is negative, the size is assigned
+   with `strlen(kbuf)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the region of the value of the
+   corresponding record.  `NULL' is returned when no record corresponds.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string. */
+char *cbmaploadone(const char *ptr, int size, const char *kbuf, int ksiz, int *sp);
+
+
+/* Get a heap handle.
+   `size' specifies the size of each record.
+   `max' specifies the maximum number of records in the heap.
+   `compar' specifies the pointer to comparing function.  The two arguments specify the pointers
+   of records.  The comparing function should returns positive if the former is big, negative
+   if the latter is big, 0 if both are equal.
+   The return value is a heap handle. */
+CBHEAP *cbheapopen(int size, int max, int(*compar)(const void *, const void *));
+
+
+/* Copy a heap.
+   `heap' specifies a heap handle.
+   The return value is a new heap handle. */
+CBHEAP *cbheapdup(CBHEAP *heap);
+
+
+/* Close a heap handle.
+   `heap' specifies a heap handle.
+   Because the region of a closed handle is released, it becomes impossible to use the handle. */
+void cbheapclose(CBHEAP *heap);
+
+
+/* Get the number of the records stored in a heap.
+   `heap' specifies a heap handle.
+   The return value is the number of the records stored in the heap. */
+int cbheapnum(CBHEAP *heap);
+
+
+/* Insert a record into a heap.
+   `heap' specifies a heap handle.
+   `ptr' specifies the pointer to the region of a record.
+   The return value is true if the record is added, else false.
+   If the new record is bigger than the biggest existing regord, the new record is not added.
+   If the new record is added and the number of records exceeds the maximum number, the biggest
+   existing record is removed. */
+int cbheapinsert(CBHEAP *heap, const void *ptr);
+
+
+/* Get the pointer to the region of a record in a heap.
+   `heap' specifies a heap handle.
+   `index' specifies the index of a record.
+   The return value is the pointer to the region of the record.
+   If `index' is equal to or more than the number of records, the return value is `NULL'.  Note
+   that records are organized by the nagative order the comparing function. */
+const void *cbheapval(CBHEAP *heap, int index);
+
+
+/* Convert a heap to an allocated region.
+   `heap' specifies a heap handle.
+   `np' specifies the pointer to a variable to which the number of records of the return value
+   is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the heap.  Records are sorted.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use.  Because the region of the original
+   heap is released, it should not be released again. */
+void *cbheaptomalloc(CBHEAP *heap, int *np);
+
+
+/* Allocate a formatted string on memory.
+   `format' specifies a printf-like format string.  The conversion character `%' can be used
+   with such flag characters as `d', `o', `u', `x', `X', `e', `E', `f', `g', `G', `c', `s', and
+   `%'.  Specifiers of the field length and the precision can be put between the conversion
+   characters and the flag characters.  The specifiers consist of decimal characters, `.', `+',
+   `-', and the space character.
+   The other arguments are used according to the format string.
+   The return value is the pointer to the allocated region of the result string.  Because the
+   region of the return value is allocated with the `malloc' call, it should be released with
+   the `free' call if it is no longer in use. */
+char *cbsprintf(const char *format, ...);
+
+
+/* Replace some patterns in a string.
+   `str' specifies the pointer to a source string.
+   `pairs' specifies the handle of a map composed of pairs of replacement.  The key of each pair
+   specifies a pattern before replacement and its value specifies the pattern after replacement.
+   The return value is the pointer to the allocated region of the result string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbreplace(const char *str, CBMAP *pairs);
+
+
+/* Make a list by splitting a serial datum.
+   `ptr' specifies the pointer to the region of the source content.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `delim' specifies a string containing delimiting characters.  If it is `NULL', zero code is
+   used as a delimiter.
+   The return value is a list handle.
+   If two delimiters are successive, it is assumed that an empty element is between the two.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose'. */
+CBLIST *cbsplit(const char *ptr, int size, const char *delim);
+
+
+/* Read whole data of a file.
+   `name' specifies the name of a file.  If it is `NULL', the standard input is specified.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the allocated region of the read data.  Because an
+   additional zero code is appended at the end of the region of the return value, the return
+   value can be treated as a character string.  Because the region of the return value is
+   allocated with the `malloc' call, it should be released with the `free' call if it is no
+   longer in use.  */
+char *cbreadfile(const char *name, int *sp);
+
+
+/* Write a serial datum into a file.
+   `name specifies the name of a file.  If it is `NULL', the standard output is specified.
+   `ptr' specifies the pointer to the region of the source content.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   If successful, the return value is true, else, it is false.
+   If the file exists, it is overwritten.  Else, a new file is created. */
+int cbwritefile(const char *name, const char *ptr, int size);
+
+
+/* Read every line of a file.
+   `name' specifies the name of a file.  If it is `NULL', the standard input is specified.
+   The return value is a list handle of the lines if successful, else it is NULL.  Line
+   separators are cut out.  Because the handle of the return value is opened with the function
+   `cblistopen', it should be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbreadlines(const char *name);
+
+
+/* Read names of files in a directory.
+   `name' specifies the name of a directory.
+   The return value is a list handle of names if successful, else it is NULL.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbdirlist(const char *name);
+
+
+/* Get the status of a file or a directory.
+   `name' specifies the name of a file or a directory.
+   `dirp' specifies the pointer to a variable to which whether the file is a directory is
+   assigned.  If it is `NULL', it is not used.
+   `sizep' specifies the pointer to a variable to which the size of the file is assigned.  If it
+   is `NULL', it is not used.
+   `mtimep' specifies the pointer to a variable to which the last modified time of the file is
+   assigned.  If it is `NULL', it is not used.
+   If successful, the return value is true, else, false.  False is returned when the file does
+   not exist or the permission is denied. */
+int cbfilestat(const char *name, int *isdirp, int *sizep, time_t *mtimep);
+
+
+/* Remove a file or a directory and its sub ones recursively.
+   `name' specifies the name of a file or a directory.
+   If successful, the return value is true, else, false.  False is returned when the file does
+   not exist or the permission is denied. */
+int cbremove(const char *name);
+
+
+/* Break up a URL into elements.
+   `str' specifies the pointer to a string of URL.
+   The return value is a map handle.  Each key of the map is the name of an element.  The key
+   "self" specifies the URL itself.  The key "scheme" specifies the scheme.  The key "host"
+   specifies the host of the server.  The key "port" specifies the port number of the server.
+   The key "authority" specifies the authority information.  The key "path" specifies the path
+   of the resource.  The key "file" specifies the file name without the directory section.  The
+   key "query" specifies the query string.  The key "fragment" specifies the fragment string.
+   Supported schema are HTTP, HTTPS, FTP, and FILE.  Absolute URL and relative URL are supported.
+   Because the handle of the return value is opened with the function `cbmapopen', it should
+   be closed with the function `cbmapclose' if it is no longer in use. */
+CBMAP *cburlbreak(const char *str);
+
+
+/* Resolve a relative URL with another absolute URL.
+   `base' specifies an absolute URL of a base location.
+   `target' specifies a URL to be resolved.
+   The return value is a resolved URL.  If the target URL is relative, a new URL of relative
+   location from the base location is returned.  Else, a copy of the target URL is returned.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cburlresolve(const char *base, const char *target);
+
+
+/* Encode a serial object with URL encoding.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the pointer to the result string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cburlencode(const char *ptr, int size);
+
+
+/* Decode a string encoded with URL encoding.
+   `str' specifies the pointer to an encoded string.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the result.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if
+   it is no longer in use. */
+char *cburldecode(const char *str, int *sp);
+
+
+/* Encode a serial object with Base64 encoding.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the pointer to the result string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbbaseencode(const char *ptr, int size);
+
+
+/* Decode a string encoded with Base64 encoding.
+   `str' specifies the pointer to an encoded string.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the result.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if
+   it is no longer in use. */
+char *cbbasedecode(const char *str, int *sp);
+
+
+/* Encode a serial object with quoted-printable encoding.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the pointer to the result string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbquoteencode(const char *ptr, int size);
+
+
+/* Decode a string encoded with quoted-printable encoding.
+   `str' specifies the pointer to an encoded string.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer to the region of the result.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if
+   it is no longer in use. */
+char *cbquotedecode(const char *str, int *sp);
+
+
+/* Split a string of MIME into headers and the body.
+   `ptr' specifies the pointer to the region of MIME data.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `attrs' specifies a map handle to store attributes.  If it is `NULL', it is not used.  Each
+   key of the map is an attribute name uncapitalized.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   The return value is the pointer of the body data.
+   If the content type is defined, the attribute map has the key "TYPE" specifying the type.  If
+   the character encoding is defined, the key "CHARSET" specifies the encoding name.  If the
+   boundary string of multipart is defined, the key "BOUNDARY" specifies the string.  If the
+   content disposition is defined, the key "DISPOSITION" specifies the direction.  If the file
+   name is defined, the key "FILENAME" specifies the name.  If the attribute name is defined,
+   the key "NAME" specifies the name.  Because the region of the return value is allocated with
+   the `malloc' call, it should be released with the `free' call if it is no longer in use. */
+char *cbmimebreak(const char *ptr, int size, CBMAP *attrs, int *sp);
+
+
+/* Split multipart data of MIME into its parts.
+   `ptr' specifies the pointer to the region of multipart data of MIME.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `boundary' specifies the pointer to the region of the boundary string.
+   The return value is a list handle.  Each element of the list is the string of a part.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbmimeparts(const char *ptr, int size, const char *boundary);
+
+
+/* Encode a string with MIME encoding.
+   `str' specifies the pointer to a string.
+   `encname' specifies a string of the name of the character encoding.
+   The return value is the pointer to the result string.
+   `base' specifies whether to use Base64 encoding.  If it is false, quoted-printable is used.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbmimeencode(const char *str, const char *encname, int base);
+
+
+/* Decode a string encoded with MIME encoding.
+   `str' specifies the pointer to an encoded string.
+   `enp' specifies the pointer to a region into which the name of encoding is written.  If it is
+   `NULL', it is not used.  The size of the buffer should be equal to or more than 32 bytes.
+   The return value is the pointer to the result string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbmimedecode(const char *str, char *enp);
+
+
+/* Split a string of CSV into rows.
+   `str' specifies the pointer to the region of an CSV string.
+   The return value is a list handle.  Each element of the list is a string of a row.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use.  The character encoding
+   of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS.  Being
+   compatible with MS-Excel, these functions for CSV can handle cells including such meta
+   characters as comma, between double quotation marks. */
+CBLIST *cbcsvrows(const char *str);
+
+
+/* Split the string of a row of CSV into cells.
+   `str' specifies the pointer to the region of a row of CSV.
+   The return value is a list handle.  Each element of the list is the unescaped string of a
+   cell of the row.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use. */
+CBLIST *cbcsvcells(const char *str);
+
+
+/* Escape a string with the meta characters of CSV.
+   `str' specifies the pointer to the region of a string.
+   The return value is the pointer to the escaped string sanitized of meta characters.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbcsvescape(const char *str);
+
+
+/* Unescape a string with the escaped meta characters of CSV.
+   `str' specifies the pointer to the region of a string with meta characters.
+   The return value is the pointer to the unescaped string.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbcsvunescape(const char *str);
+
+
+/* Split a string of XML into tags and text sections.
+   `str' specifies the pointer to the region of an XML string.
+   `cr' specifies whether to remove comments.
+   The return value is a list handle.  Each element of the list is the string of a tag or a
+   text section.
+   Because the handle of the return value is opened with the function `cblistopen', it should
+   be closed with the function `cblistclose' if it is no longer in use.  The character encoding
+   of the input string should be US-ASCII, UTF-8, ISO-8859-*, EUC-*, or Shift_JIS.  Because
+   these functions for XML are not XML parser with validation check, it can handle also HTML
+   and SGML. */
+CBLIST *cbxmlbreak(const char *str, int cr);
+
+
+/* Get the map of attributes of an XML tag.
+   `str' specifies the pointer to the region of a tag string.
+   The return value is a map handle.  Each key of the map is the name of an attribute.  Each
+   value is unescaped.  You can get the name of the tag with the key of an empty string.
+   Because the handle of the return value is opened with the function `cbmapopen', it should
+   be closed with the function `cbmapclose' if it is no longer in use. */
+CBMAP *cbxmlattrs(const char *str);
+
+
+/* Escape a string with the meta characters of XML.
+   `str' specifies the pointer to the region of a string.
+   The return value is the pointer to the escaped string sanitized of meta characters.
+   This function converts only `&', `<', `>', and `"'.  Because the region of the return value
+   is allocated with the `malloc' call, it should be released with the `free' call if it is no
+   longer in use. */
+char *cbxmlescape(const char *str);
+
+
+/* Unescape a string with the entity references of XML.
+   `str' specifies the pointer to the region of a string with meta characters.
+   The return value is the pointer to the unescaped string.
+   This function restores only `&', `<', `>', and `"'.  Because the region of the
+   return value is allocated with the `malloc' call, it should be released with the `free' call
+   if it is no longer in use. */
+char *cbxmlunescape(const char *str);
+
+
+/* Compress a serial object with ZLIB.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use.  This function is available only if
+   QDBM was built with ZLIB enabled. */
+char *cbdeflate(const char *ptr, int size, int *sp);
+
+
+/* Decompress a serial object compressed with ZLIB.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  This function is available only if QDBM was built with ZLIB enabled. */
+char *cbinflate(const char *ptr, int size, int *sp);
+
+
+/* Compress a serial object with GZIP.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use.  This function is available only if
+   QDBM was built with ZLIB enabled. */
+char *cbgzencode(const char *ptr, int size, int *sp);
+
+
+/* Decompress a serial object compressed with GZIP.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  This function is available only if QDBM was built with ZLIB enabled. */
+char *cbgzdecode(const char *ptr, int size, int *sp);
+
+
+/* Get the CRC32 checksum of a serial object.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the CRC32 checksum of the object.
+   This function is available only if QDBM was built with ZLIB enabled. */
+unsigned int cbgetcrc(const char *ptr, int size);
+
+
+/* Compress a serial object with LZO.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use.  This function is available only if
+   QDBM was built with LZO enabled. */
+char *cblzoencode(const char *ptr, int size, int *sp);
+
+
+/* Decompress a serial object compressed with LZO.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  This function is available only if QDBM was built with LZO enabled. */
+char *cblzodecode(const char *ptr, int size, int *sp);
+
+
+/* Compress a serial object with BZIP2.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use.  This function is available only if
+   QDBM was built with LZO enabled. */
+char *cbbzencode(const char *ptr, int size, int *sp);
+
+
+/* Decompress a serial object compressed with BZIP2.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  This function is available only if QDBM was built with LZO enabled. */
+char *cbbzdecode(const char *ptr, int size, int *sp);
+
+
+/* Convert the character encoding of a string.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   `icode' specifies the name of encoding of the input string.
+   `ocode' specifies the name of encoding of the output string.
+   `sp' specifies the pointer to a variable to which the size of the region of the return
+   value is assigned.  If it is `NULL', it is not used.
+   `mp' specifies the pointer to a variable to which the number of missing characters by failure
+   of conversion is assigned.  If it is `NULL', it is not used.
+   If successful, the return value is the pointer to the result object, else, it is `NULL'.
+   Because an additional zero code is appended at the end of the region of the return value,
+   the return value can be treated as a character string.  Because the region of the return
+   value is allocated with the `malloc' call, it should be released with the `free' call if it
+   is no longer in use.  This function is available only if QDBM was built with ICONV enabled. */
+char *cbiconv(const char *ptr, int size, const char *icode, const char *ocode, int *sp, int *mp);
+
+
+/* Detect the encoding of a string automatically.
+   `ptr' specifies the pointer to a region.
+   `size' specifies the size of the region.  If it is negative, the size is assigned with
+   `strlen(ptr)'.
+   The return value is the string of the encoding name of the string.
+   As it stands, US-ASCII, ISO-2022-JP, Shift_JIS, CP932, EUC-JP, UTF-8, UTF-16, UTF-16BE,
+   and UTF-16LE are supported.  If none of them matches, ISO-8859-1 is selected.  This function
+   is available only if QDBM was built with ICONV enabled. */
+const char *cbencname(const char *ptr, int size);
+
+
+/* Get the jet lag of the local time in seconds.
+   The return value is the jet lag of the local time in seconds. */
+int cbjetlag(void);
+
+
+/* Get the Gregorian calendar of a time.
+   `t' specifies a source time.  If it is negative, the current time is specified.
+   `jl' specifies the jet lag of a location in seconds.
+   `yearp' specifies the pointer to a variable to which the year is assigned.  If it is `NULL',
+   it is not used.
+   `monp' specifies the pointer to a variable to which the month is assigned.  If it is `NULL',
+   it is not used.  1 means January and 12 means December.
+   `dayp' specifies the pointer to a variable to which the day of the month is assigned.  If it
+   is `NULL', it is not used.
+   `hourp' specifies the pointer to a variable to which the hours is assigned.  If it is `NULL',
+   it is not used.
+   `minp' specifies the pointer to a variable to which the minutes is assigned.  If it is `NULL',
+   it is not used.
+   `secp' specifies the pointer to a variable to which the seconds is assigned.  If it is `NULL',
+   it is not used. */
+void cbcalendar(time_t t, int jl, int *yearp, int *monp, int *dayp,
+                int *hourp, int *minp, int *secp);
+
+
+/* Get the day of week of a date.
+   `year' specifies the year of a date.
+   `mon' specifies the month of the date.
+   `day' specifies the day of the date.
+   The return value is the day of week of the date.  0 means Sunday and 6 means Saturday. */
+int cbdayofweek(int year, int mon, int day);
+
+
+/* Get the string for a date in W3CDTF.
+   `t' specifies a source time.  If it is negative, the current time is specified.
+   `jl' specifies the jet lag of a location in seconds.
+   The return value is the string of the date in W3CDTF (YYYY-MM-DDThh:mm:ddTZD).
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbdatestrwww(time_t t, int jl);
+
+
+/* Get the string for a date in RFC 1123 format.
+   `t' specifies a source time.  If it is negative, the current time is specified.
+   `jl' specifies the jet lag of a location in seconds.
+   The return value is the string of the date in RFC 1123 format (Wdy, DD-Mon-YYYY hh:mm:dd TZD).
+   Because the region of the return value is allocated with the `malloc' call, it should be
+   released with the `free' call if it is no longer in use. */
+char *cbdatestrhttp(time_t t, int jl);
+
+
+/* Get the time value of a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123).
+   `str' specifies a date string in decimal, hexadecimal, W3CDTF, or RFC 822 (1123).
+   The return value is the time value of the date or -1 if the format is invalid.
+   Decimal can be trailed by "s" for in seconds, "m" for in minutes, "h" for in hours,
+   and "d" for in days. */
+time_t cbstrmktime(const char *str);
+
+
+/* Get user and system processing times.
+   `usrp' specifies the pointer to a variable to which the user processing time is assigned.
+   If it is `NULL', it is not used.  The unit of time is seconds.
+   `sysp' specifies the pointer to a variable to which the system processing time is assigned.
+   If it is `NULL', it is not used.  The unit of time is seconds. */
+void cbproctime(double *usrp, double *sysp);
+
+
+/* Ensure that the standard I/O is binary mode.
+   This function is useful for applications on dosish file systems. */
+void cbstdiobin(void);
+
+
+
+/*************************************************************************************************
+ * features for experts
+ *************************************************************************************************/
+
+
+/* Show error message on the standard error output and exit.
+   `message' specifies an error message.
+   This function does not return. */
+void *cbmyfatal(const char *message);
+
+
+/* Create a datum handle from an allocated region.
+   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
+   malloc and it is released by the function.
+   `size' specifies the size of the region. */
+CBDATUM *cbdatumopenbuf(char *ptr, int size);
+
+
+/* Set a buffer to a datum handle.
+   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
+   malloc and it is released by the function.
+   `size' specifies the size of the region. */
+void cbdatumsetbuf(CBDATUM *datum, char *ptr, int size);
+
+
+/* Add an allocated element at the end of a list.
+   `list' specifies a list handle.
+   `ptr' specifies the pointer to the region of an element.  The region should be allocated with
+   malloc and it is released by the function.
+   `size' specifies the size of the region. */
+void cblistpushbuf(CBLIST *list, char *ptr, int size);
+
+
+/* Get a map handle with specifying the number of buckets.
+   `bnum' specifies the number of buckets.
+   The return value is a map handle. */
+CBMAP *cbmapopenex(int bnum);
+
+
+/* Alias of `cbmalloc'. */
+#define CB_MALLOC(CB_ptr, CB_size) \
+  (((CB_ptr) = malloc(CB_size)) ? (CB_ptr) : cbmyfatal("out of memory"))
+
+
+/* Alias of `cbrealloc'. */
+#define CB_REALLOC(CB_ptr, CB_size) \
+  (((CB_ptr) = realloc((CB_ptr), (CB_size))) ? (CB_ptr) : cbmyfatal("out of memory"))
+
+
+/* Alias of `cbmemdup'.
+   However, `size' should not be negative. */
+#define CB_MEMDUP(CB_res, CB_ptr, CB_size) \
+  do { \
+    CB_MALLOC((CB_res), (CB_size) + 1); \
+    memcpy((CB_res), (CB_ptr), (CB_size)); \
+    (CB_res)[(CB_size)] = '\0'; \
+  } while(FALSE)
+
+
+/* Get the size of padding bytes for pointer alignment.
+   `hsiz' specifies the header size of the object.
+   The return value is the size of padding bytes. */
+#define CB_ALIGNPAD(CB_hsiz) \
+  (((CB_hsiz | ~-(int)sizeof(void *)) + 1) - CB_hsiz)
+
+
+/* Alias of `cbdatumopen'.
+   However, no dafault data is specified. */
+#define CB_DATUMOPEN(CB_datum) \
+  do { \
+    CB_MALLOC((CB_datum), sizeof(*(CB_datum))); \
+    CB_MALLOC((CB_datum)->dptr, CB_DATUMUNIT); \
+    (CB_datum)->dptr[0] = '\0'; \
+    (CB_datum)->dsize = 0; \
+    (CB_datum)->asize = CB_DATUMUNIT; \
+  } while(FALSE)
+
+
+/* Alias of `cbdatumopen'.
+   However, `size' should not be negative. */
+#define CB_DATUMOPEN2(CB_datum, CB_ptr, CB_size) \
+  do { \
+    CB_DATUMOPEN((CB_datum)); \
+    CB_DATUMCAT((CB_datum), (CB_ptr), (CB_size)); \
+  } while(FALSE)
+
+
+/* Alias of `cbdatumclose'. */
+#define CB_DATUMCLOSE(CB_datum) \
+  do { \
+    free((CB_datum)->dptr); \
+    free((CB_datum)); \
+  } while(FALSE)
+
+
+/* Alias of `cbdatumcat'.
+   However, `size' should not be negative. */
+#define CB_DATUMCAT(CB_datum, CB_ptr, CB_size) \
+  do { \
+    if((CB_datum)->dsize + (CB_size) >= (CB_datum)->asize){ \
+      (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \
+      CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \
+    } \
+    memcpy((CB_datum)->dptr + (CB_datum)->dsize, (CB_ptr), (CB_size)); \
+    (CB_datum)->dsize += (CB_size); \
+    (CB_datum)->dptr[(CB_datum)->dsize] = '\0'; \
+  } while(FALSE)
+
+
+/* Alias of `cbdatumptr'. */
+#define CB_DATUMPTR(CB_datum) ((const char *)((CB_datum)->dptr))
+
+
+/* Alias of `cbdatumsize'. */
+#define CB_DATUMSIZE(CB_datum) ((int)((CB_datum)->dsize))
+
+
+/* Alias of `cbdatumsetsize'. */
+#define CB_DATUMSETSIZE(CB_datum, CB_size) \
+  do { \
+    if((CB_size) <= (CB_datum)->dsize){ \
+      (CB_datum)->dsize = (CB_size); \
+      (CB_datum)->dptr[(CB_size)] = '\0'; \
+    } else { \
+      if((CB_size) >= (CB_datum)->asize){ \
+        (CB_datum)->asize = (CB_datum)->asize * 2 + (CB_size) + 1; \
+        CB_REALLOC((CB_datum)->dptr, (CB_datum)->asize); \
+      } \
+      memset((CB_datum)->dptr + (CB_datum)->dsize, 0, ((CB_size) - (CB_datum)->dsize) + 1); \
+      (CB_datum)->dsize = (CB_size); \
+    } \
+  } while(FALSE)
+
+
+/* Alias of `cbdatumtomalloc'. */
+#define CB_DATUMTOMALLOC(CB_datum, CB_ptr, CB_size) \
+  do { \
+    (CB_ptr) = (CB_datum)->dptr; \
+    (CB_size) = (CB_datum)->dsize; \
+    free((CB_datum)); \
+  } while(FALSE)
+
+
+/* Alias of `cblistopen'. */
+#define CB_LISTOPEN(CB_list) \
+  do { \
+    CB_MALLOC((CB_list), sizeof(*(CB_list))); \
+    (CB_list)->anum = CB_LISTUNIT; \
+    CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \
+    (CB_list)->start = 0; \
+    (CB_list)->num = 0; \
+  } while(FALSE)
+
+
+/* Alias of `cblistopen'.
+   However, `anum' is specified for the number of initial allocated elements. */
+#define CB_LISTOPEN2(CB_list, CB_anum) \
+  do { \
+    CB_MALLOC((CB_list), sizeof(*(CB_list))); \
+    (CB_list)->anum = (CB_anum) > 4 ? (CB_anum) : 4; \
+    CB_MALLOC((CB_list)->array, sizeof((CB_list)->array[0]) * (CB_list)->anum); \
+    (CB_list)->start = 0; \
+    (CB_list)->num = 0; \
+  } while(FALSE)
+
+
+/* Alias of `cblistclose'. */
+#define CB_LISTCLOSE(CB_list) \
+  do { \
+    int _CB_i, _CB_end; \
+    _CB_end = (CB_list)->start + (CB_list)->num; \
+    for(_CB_i = (CB_list)->start; _CB_i < _CB_end; _CB_i++){ \
+      free((CB_list)->array[_CB_i].dptr); \
+    } \
+    free((CB_list)->array); \
+    free((CB_list)); \
+  } while(FALSE)
+
+
+/* Alias of `cblistnum'. */
+#define CB_LISTNUM(CB_list) \
+  ((int)((CB_list)->num))
+
+
+/* Alias of `cblistval'.
+   However, `sp' is ignored. */
+#define CB_LISTVAL(CB_list, CB_index) \
+  ((const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr))
+
+
+/* Alias of `cblistval'.
+   However, `size' is used instead of `sp'. */
+#define CB_LISTVAL2(CB_list, CB_index, CB_size) \
+  ((CB_size) = (CB_list)->array[(CB_list)->start+(CB_index)].dsize, \
+  (const char *)((CB_list)->array[(CB_list)->start+(CB_index)].dptr))
+
+
+/* Alias of `cblistpush'.
+   However, `size' should not be negative. */
+#define CB_LISTPUSH(CB_list, CB_ptr, CB_size) \
+  do { \
+    int _CB_index; \
+    _CB_index = (CB_list)->start + (CB_list)->num; \
+    if(_CB_index >= (CB_list)->anum){ \
+      (CB_list)->anum *= 2; \
+      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
+    } \
+    CB_MALLOC((CB_list)->array[_CB_index].dptr, \
+              ((CB_size) < CB_DATUMUNIT ? CB_DATUMUNIT : (CB_size)) + 1); \
+    memcpy((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \
+    (CB_list)->array[_CB_index].dptr[(CB_size)] = '\0'; \
+    (CB_list)->array[_CB_index].dsize = (CB_size); \
+    (CB_list)->num++; \
+  } while(FALSE)
+
+
+/* Remove and free an element of the end of a list.
+   `list' specifies a list handle. */
+#define CB_LISTDROP(CB_list) \
+  do { \
+    if((CB_list)->num > 0){ \
+      free((CB_list)->array[(CB_list)->start+(CB_list)->num-1].dptr); \
+      (CB_list)->num--; \
+    } \
+  } while(FALSE)
+
+
+/* Alias of `cblistinsert'.
+   However, `index' is not checked and `size' should not be negative. */
+#define CB_LISTINSERT(CB_list, CB_index, CB_ptr, CB_size) \
+  do { \
+    int _CB_index = (CB_index); \
+    _CB_index += (CB_list)->start; \
+    if((CB_list)->start + (CB_list)->num >= (CB_list)->anum){ \
+      (CB_list)->anum *= 2; \
+      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
+    } \
+    memmove((CB_list)->array + _CB_index + 1, (CB_list)->array + _CB_index, \
+            sizeof((CB_list)->array[0]) * ((CB_list)->start + (CB_list)->num - _CB_index)); \
+    CB_MEMDUP((CB_list)->array[_CB_index].dptr, (CB_ptr), (CB_size)); \
+    (CB_list)->array[_CB_index].dsize = (CB_size); \
+    (CB_list)->num++; \
+  } while(FALSE)
+
+
+/* Alias of `cblistpushbuf'. */
+#define CB_LISTPUSHBUF(CB_list, CB_ptr, CB_size) \
+  do{ \
+    int _CB_index; \
+    _CB_index = (CB_list)->start + (CB_list)->num; \
+    if(_CB_index >= (CB_list)->anum){ \
+      (CB_list)->anum *= 2; \
+      CB_REALLOC((CB_list)->array, (CB_list)->anum * sizeof((CB_list)->array[0])); \
+    } \
+    (CB_list)->array[_CB_index].dptr = (CB_ptr); \
+    (CB_list)->array[_CB_index].dsize = (CB_size); \
+    (CB_list)->num++; \
+  } while(FALSE) \
+
+
+/* Alias of `cbmapiterval'.
+   However, `size' is used instead of `sp'. */
+#define CB_MAPITERVAL(CB_vbuf, CB_kbuf, CB_vsiz) \
+  do { \
+    CBMAPDATUM *_CB_datum; \
+    _CB_datum = (CBMAPDATUM *)((CB_kbuf) - sizeof(*_CB_datum)); \
+    (CB_vsiz) = _CB_datum->vsiz; \
+    (CB_vbuf) = (char *)_CB_datum + sizeof(*_CB_datum) + \
+      _CB_datum->ksiz + CB_ALIGNPAD(_CB_datum->ksiz); \
+  } while(FALSE)
+
+
+
+#undef MYEXTERN
+
+#if defined(__cplusplus)                 /* export for C++ */
+}
+#endif
+
+#endif                                   /* duplication check */
+
+
+/* END OF FILE */

Deleted: box/trunk/qdbm/cbcodec.c
===================================================================
--- box/trunk/qdbm/cbcodec.c	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/cbcodec.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,1079 +0,0 @@
-/*************************************************************************************************
- * Popular encoders and decoders
- *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#include <cabin.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#undef TRUE
-#define TRUE           1                 /* boolean true */
-#undef FALSE
-#define FALSE          0                 /* boolean false */
-
-#define DEFCODE        "UTF-8"           /* default encoding */
-
-
-/* for RISC OS */
-#if defined(__riscos__) || defined(__riscos)
-#include <unixlib/local.h>
-int __riscosify_control = __RISCOSIFY_NO_PROCESS;
-#endif
-
-
-/* global variables */
-const char *progname;                    /* program name */
-
-
-/* function prototypes */
-int main(int argc, char **argv);
-void usage(void);
-char *readstdin(int *sp);
-int runurl(int argc, char **argv);
-int runbase(int argc, char **argv);
-int runquote(int argc, char **argv);
-int runmime(int argc, char **argv);
-int runcsv(int argc, char **argv);
-int runxml(int argc, char **argv);
-int runzlib(int argc, char **argv);
-int runlzo(int argc, char **argv);
-int runbzip(int argc, char **argv);
-int runiconv(int argc, char **argv);
-int rundate(int argc, char **argv);
-void shouucsmap(void);
-
-
-/* main routine */
-int main(int argc, char **argv){
-  int rv;
-  cbstdiobin();
-  progname = argv[0];
-  if(argc < 2) usage();
-  rv = 0;
-  if(!strcmp(argv[1], "url")){
-    rv = runurl(argc, argv);
-  } else if(!strcmp(argv[1], "base")){
-    rv = runbase(argc, argv);
-  } else if(!strcmp(argv[1], "quote")){
-    rv = runquote(argc, argv);
-  } else if(!strcmp(argv[1], "mime")){
-    rv = runmime(argc, argv);
-  } else if(!strcmp(argv[1], "csv")){
-    rv = runcsv(argc, argv);
-  } else if(!strcmp(argv[1], "xml")){
-    rv = runxml(argc, argv);
-  } else if(!strcmp(argv[1], "zlib")){
-    rv = runzlib(argc, argv);
-  } else if(!strcmp(argv[1], "lzo")){
-    rv = runlzo(argc, argv);
-  } else if(!strcmp(argv[1], "bzip")){
-    rv = runbzip(argc, argv);
-  } else if(!strcmp(argv[1], "iconv")){
-    rv = runiconv(argc, argv);
-  } else if(!strcmp(argv[1], "date")){
-    rv = rundate(argc, argv);
-  } else {
-    usage();
-  }
-  return rv;
-}
-
-
-/* print the usage and exit */
-void usage(void){
-  char *tmp;
-  int tsiz;
-  fprintf(stderr, "%s: popular encoders and decoders\n", progname);
-  fprintf(stderr, "\n");
-  fprintf(stderr, "usage:\n");
-  fprintf(stderr, "  %s url [-d] [-br] [-rs base target] [-l] [-e expr] [file]\n", progname);
-  fprintf(stderr, "  %s base [-d] [-l] [-c num] [-e expr] [file]\n", progname);
-  fprintf(stderr, "  %s quote [-d] [-l] [-c num] [-e expr] [file]\n", progname);
-  fprintf(stderr, "  %s mime [-d] [-hd] [-bd] [-part num] [-l] [-ec code] [-qp] [-dc] [-e expr]"
-          " [file]\n", progname);
-  fprintf(stderr, "  %s csv [-d] [-t] [-l] [-e expr] [-html] [file]\n", progname);
-  fprintf(stderr, "  %s xml [-d] [-p] [-l] [-e expr] [-tsv] [file]\n", progname);
-  if((tmp = cbdeflate("", 0, &tsiz)) != NULL){
-    fprintf(stderr, "  %s zlib [-d] [-gz] [-crc] [file]\n", progname);
-    free(tmp);
-  }
-  if((tmp = cblzoencode("", 0, &tsiz)) != NULL){
-    fprintf(stderr, "  %s lzo [-d] [file]\n", progname);
-    free(tmp);
-  }
-  if((tmp = cbbzencode("", 0, &tsiz)) != NULL){
-    fprintf(stderr, "  %s bzip [-d] [file]\n", progname);
-    free(tmp);
-  }
-  if((tmp = cbiconv("", 0, "US-ASCII", "US-ASCII", NULL, NULL)) != NULL){
-    fprintf(stderr, "  %s iconv [-ic code] [-oc code] [-ol ltype] [-cn] [-wc] [-um] [file]\n",
-            progname);
-    free(tmp);
-  }
-  fprintf(stderr, "  %s date [-wf] [-rf] [-utc] [str]\n", progname);
-  fprintf(stderr, "\n");
-  exit(1);
-}
-
-
-/* read the standard input */
-char *readstdin(int *sp){
-  char *buf;
-  int i, blen, c;
-  blen = 256;
-  buf = cbmalloc(blen);
-  for(i = 0; (c = getchar()) != EOF; i++){
-    if(i >= blen - 1) buf = cbrealloc(buf, blen *= 2);
-    buf[i] = c;
-  }
-  buf[i] = '\0';
-  if(sp) *sp = i;
-  return buf;
-}
-
-
-/* parse arguments of url command */
-int runurl(int argc, char **argv){
-  CBMAP *map;
-  int i, size, dec, br, line;
-  const char *val;
-  char *base, *target, *expr, *file, *buf, *res;
-  dec = FALSE;
-  br = FALSE;
-  line = FALSE;
-  base = NULL;
-  target = NULL;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-br")){
-        br = TRUE;
-      } else if(!strcmp(argv[i], "-rs")){
-        if(++i >= argc) usage();
-        base = argv[i];
-        if(++i >= argc) usage();
-        target = argv[i];
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(base){
-    size = strlen(base);
-    buf = cbmemdup(base, size);
-  } else if(expr){
-    size = strlen(expr);
-    buf = cbmemdup(expr, size);
-  } else if(file){
-    if(!(buf = cbreadfile(file, &size))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&size);
-  }
-  if(target){
-    res = cburlresolve(base, target);
-    printf("%s", res);
-    free(res);
-  } else if(br){
-    map = cburlbreak(buf);
-    if((val = cbmapget(map, "self", -1, NULL))) printf("self\t%s\n", val);
-    if((val = cbmapget(map, "scheme", -1, NULL))) printf("scheme\t%s\n", val);
-    if((val = cbmapget(map, "host", -1, NULL))) printf("host\t%s\n", val);
-    if((val = cbmapget(map, "port", -1, NULL))) printf("port\t%s\n", val);
-    if((val = cbmapget(map, "authority", -1, NULL))) printf("authority\t%s\n", val);
-    if((val = cbmapget(map, "path", -1, NULL))) printf("path\t%s\n", val);
-    if((val = cbmapget(map, "file", -1, NULL))) printf("file\t%s\n", val);
-    if((val = cbmapget(map, "query", -1, NULL))) printf("query\t%s\n", val);
-    if((val = cbmapget(map, "fragment", -1, NULL))) printf("fragment\t%s\n", val);
-    cbmapclose(map);
-  } else if(dec){
-    res = cburldecode(buf, &size);
-    for(i = 0; i < size; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    res = cburlencode(buf, size);
-    for(i = 0; res[i] != '\0'; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of base command */
-int runbase(int argc, char **argv){
-  int i, ci, size, dec, line, cols;
-  char *expr, *file, *buf, *res;
-  dec = FALSE;
-  line = FALSE;
-  cols = -1;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-c")){
-        if(++i >= argc) usage();
-        cols = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(expr){
-    size = strlen(expr);
-    buf = cbmemdup(expr, size);
-  } else if(file){
-    if(!(buf = cbreadfile(file, &size))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&size);
-  }
-  if(dec){
-    res = cbbasedecode(buf, &size);
-    for(i = 0; i < size; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    res = cbbaseencode(buf, size);
-    ci = 0;
-    for(i = 0; res[i] != '\0'; i++){
-      if(cols > 0 && ci >= cols){
-        putchar('\n');
-        ci = 0;
-      }
-      putchar(res[i]);
-      ci++;
-    }
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of quote command */
-int runquote(int argc, char **argv){
-  int i, ci, size, dec, line, cols;
-  char *expr, *file, *buf, *res;
-  dec = FALSE;
-  line = FALSE;
-  cols = -1;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-c")){
-        if(++i >= argc) usage();
-        cols = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(expr){
-    size = strlen(expr);
-    buf = cbmemdup(expr, size);
-  } else if(file){
-    if(!(buf = cbreadfile(file, &size))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&size);
-  }
-  if(dec){
-    res = cbquotedecode(buf, &size);
-    for(i = 0; i < size; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    res = cbquoteencode(buf, size);
-    ci = 0;
-    for(i = 0; res[i] != '\0'; i++){
-      if(cols > 0 && (ci >= cols || (ci >= cols - 2 && res[i] == '='))){
-        printf("=\n");
-        ci = 0;
-      }
-      if(res[i] == '\r' || res[i] == '\n') ci = 0;
-      putchar(res[i]);
-      ci++;
-    }
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of mime command */
-int runmime(int argc, char **argv){
-  CBMAP *attrs;
-  CBLIST *parts;
-  int i, size, dec, line, qp, dc, hd, bd, pnum, rsiz, bsiz;
-  const char *key, *body;
-  char *code, *expr, *file, *buf, *res, renc[64];
-  dec = FALSE;
-  hd = FALSE;
-  bd = FALSE;
-  pnum = 0;
-  line = FALSE;
-  dc = FALSE;
-  qp = FALSE;
-  code = NULL;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-hd")){
-        hd = TRUE;
-      } else if(!strcmp(argv[i], "-bd")){
-        bd = TRUE;
-      } else if(!strcmp(argv[i], "-part")){
-        if(++i >= argc) usage();
-        pnum = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-ec")){
-        if(++i >= argc) usage();
-        code = argv[i];
-      } else if(!strcmp(argv[i], "-qp")){
-        qp = TRUE;
-      } else if(!strcmp(argv[i], "-dc")){
-        dc = TRUE;
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(expr){
-    size = strlen(expr);
-    buf = cbmemdup(expr, size);
-  } else if(file){
-    if(!(buf = cbreadfile(file, &size))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&size);
-  }
-  if(hd || bd || pnum > 0){
-    attrs = cbmapopen();
-    res = cbmimebreak(buf, size, attrs, &rsiz);
-    if(pnum > 0){
-      parts = NULL;
-      if(!(key = cbmapget(attrs, "TYPE", -1, NULL)) || !cbstrfwimatch(key, "multipart/") ||
-         !(key = cbmapget(attrs, "BOUNDARY", -1, NULL)) ||
-         !(parts = cbmimeparts(res, rsiz, key)) || cblistnum(parts) < pnum){
-        fprintf(stderr, "%s: not multipart or no such part\n", progname);
-        if(parts) cblistclose(parts);
-        free(res);
-        cbmapclose(attrs);
-        free(buf);
-        return 1;
-      }
-      body = cblistval(parts, pnum - 1, &bsiz);
-      for(i = 0; i < bsiz; i++){
-        putchar(body[i]);
-      }
-      cblistclose(parts);
-    } else if(hd){
-      cbmapiterinit(attrs);
-      while((key = cbmapiternext(attrs, NULL)) != NULL){
-        printf("%s\t%s\n", key, cbmapget(attrs, key, -1, NULL));
-      }
-    } else {
-      for(i = 0; i < rsiz; i++){
-        putchar(res[i]);
-      }
-    }
-    free(res);
-    cbmapclose(attrs);
-  } else if(dec){
-    res = cbmimedecode(buf, renc);
-    printf("%s", dc ? renc : res);
-    free(res);
-  } else {
-    res = cbmimeencode(buf, code ? code : DEFCODE, !qp);
-    printf("%s", res);
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of csv command */
-int runcsv(int argc, char **argv){
-  CBLIST *rows, *cells;
-  int i, j, k, dec, tb, line, html;
-  const char *row, *cell;
-  char *expr, *file, *buf, *res;
-  dec = FALSE;
-  tb = FALSE;
-  line = FALSE;
-  html = FALSE;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-t")){
-        tb = TRUE;
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else if(!strcmp(argv[i], "-html")){
-        html = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(expr){
-    buf = cbmemdup(expr, -1);
-  } else if(file){
-    if(!(buf = cbreadfile(file, NULL))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(NULL);
-  }
-  if(tb || html){
-    if(html) printf("<table border=\"1\">\n");
-    rows = cbcsvrows(buf);
-    for(i = 0; i < cblistnum(rows); i++){
-      if(html) printf("<tr>");
-      row = cblistval(rows, i, NULL);
-      cells = cbcsvcells(row);
-      for(j = 0; j < cblistnum(cells); j++){
-        cell = cblistval(cells, j, NULL);
-        if(html){
-          printf("<td>");
-          for(k = 0; cell[k] != '\0'; k++){
-            if(cell[k] == '\r' || cell[k] == '\n'){
-              printf("<br>");
-              if(cell[k] == '\r' && cell[k] == '\n') k++;
-            } else {
-              switch(cell[k]){
-              case '&': printf("&"); break;
-              case '<': printf("<"); break;
-              case '>': printf(">"); break;
-              default: putchar(cell[k]); break;
-              }
-            }
-          }
-          printf("</td>");
-        } else {
-          if(j > 0) putchar('\t');
-          for(k = 0; cell[k] != '\0'; k++){
-            if(((unsigned char *)cell)[k] >= 0x20) putchar(cell[k]);
-          }
-        }
-      }
-      cblistclose(cells);
-      if(html) printf("</tr>");
-      putchar('\n');
-    }
-    cblistclose(rows);
-    if(html) printf("</table>\n");
-  } else if(dec){
-    res = cbcsvunescape(buf);
-    for(i = 0; res[i] != '\0'; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    res = cbcsvescape(buf);
-    for(i = 0; res[i] != '\0'; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of xml command */
-int runxml(int argc, char **argv){
-  CBLIST *elems;
-  CBMAP *attrs;
-  int i, j, dec, pb, line, tsv, div;
-  const char *elem, *attr;
-  char *expr, *file, *buf, *res;
-  dec = FALSE;
-  pb = FALSE;
-  line = FALSE;
-  tsv = FALSE;
-  expr = NULL;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-p")){
-        pb = TRUE;
-      } else if(!strcmp(argv[i], "-l")){
-        line = TRUE;
-      } else if(!strcmp(argv[i], "-e")){
-        if(++i >= argc) usage();
-        expr = argv[i];
-      } else if(!strcmp(argv[i], "-tsv")){
-        tsv = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(expr){
-    buf = cbmemdup(expr, -1);
-  } else if(file){
-    if(!(buf = cbreadfile(file, NULL))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(NULL);
-  }
-  if(pb || tsv){
-    elems = cbxmlbreak(buf, FALSE);
-    for(i = 0; i < cblistnum(elems); i++){
-      elem = cblistval(elems, i, NULL);
-      div = FALSE;
-      if(elem[0] == '<'){
-        if(cbstrfwimatch(elem, "<?xml")){
-          printf("XMLDECL");
-          div = TRUE;
-        } else if(cbstrfwimatch(elem, "<!DOCTYPE")){
-          printf("DOCTYPE");
-        } else if(cbstrfwimatch(elem, "<!--")){
-          printf("COMMENT");
-        } else if(cbstrfwimatch(elem, "</")){
-          printf("ENDTAG");
-          div = TRUE;
-        } else if(cbstrbwimatch(elem, "/>")){
-          printf("EMPTAG");
-          div = TRUE;
-        } else {
-          printf("BEGTAG");
-          div = TRUE;
-        }
-      } else {
-        printf("TEXT");
-      }
-      putchar('\t');
-      if(tsv){
-        if(div){
-          attrs = cbxmlattrs(elem);
-          cbmapiterinit(attrs);
-          for(j = 0; (attr = cbmapiternext(attrs, NULL)) != NULL; j++){
-            if(j < 1){
-              printf("%s", cbmapget(attrs, attr, -1, NULL));
-            } else {
-              printf("\t%s\t%s", attr, cbmapget(attrs, attr, -1, NULL));
-            }
-          }
-          cbmapclose(attrs);
-        } else {
-          res = cbxmlunescape(elem);
-          for(j = 0; elem[j] != '\0'; j++){
-            if(((unsigned char *)elem)[j] < 0x20 || elem[j] == '%'){
-              printf("%%%02X", elem[j]);
-            } else {
-              putchar(elem[j]);
-            }
-          }
-          free(res);
-        }
-      } else {
-        printf("%s", elem);
-      }
-      putchar('\n');
-    }
-    cblistclose(elems);
-  } else if(dec){
-    res = cbxmlunescape(buf);
-    for(i = 0; res[i] != '\0'; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    res = cbxmlescape(buf);
-    for(i = 0; res[i] != '\0'; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  if(line) putchar('\n');
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of zlib command */
-int runzlib(int argc, char **argv){
-  unsigned int sum;
-  int i, bsiz, rsiz, dec, gz, crc;
-  char *file, *buf, *res;
-  dec = FALSE;
-  gz = FALSE;
-  crc = FALSE;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else if(!strcmp(argv[i], "-gz")){
-        gz = TRUE;
-      } else if(!strcmp(argv[i], "-crc")){
-        crc = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(file){
-    if(!(buf = cbreadfile(file, &bsiz))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&bsiz);
-  }
-  if(crc){
-    sum = cbgetcrc(buf, bsiz);
-    for(i = 0; i < sizeof(int); i++){
-      printf("%02x", sum / 0x1000000);
-      sum <<= 8;
-    }
-    putchar('\n');
-  } else if(dec){
-    if(!(res = gz ? cbgzdecode(buf, bsiz, &rsiz) : cbinflate(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: inflate failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    if(!(res = gz ? cbgzencode(buf, bsiz, &rsiz) : cbdeflate(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: deflate failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of lzo command */
-int runlzo(int argc, char **argv){
-  int i, bsiz, rsiz, dec;
-  char *file, *buf, *res;
-  dec = FALSE;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(file){
-    if(!(buf = cbreadfile(file, &bsiz))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&bsiz);
-  }
-  if(dec){
-    if(!(res = cblzodecode(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: decode failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    if(!(res = cblzoencode(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: encode failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of bzip command */
-int runbzip(int argc, char **argv){
-  int i, bsiz, rsiz, dec;
-  char *file, *buf, *res;
-  dec = FALSE;
-  file = NULL;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        dec = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(file){
-    if(!(buf = cbreadfile(file, &bsiz))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&bsiz);
-  }
-  if(dec){
-    if(!(res = cbbzdecode(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: decode failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  } else {
-    if(!(res = cbbzencode(buf, bsiz, &rsiz))){
-      fprintf(stderr, "%s: encode failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    for(i = 0; i < rsiz; i++){
-      putchar(res[i]);
-    }
-    free(res);
-  }
-  free(buf);
-  return 0;
-}
-
-
-/* parse arguments of iconv command */
-int runiconv(int argc, char **argv){
-  CBDATUM *datum;
-  const char *rcode;
-  char *icode, *ocode, *ltype, *file, *buf, *res, *norm, *orig;
-  int i, cn, wc, bsiz, rsiz, nsiz, osiz, miss;
-  icode = NULL;
-  ocode = NULL;
-  ltype = NULL;
-  file = NULL;
-  cn = FALSE;
-  wc = FALSE;
-  for(i = 2; i < argc; i++){
-    if(!file && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-ic")){
-        if(++i >= argc) usage();
-        icode = argv[i];
-      } else if(!strcmp(argv[i], "-oc")){
-        if(++i >= argc) usage();
-        ocode = argv[i];
-      } else if(!strcmp(argv[i], "-ol")){
-        if(++i >= argc) usage();
-        ltype = argv[i];
-      } else if(!strcmp(argv[i], "-cn")){
-        cn = TRUE;
-      } else if(!strcmp(argv[i], "-wc")){
-        wc = TRUE;
-      } else if(!strcmp(argv[i], "-um")){
-        shouucsmap();
-      } else {
-        usage();
-      }
-    } else if(!file){
-      file = argv[i];
-    } else {
-      usage();
-    }
-  }
-  buf = NULL;
-  if(file){
-    if(!(buf = cbreadfile(file, &bsiz))){
-      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
-      return 1;
-    }
-  } else {
-    buf = readstdin(&bsiz);
-  }
-  miss = 0;
-  if(cn){
-    printf("%s\n", cbencname(buf, bsiz));
-  } else if(wc){
-    printf("%d\n", cbstrcountutf(buf));
-  } else {
-    rcode = icode ? icode : cbencname(buf, bsiz);
-    if(!(res = cbiconv(buf, bsiz, rcode, ocode ? ocode : DEFCODE,
-                       &rsiz, &miss))){
-      fprintf(stderr, "%s: iconv failed\n", progname);
-      free(buf);
-      return 1;
-    }
-    if(miss > 0) fprintf(stderr, "%s: missing %d characters\n", progname, miss);
-    if(ltype && (!cbstricmp(ltype, "u") || !cbstricmp(ltype, "unix") ||
-                 !cbstricmp(ltype, "lf"))){
-      ltype = "\n";
-    } else if(ltype && (!cbstricmp(ltype, "d") || !cbstricmp(ltype, "dos") ||
-                        !cbstricmp(ltype, "crlf"))){
-      ltype = "\r\n";
-    } else if(ltype && (!cbstricmp(ltype, "m") || !cbstricmp(ltype, "mac") ||
-                        !cbstricmp(ltype, "cr"))){
-      ltype = "\r";
-    } else {
-      ltype = NULL;
-    }
-    if(ltype){
-      if(!(norm = cbiconv(res, rsiz, ocode, "UTF-8", &nsiz, NULL))){
-        fprintf(stderr, "%s: iconv failed\n", progname);
-        free(res);
-        free(buf);
-        return 1;
-      }
-      datum = cbdatumopen(NULL, -1);
-      for(i = 0; i < nsiz; i++){
-        if(norm[i] == '\r'){
-          if(norm[i+1] == '\n') i++;
-          cbdatumcat(datum, ltype, -1);
-        } else if(norm[i] == '\n'){
-          cbdatumcat(datum, ltype, -1);
-        } else {
-          cbdatumcat(datum, norm + i, 1);
-        }
-      }
-      if(!(orig = cbiconv(cbdatumptr(datum), cbdatumsize(datum), "UTF-8", ocode, &osiz, NULL))){
-        fprintf(stderr, "%s: iconv failed\n", progname);
-        cbdatumclose(datum);
-        free(norm);
-        free(res);
-        free(buf);
-        return 1;
-      }
-      for(i = 0; i < osiz; i++){
-        putchar(orig[i]);
-      }
-      free(orig);
-      cbdatumclose(datum);
-      free(norm);
-    } else {
-      for(i = 0; i < rsiz; i++){
-        putchar(res[i]);
-      }
-    }
-    free(res);
-  }
-  free(buf);
-  return miss > 0 ? 1 : 0;
-}
-
-
-/* parse arguments of date command */
-int rundate(int argc, char **argv){
-  int i, wb, rb, utc, jl;
-  char *date, *res;
-  time_t t;
-  wb = FALSE;
-  rb = FALSE;
-  utc = FALSE;
-  date = NULL;
-  for(i = 2; i < argc; i++){
-    if(!date && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-wf")){
-        wb = TRUE;
-      } else if(!strcmp(argv[i], "-rf")){
-        rb = TRUE;
-      } else if(!strcmp(argv[i], "-utc")){
-        utc = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!date){
-      date = argv[i];
-    } else {
-      usage();
-    }
-  }
-  jl = utc ? 0 : cbjetlag();
-  if(date){
-    t = cbstrmktime(date);
-  } else {
-    t = time(NULL);
-  }
-  if(wb){
-    res = cbdatestrwww(t, jl);
-  } else if(rb){
-    res = cbdatestrhttp(t, jl);
-  } else {
-    res = cbsprintf("%d", (int)t);
-  }
-  if(t >= 0){
-    printf("%s\n", res);
-  } else {
-    if(date){
-      fprintf(stderr, "%s: %s: invalid date format\n", progname, date);
-    } else {
-      fprintf(stderr, "%s: invalid time setting\n", progname);
-    }
-  }
-  free(res);
-  return 0;
-}
-
-
-/* show mapping of UCS-2 and exit. */
-void shouucsmap(void){
-  unsigned char buf[2], *tmp;
-  int i, j, tsiz;
-  for(i = 0; i < 65536; i++){
-    buf[0] = i / 256;
-    buf[1] = i % 256;
-    printf("%d\t", i);
-    printf("U+%02X%02X\t", buf[0], buf[1]);
-    printf("\"\\x%x\\x%x\"\t", buf[0], buf[1]);
-    if((tmp = (unsigned char *)cbiconv((char *)buf, 2, "UTF-16BE", "UTF-8",
-                                       &tsiz, NULL)) != NULL){
-      if(tsiz > 0){
-        printf("\"");
-        for(j = 0; j < tsiz; j++){
-          printf("\\x%x", tmp[j]);
-        }
-        printf("\"");
-      } else {
-        printf("NULL");
-      }
-      free(tmp);
-    }
-    printf("\n");
-  }
-  exit(0);
-}
-
-
-
-/* END OF FILE */

Copied: box/trunk/qdbm/cbcodec.c (from rev 2716, box/trunk/qdbm/cbcodec.c)
===================================================================
--- box/trunk/qdbm/cbcodec.c	                        (rev 0)
+++ box/trunk/qdbm/cbcodec.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,1079 @@
+/*************************************************************************************************
+ * Popular encoders and decoders
+ *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
+ * This file is part of QDBM, Quick Database Manager.
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
+ * Lesser General Public License as published by the Free Software Foundation; either version
+ * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
+ * details.
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ *************************************************************************************************/
+
+
+#include <cabin.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#undef TRUE
+#define TRUE           1                 /* boolean true */
+#undef FALSE
+#define FALSE          0                 /* boolean false */
+
+#define DEFCODE        "UTF-8"           /* default encoding */
+
+
+/* for RISC OS */
+#if defined(__riscos__) || defined(__riscos)
+#include <unixlib/local.h>
+int __riscosify_control = __RISCOSIFY_NO_PROCESS;
+#endif
+
+
+/* global variables */
+const char *progname;                    /* program name */
+
+
+/* function prototypes */
+int main(int argc, char **argv);
+void usage(void);
+char *readstdin(int *sp);
+int runurl(int argc, char **argv);
+int runbase(int argc, char **argv);
+int runquote(int argc, char **argv);
+int runmime(int argc, char **argv);
+int runcsv(int argc, char **argv);
+int runxml(int argc, char **argv);
+int runzlib(int argc, char **argv);
+int runlzo(int argc, char **argv);
+int runbzip(int argc, char **argv);
+int runiconv(int argc, char **argv);
+int rundate(int argc, char **argv);
+void shouucsmap(void);
+
+
+/* main routine */
+int main(int argc, char **argv){
+  int rv;
+  cbstdiobin();
+  progname = argv[0];
+  if(argc < 2) usage();
+  rv = 0;
+  if(!strcmp(argv[1], "url")){
+    rv = runurl(argc, argv);
+  } else if(!strcmp(argv[1], "base")){
+    rv = runbase(argc, argv);
+  } else if(!strcmp(argv[1], "quote")){
+    rv = runquote(argc, argv);
+  } else if(!strcmp(argv[1], "mime")){
+    rv = runmime(argc, argv);
+  } else if(!strcmp(argv[1], "csv")){
+    rv = runcsv(argc, argv);
+  } else if(!strcmp(argv[1], "xml")){
+    rv = runxml(argc, argv);
+  } else if(!strcmp(argv[1], "zlib")){
+    rv = runzlib(argc, argv);
+  } else if(!strcmp(argv[1], "lzo")){
+    rv = runlzo(argc, argv);
+  } else if(!strcmp(argv[1], "bzip")){
+    rv = runbzip(argc, argv);
+  } else if(!strcmp(argv[1], "iconv")){
+    rv = runiconv(argc, argv);
+  } else if(!strcmp(argv[1], "date")){
+    rv = rundate(argc, argv);
+  } else {
+    usage();
+  }
+  return rv;
+}
+
+
+/* print the usage and exit */
+void usage(void){
+  char *tmp;
+  int tsiz;
+  fprintf(stderr, "%s: popular encoders and decoders\n", progname);
+  fprintf(stderr, "\n");
+  fprintf(stderr, "usage:\n");
+  fprintf(stderr, "  %s url [-d] [-br] [-rs base target] [-l] [-e expr] [file]\n", progname);
+  fprintf(stderr, "  %s base [-d] [-l] [-c num] [-e expr] [file]\n", progname);
+  fprintf(stderr, "  %s quote [-d] [-l] [-c num] [-e expr] [file]\n", progname);
+  fprintf(stderr, "  %s mime [-d] [-hd] [-bd] [-part num] [-l] [-ec code] [-qp] [-dc] [-e expr]"
+          " [file]\n", progname);
+  fprintf(stderr, "  %s csv [-d] [-t] [-l] [-e expr] [-html] [file]\n", progname);
+  fprintf(stderr, "  %s xml [-d] [-p] [-l] [-e expr] [-tsv] [file]\n", progname);
+  if((tmp = cbdeflate("", 0, &tsiz)) != NULL){
+    fprintf(stderr, "  %s zlib [-d] [-gz] [-crc] [file]\n", progname);
+    free(tmp);
+  }
+  if((tmp = cblzoencode("", 0, &tsiz)) != NULL){
+    fprintf(stderr, "  %s lzo [-d] [file]\n", progname);
+    free(tmp);
+  }
+  if((tmp = cbbzencode("", 0, &tsiz)) != NULL){
+    fprintf(stderr, "  %s bzip [-d] [file]\n", progname);
+    free(tmp);
+  }
+  if((tmp = cbiconv("", 0, "US-ASCII", "US-ASCII", NULL, NULL)) != NULL){
+    fprintf(stderr, "  %s iconv [-ic code] [-oc code] [-ol ltype] [-cn] [-wc] [-um] [file]\n",
+            progname);
+    free(tmp);
+  }
+  fprintf(stderr, "  %s date [-wf] [-rf] [-utc] [str]\n", progname);
+  fprintf(stderr, "\n");
+  exit(1);
+}
+
+
+/* read the standard input */
+char *readstdin(int *sp){
+  char *buf;
+  int i, blen, c;
+  blen = 256;
+  buf = cbmalloc(blen);
+  for(i = 0; (c = getchar()) != EOF; i++){
+    if(i >= blen - 1) buf = cbrealloc(buf, blen *= 2);
+    buf[i] = c;
+  }
+  buf[i] = '\0';
+  if(sp) *sp = i;
+  return buf;
+}
+
+
+/* parse arguments of url command */
+int runurl(int argc, char **argv){
+  CBMAP *map;
+  int i, size, dec, br, line;
+  const char *val;
+  char *base, *target, *expr, *file, *buf, *res;
+  dec = FALSE;
+  br = FALSE;
+  line = FALSE;
+  base = NULL;
+  target = NULL;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-br")){
+        br = TRUE;
+      } else if(!strcmp(argv[i], "-rs")){
+        if(++i >= argc) usage();
+        base = argv[i];
+        if(++i >= argc) usage();
+        target = argv[i];
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(base){
+    size = strlen(base);
+    buf = cbmemdup(base, size);
+  } else if(expr){
+    size = strlen(expr);
+    buf = cbmemdup(expr, size);
+  } else if(file){
+    if(!(buf = cbreadfile(file, &size))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&size);
+  }
+  if(target){
+    res = cburlresolve(base, target);
+    printf("%s", res);
+    free(res);
+  } else if(br){
+    map = cburlbreak(buf);
+    if((val = cbmapget(map, "self", -1, NULL))) printf("self\t%s\n", val);
+    if((val = cbmapget(map, "scheme", -1, NULL))) printf("scheme\t%s\n", val);
+    if((val = cbmapget(map, "host", -1, NULL))) printf("host\t%s\n", val);
+    if((val = cbmapget(map, "port", -1, NULL))) printf("port\t%s\n", val);
+    if((val = cbmapget(map, "authority", -1, NULL))) printf("authority\t%s\n", val);
+    if((val = cbmapget(map, "path", -1, NULL))) printf("path\t%s\n", val);
+    if((val = cbmapget(map, "file", -1, NULL))) printf("file\t%s\n", val);
+    if((val = cbmapget(map, "query", -1, NULL))) printf("query\t%s\n", val);
+    if((val = cbmapget(map, "fragment", -1, NULL))) printf("fragment\t%s\n", val);
+    cbmapclose(map);
+  } else if(dec){
+    res = cburldecode(buf, &size);
+    for(i = 0; i < size; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    res = cburlencode(buf, size);
+    for(i = 0; res[i] != '\0'; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of base command */
+int runbase(int argc, char **argv){
+  int i, ci, size, dec, line, cols;
+  char *expr, *file, *buf, *res;
+  dec = FALSE;
+  line = FALSE;
+  cols = -1;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-c")){
+        if(++i >= argc) usage();
+        cols = atoi(argv[i]);
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(expr){
+    size = strlen(expr);
+    buf = cbmemdup(expr, size);
+  } else if(file){
+    if(!(buf = cbreadfile(file, &size))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&size);
+  }
+  if(dec){
+    res = cbbasedecode(buf, &size);
+    for(i = 0; i < size; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    res = cbbaseencode(buf, size);
+    ci = 0;
+    for(i = 0; res[i] != '\0'; i++){
+      if(cols > 0 && ci >= cols){
+        putchar('\n');
+        ci = 0;
+      }
+      putchar(res[i]);
+      ci++;
+    }
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of quote command */
+int runquote(int argc, char **argv){
+  int i, ci, size, dec, line, cols;
+  char *expr, *file, *buf, *res;
+  dec = FALSE;
+  line = FALSE;
+  cols = -1;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-c")){
+        if(++i >= argc) usage();
+        cols = atoi(argv[i]);
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(expr){
+    size = strlen(expr);
+    buf = cbmemdup(expr, size);
+  } else if(file){
+    if(!(buf = cbreadfile(file, &size))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&size);
+  }
+  if(dec){
+    res = cbquotedecode(buf, &size);
+    for(i = 0; i < size; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    res = cbquoteencode(buf, size);
+    ci = 0;
+    for(i = 0; res[i] != '\0'; i++){
+      if(cols > 0 && (ci >= cols || (ci >= cols - 2 && res[i] == '='))){
+        printf("=\n");
+        ci = 0;
+      }
+      if(res[i] == '\r' || res[i] == '\n') ci = 0;
+      putchar(res[i]);
+      ci++;
+    }
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of mime command */
+int runmime(int argc, char **argv){
+  CBMAP *attrs;
+  CBLIST *parts;
+  int i, size, dec, line, qp, dc, hd, bd, pnum, rsiz, bsiz;
+  const char *key, *body;
+  char *code, *expr, *file, *buf, *res, renc[64];
+  dec = FALSE;
+  hd = FALSE;
+  bd = FALSE;
+  pnum = 0;
+  line = FALSE;
+  dc = FALSE;
+  qp = FALSE;
+  code = NULL;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-hd")){
+        hd = TRUE;
+      } else if(!strcmp(argv[i], "-bd")){
+        bd = TRUE;
+      } else if(!strcmp(argv[i], "-part")){
+        if(++i >= argc) usage();
+        pnum = atoi(argv[i]);
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-ec")){
+        if(++i >= argc) usage();
+        code = argv[i];
+      } else if(!strcmp(argv[i], "-qp")){
+        qp = TRUE;
+      } else if(!strcmp(argv[i], "-dc")){
+        dc = TRUE;
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(expr){
+    size = strlen(expr);
+    buf = cbmemdup(expr, size);
+  } else if(file){
+    if(!(buf = cbreadfile(file, &size))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&size);
+  }
+  if(hd || bd || pnum > 0){
+    attrs = cbmapopen();
+    res = cbmimebreak(buf, size, attrs, &rsiz);
+    if(pnum > 0){
+      parts = NULL;
+      if(!(key = cbmapget(attrs, "TYPE", -1, NULL)) || !cbstrfwimatch(key, "multipart/") ||
+         !(key = cbmapget(attrs, "BOUNDARY", -1, NULL)) ||
+         !(parts = cbmimeparts(res, rsiz, key)) || cblistnum(parts) < pnum){
+        fprintf(stderr, "%s: not multipart or no such part\n", progname);
+        if(parts) cblistclose(parts);
+        free(res);
+        cbmapclose(attrs);
+        free(buf);
+        return 1;
+      }
+      body = cblistval(parts, pnum - 1, &bsiz);
+      for(i = 0; i < bsiz; i++){
+        putchar(body[i]);
+      }
+      cblistclose(parts);
+    } else if(hd){
+      cbmapiterinit(attrs);
+      while((key = cbmapiternext(attrs, NULL)) != NULL){
+        printf("%s\t%s\n", key, cbmapget(attrs, key, -1, NULL));
+      }
+    } else {
+      for(i = 0; i < rsiz; i++){
+        putchar(res[i]);
+      }
+    }
+    free(res);
+    cbmapclose(attrs);
+  } else if(dec){
+    res = cbmimedecode(buf, renc);
+    printf("%s", dc ? renc : res);
+    free(res);
+  } else {
+    res = cbmimeencode(buf, code ? code : DEFCODE, !qp);
+    printf("%s", res);
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of csv command */
+int runcsv(int argc, char **argv){
+  CBLIST *rows, *cells;
+  int i, j, k, dec, tb, line, html;
+  const char *row, *cell;
+  char *expr, *file, *buf, *res;
+  dec = FALSE;
+  tb = FALSE;
+  line = FALSE;
+  html = FALSE;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-t")){
+        tb = TRUE;
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else if(!strcmp(argv[i], "-html")){
+        html = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(expr){
+    buf = cbmemdup(expr, -1);
+  } else if(file){
+    if(!(buf = cbreadfile(file, NULL))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(NULL);
+  }
+  if(tb || html){
+    if(html) printf("<table border=\"1\">\n");
+    rows = cbcsvrows(buf);
+    for(i = 0; i < cblistnum(rows); i++){
+      if(html) printf("<tr>");
+      row = cblistval(rows, i, NULL);
+      cells = cbcsvcells(row);
+      for(j = 0; j < cblistnum(cells); j++){
+        cell = cblistval(cells, j, NULL);
+        if(html){
+          printf("<td>");
+          for(k = 0; cell[k] != '\0'; k++){
+            if(cell[k] == '\r' || cell[k] == '\n'){
+              printf("<br>");
+              if(cell[k] == '\r' && cell[k] == '\n') k++;
+            } else {
+              switch(cell[k]){
+              case '&': printf("&"); break;
+              case '<': printf("<"); break;
+              case '>': printf(">"); break;
+              default: putchar(cell[k]); break;
+              }
+            }
+          }
+          printf("</td>");
+        } else {
+          if(j > 0) putchar('\t');
+          for(k = 0; cell[k] != '\0'; k++){
+            if(((unsigned char *)cell)[k] >= 0x20) putchar(cell[k]);
+          }
+        }
+      }
+      cblistclose(cells);
+      if(html) printf("</tr>");
+      putchar('\n');
+    }
+    cblistclose(rows);
+    if(html) printf("</table>\n");
+  } else if(dec){
+    res = cbcsvunescape(buf);
+    for(i = 0; res[i] != '\0'; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    res = cbcsvescape(buf);
+    for(i = 0; res[i] != '\0'; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of xml command */
+int runxml(int argc, char **argv){
+  CBLIST *elems;
+  CBMAP *attrs;
+  int i, j, dec, pb, line, tsv, div;
+  const char *elem, *attr;
+  char *expr, *file, *buf, *res;
+  dec = FALSE;
+  pb = FALSE;
+  line = FALSE;
+  tsv = FALSE;
+  expr = NULL;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-p")){
+        pb = TRUE;
+      } else if(!strcmp(argv[i], "-l")){
+        line = TRUE;
+      } else if(!strcmp(argv[i], "-e")){
+        if(++i >= argc) usage();
+        expr = argv[i];
+      } else if(!strcmp(argv[i], "-tsv")){
+        tsv = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(expr){
+    buf = cbmemdup(expr, -1);
+  } else if(file){
+    if(!(buf = cbreadfile(file, NULL))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(NULL);
+  }
+  if(pb || tsv){
+    elems = cbxmlbreak(buf, FALSE);
+    for(i = 0; i < cblistnum(elems); i++){
+      elem = cblistval(elems, i, NULL);
+      div = FALSE;
+      if(elem[0] == '<'){
+        if(cbstrfwimatch(elem, "<?xml")){
+          printf("XMLDECL");
+          div = TRUE;
+        } else if(cbstrfwimatch(elem, "<!DOCTYPE")){
+          printf("DOCTYPE");
+        } else if(cbstrfwimatch(elem, "<!--")){
+          printf("COMMENT");
+        } else if(cbstrfwimatch(elem, "</")){
+          printf("ENDTAG");
+          div = TRUE;
+        } else if(cbstrbwimatch(elem, "/>")){
+          printf("EMPTAG");
+          div = TRUE;
+        } else {
+          printf("BEGTAG");
+          div = TRUE;
+        }
+      } else {
+        printf("TEXT");
+      }
+      putchar('\t');
+      if(tsv){
+        if(div){
+          attrs = cbxmlattrs(elem);
+          cbmapiterinit(attrs);
+          for(j = 0; (attr = cbmapiternext(attrs, NULL)) != NULL; j++){
+            if(j < 1){
+              printf("%s", cbmapget(attrs, attr, -1, NULL));
+            } else {
+              printf("\t%s\t%s", attr, cbmapget(attrs, attr, -1, NULL));
+            }
+          }
+          cbmapclose(attrs);
+        } else {
+          res = cbxmlunescape(elem);
+          for(j = 0; elem[j] != '\0'; j++){
+            if(((unsigned char *)elem)[j] < 0x20 || elem[j] == '%'){
+              printf("%%%02X", elem[j]);
+            } else {
+              putchar(elem[j]);
+            }
+          }
+          free(res);
+        }
+      } else {
+        printf("%s", elem);
+      }
+      putchar('\n');
+    }
+    cblistclose(elems);
+  } else if(dec){
+    res = cbxmlunescape(buf);
+    for(i = 0; res[i] != '\0'; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    res = cbxmlescape(buf);
+    for(i = 0; res[i] != '\0'; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  if(line) putchar('\n');
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of zlib command */
+int runzlib(int argc, char **argv){
+  unsigned int sum;
+  int i, bsiz, rsiz, dec, gz, crc;
+  char *file, *buf, *res;
+  dec = FALSE;
+  gz = FALSE;
+  crc = FALSE;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else if(!strcmp(argv[i], "-gz")){
+        gz = TRUE;
+      } else if(!strcmp(argv[i], "-crc")){
+        crc = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(file){
+    if(!(buf = cbreadfile(file, &bsiz))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&bsiz);
+  }
+  if(crc){
+    sum = cbgetcrc(buf, bsiz);
+    for(i = 0; i < sizeof(int); i++){
+      printf("%02x", sum / 0x1000000);
+      sum <<= 8;
+    }
+    putchar('\n');
+  } else if(dec){
+    if(!(res = gz ? cbgzdecode(buf, bsiz, &rsiz) : cbinflate(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: inflate failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    if(!(res = gz ? cbgzencode(buf, bsiz, &rsiz) : cbdeflate(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: deflate failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of lzo command */
+int runlzo(int argc, char **argv){
+  int i, bsiz, rsiz, dec;
+  char *file, *buf, *res;
+  dec = FALSE;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(file){
+    if(!(buf = cbreadfile(file, &bsiz))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&bsiz);
+  }
+  if(dec){
+    if(!(res = cblzodecode(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: decode failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    if(!(res = cblzoencode(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: encode failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of bzip command */
+int runbzip(int argc, char **argv){
+  int i, bsiz, rsiz, dec;
+  char *file, *buf, *res;
+  dec = FALSE;
+  file = NULL;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        dec = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(file){
+    if(!(buf = cbreadfile(file, &bsiz))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&bsiz);
+  }
+  if(dec){
+    if(!(res = cbbzdecode(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: decode failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  } else {
+    if(!(res = cbbzencode(buf, bsiz, &rsiz))){
+      fprintf(stderr, "%s: encode failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    for(i = 0; i < rsiz; i++){
+      putchar(res[i]);
+    }
+    free(res);
+  }
+  free(buf);
+  return 0;
+}
+
+
+/* parse arguments of iconv command */
+int runiconv(int argc, char **argv){
+  CBDATUM *datum;
+  const char *rcode;
+  char *icode, *ocode, *ltype, *file, *buf, *res, *norm, *orig;
+  int i, cn, wc, bsiz, rsiz, nsiz, osiz, miss;
+  icode = NULL;
+  ocode = NULL;
+  ltype = NULL;
+  file = NULL;
+  cn = FALSE;
+  wc = FALSE;
+  for(i = 2; i < argc; i++){
+    if(!file && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-ic")){
+        if(++i >= argc) usage();
+        icode = argv[i];
+      } else if(!strcmp(argv[i], "-oc")){
+        if(++i >= argc) usage();
+        ocode = argv[i];
+      } else if(!strcmp(argv[i], "-ol")){
+        if(++i >= argc) usage();
+        ltype = argv[i];
+      } else if(!strcmp(argv[i], "-cn")){
+        cn = TRUE;
+      } else if(!strcmp(argv[i], "-wc")){
+        wc = TRUE;
+      } else if(!strcmp(argv[i], "-um")){
+        shouucsmap();
+      } else {
+        usage();
+      }
+    } else if(!file){
+      file = argv[i];
+    } else {
+      usage();
+    }
+  }
+  buf = NULL;
+  if(file){
+    if(!(buf = cbreadfile(file, &bsiz))){
+      fprintf(stderr, "%s: %s: cannot open\n", progname, file);
+      return 1;
+    }
+  } else {
+    buf = readstdin(&bsiz);
+  }
+  miss = 0;
+  if(cn){
+    printf("%s\n", cbencname(buf, bsiz));
+  } else if(wc){
+    printf("%d\n", cbstrcountutf(buf));
+  } else {
+    rcode = icode ? icode : cbencname(buf, bsiz);
+    if(!(res = cbiconv(buf, bsiz, rcode, ocode ? ocode : DEFCODE,
+                       &rsiz, &miss))){
+      fprintf(stderr, "%s: iconv failed\n", progname);
+      free(buf);
+      return 1;
+    }
+    if(miss > 0) fprintf(stderr, "%s: missing %d characters\n", progname, miss);
+    if(ltype && (!cbstricmp(ltype, "u") || !cbstricmp(ltype, "unix") ||
+                 !cbstricmp(ltype, "lf"))){
+      ltype = "\n";
+    } else if(ltype && (!cbstricmp(ltype, "d") || !cbstricmp(ltype, "dos") ||
+                        !cbstricmp(ltype, "crlf"))){
+      ltype = "\r\n";
+    } else if(ltype && (!cbstricmp(ltype, "m") || !cbstricmp(ltype, "mac") ||
+                        !cbstricmp(ltype, "cr"))){
+      ltype = "\r";
+    } else {
+      ltype = NULL;
+    }
+    if(ltype){
+      if(!(norm = cbiconv(res, rsiz, ocode, "UTF-8", &nsiz, NULL))){
+        fprintf(stderr, "%s: iconv failed\n", progname);
+        free(res);
+        free(buf);
+        return 1;
+      }
+      datum = cbdatumopen(NULL, -1);
+      for(i = 0; i < nsiz; i++){
+        if(norm[i] == '\r'){
+          if(norm[i+1] == '\n') i++;
+          cbdatumcat(datum, ltype, -1);
+        } else if(norm[i] == '\n'){
+          cbdatumcat(datum, ltype, -1);
+        } else {
+          cbdatumcat(datum, norm + i, 1);
+        }
+      }
+      if(!(orig = cbiconv(cbdatumptr(datum), cbdatumsize(datum), "UTF-8", ocode, &osiz, NULL))){
+        fprintf(stderr, "%s: iconv failed\n", progname);
+        cbdatumclose(datum);
+        free(norm);
+        free(res);
+        free(buf);
+        return 1;
+      }
+      for(i = 0; i < osiz; i++){
+        putchar(orig[i]);
+      }
+      free(orig);
+      cbdatumclose(datum);
+      free(norm);
+    } else {
+      for(i = 0; i < rsiz; i++){
+        putchar(res[i]);
+      }
+    }
+    free(res);
+  }
+  free(buf);
+  return miss > 0 ? 1 : 0;
+}
+
+
+/* parse arguments of date command */
+int rundate(int argc, char **argv){
+  int i, wb, rb, utc, jl;
+  char *date, *res;
+  time_t t;
+  wb = FALSE;
+  rb = FALSE;
+  utc = FALSE;
+  date = NULL;
+  for(i = 2; i < argc; i++){
+    if(!date && argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-wf")){
+        wb = TRUE;
+      } else if(!strcmp(argv[i], "-rf")){
+        rb = TRUE;
+      } else if(!strcmp(argv[i], "-utc")){
+        utc = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!date){
+      date = argv[i];
+    } else {
+      usage();
+    }
+  }
+  jl = utc ? 0 : cbjetlag();
+  if(date){
+    t = cbstrmktime(date);
+  } else {
+    t = time(NULL);
+  }
+  if(wb){
+    res = cbdatestrwww(t, jl);
+  } else if(rb){
+    res = cbdatestrhttp(t, jl);
+  } else {
+    res = cbsprintf("%d", (int)t);
+  }
+  if(t >= 0){
+    printf("%s\n", res);
+  } else {
+    if(date){
+      fprintf(stderr, "%s: %s: invalid date format\n", progname, date);
+    } else {
+      fprintf(stderr, "%s: invalid time setting\n", progname);
+    }
+  }
+  free(res);
+  return 0;
+}
+
+
+/* show mapping of UCS-2 and exit. */
+void shouucsmap(void){
+  unsigned char buf[2], *tmp;
+  int i, j, tsiz;
+  for(i = 0; i < 65536; i++){
+    buf[0] = i / 256;
+    buf[1] = i % 256;
+    printf("%d\t", i);
+    printf("U+%02X%02X\t", buf[0], buf[1]);
+    printf("\"\\x%x\\x%x\"\t", buf[0], buf[1]);
+    if((tmp = (unsigned char *)cbiconv((char *)buf, 2, "UTF-16BE", "UTF-8",
+                                       &tsiz, NULL)) != NULL){
+      if(tsiz > 0){
+        printf("\"");
+        for(j = 0; j < tsiz; j++){
+          printf("\\x%x", tmp[j]);
+        }
+        printf("\"");
+      } else {
+        printf("NULL");
+      }
+      free(tmp);
+    }
+    printf("\n");
+  }
+  exit(0);
+}
+
+
+
+/* END OF FILE */

Deleted: box/trunk/qdbm/cbtest.c
===================================================================
--- box/trunk/qdbm/cbtest.c	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/cbtest.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,924 +0,0 @@
-/*************************************************************************************************
- * Test cases of Cabin
- *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#include <cabin.h>
-#include <stdio.h>
-#include <cabin.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <time.h>
-
-#undef TRUE
-#define TRUE           1                 /* boolean true */
-#undef FALSE
-#define FALSE          0                 /* boolean false */
-
-#define RECBUFSIZ      32                /* buffer for records */
-#define TEXTBUFSIZ     262144            /* buffer for text */
-
-
-/* for RISC OS */
-#if defined(__riscos__) || defined(__riscos)
-#include <unixlib/local.h>
-int __riscosify_control = __RISCOSIFY_NO_PROCESS;
-#endif
-
-
-/* global variables */
-const char *progname;                    /* program name */
-
-
-/* function prototypes */
-int main(int argc, char **argv);
-void usage(void);
-int runsort(int argc, char **argv);
-int runstrstr(int argc, char **argv);
-int runlist(int argc, char **argv);
-int runmap(int argc, char **argv);
-int runheap(int argc, char **argv);
-int runwicked(int argc, char **argv);
-int runmisc(int argc, char **argv);
-int printfflush(const char *format, ...);
-int strpcmp(const void *ap, const void *bp);
-int intpcmp(const void *ap, const void *bp);
-int myrand(void);
-int dosort(int rnum, int disp);
-int dostrstr(int rnum, int disp);
-int dolist(int rnum, int disp);
-int domap(int rnum, int bnum, int disp);
-int doheap(int rnum, int max, int disp);
-int dowicked(int rnum);
-int domisc(void);
-
-
-/* main routine */
-int main(int argc, char **argv){
-  int rv;
-  cbstdiobin();
-  progname = argv[0];
-  if(argc < 2) usage();
-  rv = 0;
-  if(!strcmp(argv[1], "sort")){
-    rv = runsort(argc, argv);
-  } else if(!strcmp(argv[1], "strstr")){
-    rv = runstrstr(argc, argv);
-  } else if(!strcmp(argv[1], "list")){
-    rv = runlist(argc, argv);
-  } else if(!strcmp(argv[1], "map")){
-    rv = runmap(argc, argv);
-  } else if(!strcmp(argv[1], "heap")){
-    rv = runheap(argc, argv);
-  } else if(!strcmp(argv[1], "wicked")){
-    rv = runwicked(argc, argv);
-  } else if(!strcmp(argv[1], "misc")){
-    rv = runmisc(argc, argv);
-  } else {
-    usage();
-  }
-  return rv;
-}
-
-
-/* print the usage and exit */
-void usage(void){
-  fprintf(stderr, "%s: test cases for Cabin\n", progname);
-  fprintf(stderr, "\n");
-  fprintf(stderr, "usage:\n");
-  fprintf(stderr, "  %s sort [-d] rnum\n", progname);
-  fprintf(stderr, "  %s strstr [-d] rnum\n", progname);
-  fprintf(stderr, "  %s list [-d] rnum\n", progname);
-  fprintf(stderr, "  %s map [-d] rnum [bnum]\n", progname);
-  fprintf(stderr, "  %s heap [-d] rnum [top]\n", progname);
-  fprintf(stderr, "  %s wicked rnum\n", progname);
-  fprintf(stderr, "  %s misc\n", progname);
-  fprintf(stderr, "\n");
-  exit(1);
-}
-
-
-/* parse arguments of sort command */
-int runsort(int argc, char **argv){
-  int i, rnum, disp, rv;
-  char *rstr;
-  rstr = NULL;
-  rnum = 0;
-  disp = FALSE;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        disp = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!rstr){
-      rstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  rv = dosort(rnum, disp);
-  return rv;
-}
-
-
-/* parse arguments of strstr command */
-int runstrstr(int argc, char **argv){
-  int i, rnum, disp, rv;
-  char *rstr;
-  rstr = NULL;
-  rnum = 0;
-  disp = FALSE;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        disp = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!rstr){
-      rstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  rv = dostrstr(rnum, disp);
-  return rv;
-}
-
-
-/* parse arguments of list command */
-int runlist(int argc, char **argv){
-  int i, rnum, disp, rv;
-  char *rstr;
-  rstr = NULL;
-  rnum = 0;
-  disp = FALSE;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        disp = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!rstr){
-      rstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  rv = dolist(rnum, disp);
-  return rv;
-}
-
-
-/* parse arguments of map command */
-int runmap(int argc, char **argv){
-  int i, rnum, bnum, disp, rv;
-  char *rstr, *bstr;
-  rstr = NULL;
-  bstr = NULL;
-  rnum = 0;
-  bnum = -1;
-  disp = FALSE;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        disp = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!rstr){
-      rstr = argv[i];
-    } else if(!bstr){
-      bstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  if(bstr) bnum = atoi(bstr);
-  rv = domap(rnum, bnum, disp);
-  return rv;
-}
-
-
-/* parse arguments of heap command */
-int runheap(int argc, char **argv){
-  int i, rnum, max, disp, rv;
-  char *rstr, *mstr;
-  rstr = NULL;
-  mstr = NULL;
-  rnum = 0;
-  max = -1;
-  disp = FALSE;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-d")){
-        disp = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!rstr){
-      rstr = argv[i];
-    } else if(!mstr){
-      mstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  if(mstr) max = atoi(mstr);
-  if(max < 0) max = rnum;
-  rv = doheap(rnum, max, disp);
-  rv = 0;
-  return rv;
-}
-
-
-/* parse arguments of wicked command */
-int runwicked(int argc, char **argv){
-  int i, rnum, rv;
-  char *rstr;
-  rstr = NULL;
-  rnum = 0;
-  for(i = 2; i < argc; i++){
-    if(argv[i][0] == '-'){
-      usage();
-    } else if(!rstr){
-      rstr = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!rstr) usage();
-  rnum = atoi(rstr);
-  if(rnum < 1) usage();
-  rv = dowicked(rnum);
-  return rv;
-}
-
-
-/* parse arguments of misc command */
-int runmisc(int argc, char **argv){
-  int rv;
-  rv = domisc();
-  return rv;
-}
-
-
-/* print formatted string and flush the buffer */
-int printfflush(const char *format, ...){
-  va_list ap;
-  int rv;
-  va_start(ap, format);
-  rv = vprintf(format, ap);
-  if(fflush(stdout) == EOF) rv = -1;
-  va_end(ap);
-  return rv;
-}
-
-
-/* comparing function for strings */
-int strpcmp(const void *ap, const void *bp){
-  return strcmp(*(char **)ap, *(char **)bp);
-}
-
-
-/* comparing function for integers */
-int intpcmp(const void *ap, const void *bp){
-  return *(int *)ap - *(int *)bp;
-}
-
-
-/* pseudo random number generator */
-int myrand(void){
-  static int cnt = 0;
-  if(cnt == 0) srand(time(NULL));
-  return (rand() * rand() + (rand() >> (sizeof(int) * 4)) + (cnt++)) & INT_MAX;
-}
-
-
-/* perform sort command */
-int dosort(int rnum, int disp){
-  char **ivector1, **ivector2, **ivector3, **ivector4, **ivector5;
-  char buf[RECBUFSIZ];
-  int i, len, err;
-  if(!disp) printfflush("<Sorting Test>\n  rnum=%d\n\n", rnum);
-  ivector1 = cbmalloc(rnum * sizeof(ivector1[0]));
-  ivector2 = cbmalloc(rnum * sizeof(ivector2[0]));
-  ivector3 = cbmalloc(rnum * sizeof(ivector3[0]));
-  ivector4 = cbmalloc(rnum * sizeof(ivector4[0]));
-  ivector5 = cbmalloc(rnum * sizeof(ivector5[0]));
-  err = FALSE;
-  for(i = 0; i < rnum; i++){
-    len = sprintf(buf, "%08d", myrand() % rnum + 1);
-    ivector1[i] = cbmemdup(buf, len);
-    ivector2[i] = cbmemdup(buf, len);
-    ivector3[i] = cbmemdup(buf, len);
-    ivector4[i] = cbmemdup(buf, len);
-    ivector5[i] = cbmemdup(buf, len);
-  }
-  if(!disp) printfflush("Sorting with insert sort ... ");
-  cbisort(ivector1, rnum, sizeof(ivector1[0]), strpcmp);
-  if(!disp) printfflush("ok\n");
-  if(!disp) printfflush("Sorting with shell sort ... ");
-  cbssort(ivector2, rnum, sizeof(ivector2[0]), strpcmp);
-  if(!disp) printfflush("ok\n");
-  if(!disp) printfflush("Sorting with heap sort ... ");
-  cbhsort(ivector3, rnum, sizeof(ivector3[0]), strpcmp);
-  if(!disp) printfflush("ok\n");
-  if(!disp) printfflush("Sorting with quick sort ... ");
-  cbqsort(ivector4, rnum, sizeof(ivector4[0]), strpcmp);
-  if(!disp) printfflush("ok\n");
-  for(i = 0; i < rnum; i++){
-    if(disp) printfflush("%s\t%s\t%s\t%s\t[%s]\n",
-                        ivector1[i], ivector2[i], ivector3[i], ivector4[i], ivector5[i]);
-    if(strcmp(ivector1[i], ivector2[i])) err = TRUE;
-    if(strcmp(ivector1[i], ivector3[i])) err = TRUE;
-    if(strcmp(ivector1[i], ivector4[i])) err = TRUE;
-    free(ivector1[i]);
-    free(ivector2[i]);
-    free(ivector3[i]);
-    free(ivector4[i]);
-    free(ivector5[i]);
-  }
-  free(ivector1);
-  free(ivector2);
-  free(ivector3);
-  free(ivector4);
-  free(ivector5);
-  if(err) fprintf(stderr, "%s: sorting failed\n", progname);
-  if(!disp && !err) printfflush("all ok\n\n");
-  return err ? 1 : 0;
-}
-
-
-/* perform strstr command */
-int dostrstr(int rnum, int disp){
-  char *text, buf[RECBUFSIZ], *std, *kmp, *bm;
-  int i, j, len, err;
-  text = cbmalloc(TEXTBUFSIZ);
-  for(i = 0; i < TEXTBUFSIZ - 1; i++){
-    text[i] = 'a' + myrand() % ('z' - 'a');
-  }
-  text[i] = '\0';
-  err = FALSE;
-  if(!disp) printfflush("Locating substrings ... ");
-  for(i = 0; i < rnum; i++){
-    len = myrand() % (RECBUFSIZ - 1);
-    for(j = 0; j < len; j++){
-      buf[j] = 'a' + myrand() % ('z' - 'a');
-    }
-    buf[j] = 0;
-    std = strstr(text, buf);
-    kmp = cbstrstrkmp(text, buf);
-    bm = cbstrstrbm(text, buf);
-    if(kmp != std || bm != std){
-      err = TRUE;
-      break;
-    }
-    if(disp && std) printf("%s\n", buf);
-  }
-  if(err) fprintf(stderr, "%s: string scanning failed\n", progname);
-  if(!disp && !err){
-    printfflush("ok\n");
-    printfflush("all ok\n\n");
-  }
-  free(text);
-  return err ? 1 : 0;
-}
-
-
-/* perform list command */
-int dolist(int rnum, int disp){
-  CBLIST *list;
-  const char *vbuf;
-  char buf[RECBUFSIZ], *tmp;
-  int i, err, len, vsiz;
-  if(!disp) printfflush("<List Writing Test>\n  rnum=%d\n\n", rnum);
-  list = cblistopen();
-  err = FALSE;
-  for(i = 1; i <= rnum; i++){
-    len = sprintf(buf, "%08d", i);
-    cblistpush(list, buf, len);
-    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
-      putchar('.');
-      fflush(stdout);
-      if(i == rnum || i % (rnum / 10) == 0){
-        printfflush(" (%08d)\n", i);
-      }
-    }
-  }
-  if(disp){
-    for(i = 0; i < cblistnum(list); i++){
-      if((vbuf = cblistval(list, i, &vsiz)) != NULL){
-        printfflush("%s:%d\n", vbuf, vsiz);
-      } else {
-        fprintf(stderr, "%s: val error\n", progname);
-        err = TRUE;
-        break;
-      }
-    }
-    printfflush("\n");
-    while((tmp = cblistpop(list, &vsiz)) != NULL){
-      printfflush("%s:%d\n", tmp, vsiz);
-      free(tmp);
-    }
-  }
-  cblistclose(list);
-  if(!disp && !err) printfflush("ok\n\n");
-  return err ? 1 : 0;
-}
-
-
-/* perform list command */
-int domap(int rnum, int bnum, int disp){
-  CBMAP *map;
-  const char *kbuf, *vbuf;
-  char buf[RECBUFSIZ];
-  int i, err, len, ksiz, vsiz;
-  if(!disp) printfflush("<Map Writing Test>\n  rnum=%d  bnum=%d\n\n", rnum, bnum);
-  map = bnum > 0 ? cbmapopenex(bnum) : cbmapopen();
-  err = FALSE;
-  for(i = 1; i <= rnum; i++){
-    len = sprintf(buf, "%08d", i);
-    if(!cbmapput(map, buf, len, buf, len, FALSE)){
-      fprintf(stderr, "%s: put error\n", progname);
-      err = TRUE;
-      break;
-    }
-    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
-      putchar('.');
-      fflush(stdout);
-      if(i == rnum || i % (rnum / 10) == 0){
-        printfflush(" (%08d)\n", i);
-      }
-    }
-  }
-  if(disp){
-    for(i = 1; i <= rnum; i++){
-      len = sprintf(buf, "%08d", i);
-      if((vbuf = cbmapget(map, buf, len, &vsiz)) != NULL){
-        printfflush("%s:%d\t%s:%d\n", buf, len, vbuf, vsiz);
-      } else {
-        fprintf(stderr, "%s: get error\n", progname);
-      }
-    }
-    printfflush("\n");
-    cbmapiterinit(map);
-    while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
-      vbuf = cbmapiterval(kbuf, &vsiz);
-      printfflush("%s:%d\t%s:%d\n", kbuf, ksiz, vbuf, vsiz);
-    }
-  }
-  cbmapclose(map);
-  if(!disp && !err) printfflush("ok\n\n");
-  return err ? 1 : 0;
-}
-
-
-/* perform heap command */
-int doheap(int rnum, int max, int disp){
-  CBHEAP *heap;
-  int *orig, *ary;
-  int i, err, num, anum;
-  if(!disp) printfflush("<Heap Writing Test>\n  rnum=%d  max=%d\n\n", rnum, max);
-  orig = disp ? cbmalloc(rnum * sizeof(int) + 1) : NULL;
-  heap = cbheapopen(sizeof(int), max, intpcmp);
-  err = FALSE;
-  for(i = 1; i <= rnum; i++){
-    num = myrand() % rnum + 1;
-    if(orig) orig[i-1] = num;
-    cbheapinsert(heap, &num);
-    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
-      putchar('.');
-      fflush(stdout);
-      if(i == rnum || i % (rnum / 10) == 0){
-        printfflush(" (%08d)\n", i);
-      }
-    }
-  }
-  if(disp){
-    for(i = 0; i < cbheapnum(heap); i++){
-      printf("%d\n", *(int *)cbheapval(heap, i));
-    }
-    printf("\n");
-    qsort(orig, rnum, sizeof(int), intpcmp);
-    ary = (int *)cbheaptomalloc(heap, &anum);
-    if(anum != rnum && anum != max) err = TRUE;
-    for(i = 0; i < anum; i++){
-      printf("%d\t%d\n", ary[i], orig[i]);
-      if(ary[i] != orig[i]) err = TRUE;
-    }
-    free(ary);
-  } else {
-    cbheapclose(heap);
-  }
-  free(orig);
-  if(!disp && !err) printfflush("ok\n\n");
-  return err ? 1 : 0;
-}
-
-
-/* perform wicked command */
-int dowicked(int rnum){
-  CBLIST *list;
-  CBMAP *map;
-  int i, len;
-  char buf[RECBUFSIZ], *tmp;
-  printfflush("<Wicked Writing Test>\n  rnum=%d\n\n", rnum);
-  list = cblistopen();
-  for(i = 1; i <= rnum; i++){
-    len = sprintf(buf, "%d", myrand() % rnum + 1);
-    switch(myrand() % 16){
-    case 0:
-      free(cblistpop(list, NULL));
-      putchar('O');
-      break;
-    case 1:
-      cblistunshift(list, buf, len);
-      putchar('U');
-      break;
-    case 2:
-      free(cblistshift(list, NULL));
-      putchar('S');
-      break;
-    case 3:
-      cblistinsert(list, myrand() % (cblistnum(list) + 1), buf, len);
-      putchar('I');
-      break;
-    case 4:
-      free(cblistremove(list, myrand() % (cblistnum(list) + 1), NULL));
-      putchar('R');
-      break;
-    case 5:
-      cblistover(list, myrand() % (cblistnum(list) + 1), buf, len);
-      putchar('V');
-      break;
-    case 6:
-      tmp = cbmemdup(buf, len);
-      cblistpushbuf(list, tmp, len);
-      putchar('B');
-      break;
-    default:
-      cblistpush(list, buf, len);
-      putchar('P');
-      break;
-    }
-    if(i % 50 == 0) printfflush(" (%08d)\n", i);
-  }
-  cblistclose(list);
-  map = cbmapopen();
-  for(i = 1; i <= rnum; i++){
-    len = sprintf(buf, "%d", myrand() % rnum + 1);
-    switch(myrand() % 16){
-    case 0:
-      cbmapput(map, buf, len, buf, len, FALSE);
-      putchar('I');
-      break;
-    case 1:
-      cbmapputcat(map, buf, len, buf, len);
-      putchar('C');
-      break;
-    case 2:
-      cbmapget(map, buf, len, NULL);
-      putchar('V');
-      break;
-    case 3:
-      cbmapout(map, buf, len);
-      putchar('D');
-      break;
-    case 4:
-      cbmapmove(map, buf, len, myrand() % 2);
-      putchar('M');
-      break;
-    default:
-      cbmapput(map, buf, len, buf, len, TRUE);
-      putchar('O');
-      break;
-    }
-    if(i % 50 == 0) printfflush(" (%08d)\n", i);
-  }
-  cbmapclose(map);
-  printfflush("ok\n\n");
-  return 0;
-}
-
-
-/* perform misc command */
-int domisc(void){
-  CBDATUM *odatum, *ndatum;
-  CBLIST *olist, *nlist, *elems, *glist;
-  CBMAP *omap, *nmap, *pairs, *gmap;
-  int i, j, ssiz, osiz, tsiz, jl;
-  char kbuf[RECBUFSIZ], vbuf[RECBUFSIZ], *sbuf, spbuf[1024], *tmp, *orig, renc[64];
-  const char *op, *np;
-  time_t t;
-  printfflush("<Miscellaneous Test>\n\n");
-  printfflush("Checking memory allocation ... ");
-  tmp = cbmalloc(1024);
-  for(i = 1; i <= 65536; i *= 2){
-    tmp = cbrealloc(tmp, i);
-  }
-  cbfree(tmp);
-  printfflush("ok\n");
-  printfflush("Checking basic datum ... ");
-  odatum = cbdatumopen("x", -1);
-  for(i = 0; i < 1000; i++){
-    cbdatumcat(odatum, "x", 1);
-  }
-  cbdatumclose(odatum);
-  tmp = cbmalloc(3);
-  memcpy(tmp, "abc", 3);
-  odatum = cbdatumopenbuf(tmp, 3);
-  for(i = 0; i < 1000; i++){
-    cbdatumcat(odatum, ".", 1);
-  }
-  ndatum = cbdatumdup(odatum);
-  for(i = 0; i < 1000; i++){
-    cbdatumcat(ndatum, "*", 1);
-  }
-  for(i = 0; i < 1000; i++){
-    tmp = cbmalloc(3);
-    memcpy(tmp, "123", 3);
-    cbdatumsetbuf(ndatum, tmp, 3);
-  }
-  cbdatumprintf(ndatum, "[%s\t%08d\t%08o\t%08x\t%08.1f\t%@\t%?\t%:]",
-                "mikio", 1978, 1978, 1978, 1978.0211, "<>&#!+-*/%", "<>&#!+-*/%", "<>&#!+-*/%");
-  cbdatumclose(ndatum);
-  cbdatumclose(odatum);
-  printfflush("ok\n");
-  printfflush("Checking serialization of list ... ");
-  olist = cblistopen();
-  for(i = 1; i <= 1000; i++){
-    sprintf(vbuf, "%d", i);
-    cblistpush(olist, vbuf, -1);
-  }
-  sbuf = cblistdump(olist, &ssiz);
-  nlist = cblistload(sbuf, ssiz);
-  free(sbuf);
-  for(i = 0; i < cblistnum(olist); i++){
-    op = cblistval(olist, i, NULL);
-    np = cblistval(nlist, i, NULL);
-    if(!op || !np || strcmp(op, np)){
-      cblistclose(nlist);
-      cblistclose(olist);
-      fprintf(stderr, "%s: validation failed\n", progname);
-      return 1;
-    }
-  }
-  cblistclose(nlist);
-  cblistclose(olist);
-  printfflush("ok\n");
-  printfflush("Checking serialization of map ... ");
-  omap = cbmapopen();
-  for(i = 1; i <= 1000; i++){
-    sprintf(kbuf, "%X", i);
-    sprintf(vbuf, "[%d]", i);
-    cbmapput(omap, kbuf, -1, vbuf, -1, TRUE);
-  }
-  sbuf = cbmapdump(omap, &ssiz);
-  nmap = cbmapload(sbuf, ssiz);
-  free(cbmaploadone(sbuf, ssiz, "1", 2, &tsiz));
-  free(cbmaploadone(sbuf, ssiz, "33", 2, &tsiz));
-  free(sbuf);
-  cbmapiterinit(omap);
-  while((op = cbmapiternext(omap, NULL)) != NULL){
-    if(!(np = cbmapget(nmap, op, -1, NULL))){
-      cbmapclose(nmap);
-      cbmapclose(omap);
-      fprintf(stderr, "%s: validation failed\n", progname);
-      return 1;
-    }
-  }
-  cbmapclose(nmap);
-  cbmapclose(omap);
-  printfflush("ok\n");
-  printfflush("Checking string utilities ... ");
-  sprintf(spbuf, "[%08d/%08o/%08u/%08x/%08X/%08.3e/%08.3E/%08.3f/%08.3g/%08.3G/%c/%s/%%]",
-          123456, 123456, 123456, 123456, 123456,
-          123456.789, 123456.789, 123456.789, 123456.789, 123456.789,
-          'A', "hoge");
-  tmp = cbsprintf("[%08d/%08o/%08u/%08x/%08X/%08.3e/%08.3E/%08.3f/%08.3g/%08.3G/%c/%s/%%]",
-                  123456, 123456, 123456, 123456, 123456,
-                  123456.789, 123456.789, 123456.789, 123456.789, 123456.789,
-                  'A', "hoge");
-  while(strcmp(spbuf, tmp)){
-    free(tmp);
-    fprintf(stderr, "%s: cbsprintf is invalid\n", progname);
-    return 1;
-  }
-  free(tmp);
-  pairs = cbmapopen();
-  cbmapput(pairs, "aa", -1, "AAA", -1, TRUE);
-  cbmapput(pairs, "bb", -1, "BBB", -1, TRUE);
-  cbmapput(pairs, "cc", -1, "CCC", -1, TRUE);
-  cbmapput(pairs, "ZZZ", -1, "z", -1, TRUE);
-  tmp = cbreplace("[aaaaabbbbbcccccdddddZZZZ]", pairs);
-  if(strcmp(tmp, "[AAAAAAaBBBBBBbCCCCCCcdddddzZ]")){
-    free(tmp);
-    cbmapclose(pairs);
-    fprintf(stderr, "%s: cbreplace is invalid\n", progname);
-    return 1;
-  }
-  free(tmp);
-  cbmapclose(pairs);
-  elems = cbsplit("aa bb,ccc-dd,", -1, " ,-");
-  if(cblistnum(elems) != 5 || strcmp(cblistval(elems, 0, NULL), "aa") ||
-     strcmp(cblistval(elems, 1, NULL), "bb") || strcmp(cblistval(elems, 2, NULL), "ccc") ||
-     strcmp(cblistval(elems, 3, NULL), "dd") || strcmp(cblistval(elems, 4, NULL), "")){
-    cblistclose(elems);
-    fprintf(stderr, "%s: cbsplit is invalid\n", progname);
-    return 1;
-  }
-  cblistclose(elems);
-  if(cbstricmp("abc", "ABC") || !cbstricmp("abc", "abcd")){
-    fprintf(stderr, "%s: cbstricmp is invalid\n", progname);
-    return 1;
-  }
-  if(!cbstrfwmatch("abcd", "abc") || cbstrfwmatch("abc", "abcd")){
-    fprintf(stderr, "%s: cbstrfwmatch is invalid\n", progname);
-    return 1;
-  }
-  if(!cbstrfwimatch("abcd", "ABC") || cbstrfwmatch("abc", "ABCD")){
-    fprintf(stderr, "%s: cbstrfwimatch is invalid\n", progname);
-    return 1;
-  }
-  if(!cbstrbwmatch("dcba", "cba") || cbstrbwmatch("cba", "dcba")){
-    fprintf(stderr, "%s: cbstrbwmatch is invalid\n", progname);
-    return 1;
-  }
-  if(!cbstrbwimatch("dcba", "CBA") || cbstrbwimatch("cba", "DCBA")){
-    fprintf(stderr, "%s: cbstrbwimatch is invalid\n", progname);
-    return 1;
-  }
-  tmp = cbmemdup(" \r\n[Quick   Database Manager]\r\n ", -1);
-  if(cbstrtoupper(tmp) != tmp || strcmp(tmp, " \r\n[QUICK   DATABASE MANAGER]\r\n ")){
-    free(tmp);
-    fprintf(stderr, "%s: cbstrtoupper is invalid\n", progname);
-    return 1;
-  }
-  if(cbstrtolower(tmp) != tmp || strcmp(tmp, " \r\n[quick   database manager]\r\n ")){
-    free(tmp);
-    fprintf(stderr, "%s: cbstrtolower is invalid\n", progname);
-    return 1;
-  }
-  if(cbstrtrim(tmp) != tmp || strcmp(tmp, "[quick   database manager]")){
-    free(tmp);
-    fprintf(stderr, "%s: cbstrtrim is invalid\n", progname);
-    return 1;
-  }
-  if(cbstrsqzspc(tmp) != tmp || strcmp(tmp, "[quick database manager]")){
-    free(tmp);
-    fprintf(stderr, "%s: cbstrsqzspc is invalid\n", progname);
-    return 1;
-  }
-  cbstrcututf(tmp, 5);
-  if(cbstrcountutf(tmp) != 5){
-    free(tmp);
-    fprintf(stderr, "%s: cbstrcututf or cbstrcountutf is invalid\n", progname);
-    return 1;
-  }
-  free(tmp);
-  printfflush("ok\n");
-  printfflush("Checking encoding utilities ... ");
-  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
-  tmp = cbbaseencode(spbuf, -1);
-  orig = cbbasedecode(tmp, &osiz);
-  if(osiz != strlen(spbuf) || strcmp(orig, spbuf)){
-    free(orig);
-    free(tmp);
-    fprintf(stderr, "%s: Base64 encoding is invalid\n", progname);
-    return 1;
-  }
-  free(orig);
-  free(tmp);
-  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
-  tmp = cbquoteencode(spbuf, -1);
-  orig = cbquotedecode(tmp, &osiz);
-  if(osiz != strlen(spbuf) || strcmp(orig, spbuf)){
-    free(orig);
-    free(tmp);
-    fprintf(stderr, "%s: quoted-printable encoding is invalid\n", progname);
-    return 1;
-  }
-  free(orig);
-  free(tmp);
-  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
-  tmp = cbmimeencode(spbuf, "ISO-8859-1", TRUE);
-  orig = cbmimedecode(tmp, renc);
-  if(osiz != strlen(spbuf) || strcmp(orig, spbuf) || strcmp(renc, "ISO-8859-1")){
-    free(orig);
-    free(tmp);
-    fprintf(stderr, "%s: MIME encoding is invalid\n", progname);
-    return 1;
-  }
-  free(orig);
-  free(tmp);
-  strcpy(spbuf, "\"He says...\r\n\"\"What PROGRAM are they watching?\"\"\"");
-  tmp = cbcsvunescape(spbuf);
-  orig = cbcsvescape(tmp);
-  if(strcmp(orig, spbuf)){
-    free(orig);
-    free(tmp);
-    fprintf(stderr, "%s: CSV escaping is invalid\n", progname);
-    return 1;
-  }
-  free(orig);
-  free(tmp);
-  strcpy(spbuf, "<Nuts&Milk> is "very" surfin'!");
-  tmp = cbxmlunescape(spbuf);
-  orig = cbxmlescape(tmp);
-  if(strcmp(orig, spbuf)){
-    free(orig);
-    free(tmp);
-    fprintf(stderr, "%s: XML escaping is invalid\n", progname);
-    return 1;
-  }
-  free(orig);
-  free(tmp);
-  printfflush("ok\n");
-  printfflush("Checking date utilities ... ");
-  for(i = 0; i < 200; i++){
-    jl = (myrand() % 23) * 1800;
-    if(myrand() % 2 == 0) jl *= -1;
-    t = myrand() % (INT_MAX - 3600 * 24 * 365 * 6) + 3600 * 24 * 365 * 5;
-    tmp = cbdatestrwww(t, jl);
-    t = cbstrmktime(tmp);
-    orig = cbdatestrwww(t, jl);
-    if(strcmp(orig, tmp)){
-      free(orig);
-      free(tmp);
-      fprintf(stderr, "%s: W3CDTF formatter is invalid\n", progname);
-      return 1;
-    }
-    free(orig);
-    free(tmp);
-    tmp = cbdatestrhttp(t, jl);
-    t = cbstrmktime(tmp);
-    orig = cbdatestrhttp(t, jl);
-    if(strcmp(orig, tmp)){
-      free(orig);
-      free(tmp);
-      fprintf(stderr, "%s: RFC 822 date formatter is invalid\n", progname);
-      return 1;
-    }
-    free(orig);
-    free(tmp);
-  }
-  printfflush("ok\n");
-  printfflush("Checking the global garbage collector ... ");
-  for(i = 0; i < 512; i++){
-    glist = cblistopen();
-    cbglobalgc(glist, (void (*)(void *))cblistclose);
-    for(j = 0; j < 10; j++){
-      sprintf(kbuf, "%08d", j);
-      cblistpush(glist, kbuf, -1);
-    }
-    gmap = cbmapopen();
-    cbglobalgc(gmap, (void (*)(void *))cbmapclose);
-    for(j = 0; j < 10; j++){
-      sprintf(kbuf, "%08d", j);
-      cbmapput(gmap, kbuf, -1, kbuf, -1, TRUE);
-    }
-    if(myrand() % 64 == 0){
-      cbvmemavail(100);
-      cbggcsweep();
-    }
-  }
-  printfflush("ok\n");
-  printfflush("all ok\n\n");
-  return 0;
-}
-
-
-
-/* END OF FILE */

Copied: box/trunk/qdbm/cbtest.c (from rev 2716, box/trunk/qdbm/cbtest.c)
===================================================================
--- box/trunk/qdbm/cbtest.c	                        (rev 0)
+++ box/trunk/qdbm/cbtest.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,924 @@
+/*************************************************************************************************
+ * Test cases of Cabin
+ *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
+ * This file is part of QDBM, Quick Database Manager.
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
+ * Lesser General Public License as published by the Free Software Foundation; either version
+ * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
+ * details.
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ *************************************************************************************************/
+
+
+#include <cabin.h>
+#include <stdio.h>
+#include <cabin.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <time.h>
+
+#undef TRUE
+#define TRUE           1                 /* boolean true */
+#undef FALSE
+#define FALSE          0                 /* boolean false */
+
+#define RECBUFSIZ      32                /* buffer for records */
+#define TEXTBUFSIZ     262144            /* buffer for text */
+
+
+/* for RISC OS */
+#if defined(__riscos__) || defined(__riscos)
+#include <unixlib/local.h>
+int __riscosify_control = __RISCOSIFY_NO_PROCESS;
+#endif
+
+
+/* global variables */
+const char *progname;                    /* program name */
+
+
+/* function prototypes */
+int main(int argc, char **argv);
+void usage(void);
+int runsort(int argc, char **argv);
+int runstrstr(int argc, char **argv);
+int runlist(int argc, char **argv);
+int runmap(int argc, char **argv);
+int runheap(int argc, char **argv);
+int runwicked(int argc, char **argv);
+int runmisc(int argc, char **argv);
+int printfflush(const char *format, ...);
+int strpcmp(const void *ap, const void *bp);
+int intpcmp(const void *ap, const void *bp);
+int myrand(void);
+int dosort(int rnum, int disp);
+int dostrstr(int rnum, int disp);
+int dolist(int rnum, int disp);
+int domap(int rnum, int bnum, int disp);
+int doheap(int rnum, int max, int disp);
+int dowicked(int rnum);
+int domisc(void);
+
+
+/* main routine */
+int main(int argc, char **argv){
+  int rv;
+  cbstdiobin();
+  progname = argv[0];
+  if(argc < 2) usage();
+  rv = 0;
+  if(!strcmp(argv[1], "sort")){
+    rv = runsort(argc, argv);
+  } else if(!strcmp(argv[1], "strstr")){
+    rv = runstrstr(argc, argv);
+  } else if(!strcmp(argv[1], "list")){
+    rv = runlist(argc, argv);
+  } else if(!strcmp(argv[1], "map")){
+    rv = runmap(argc, argv);
+  } else if(!strcmp(argv[1], "heap")){
+    rv = runheap(argc, argv);
+  } else if(!strcmp(argv[1], "wicked")){
+    rv = runwicked(argc, argv);
+  } else if(!strcmp(argv[1], "misc")){
+    rv = runmisc(argc, argv);
+  } else {
+    usage();
+  }
+  return rv;
+}
+
+
+/* print the usage and exit */
+void usage(void){
+  fprintf(stderr, "%s: test cases for Cabin\n", progname);
+  fprintf(stderr, "\n");
+  fprintf(stderr, "usage:\n");
+  fprintf(stderr, "  %s sort [-d] rnum\n", progname);
+  fprintf(stderr, "  %s strstr [-d] rnum\n", progname);
+  fprintf(stderr, "  %s list [-d] rnum\n", progname);
+  fprintf(stderr, "  %s map [-d] rnum [bnum]\n", progname);
+  fprintf(stderr, "  %s heap [-d] rnum [top]\n", progname);
+  fprintf(stderr, "  %s wicked rnum\n", progname);
+  fprintf(stderr, "  %s misc\n", progname);
+  fprintf(stderr, "\n");
+  exit(1);
+}
+
+
+/* parse arguments of sort command */
+int runsort(int argc, char **argv){
+  int i, rnum, disp, rv;
+  char *rstr;
+  rstr = NULL;
+  rnum = 0;
+  disp = FALSE;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        disp = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!rstr){
+      rstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  rv = dosort(rnum, disp);
+  return rv;
+}
+
+
+/* parse arguments of strstr command */
+int runstrstr(int argc, char **argv){
+  int i, rnum, disp, rv;
+  char *rstr;
+  rstr = NULL;
+  rnum = 0;
+  disp = FALSE;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        disp = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!rstr){
+      rstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  rv = dostrstr(rnum, disp);
+  return rv;
+}
+
+
+/* parse arguments of list command */
+int runlist(int argc, char **argv){
+  int i, rnum, disp, rv;
+  char *rstr;
+  rstr = NULL;
+  rnum = 0;
+  disp = FALSE;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        disp = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!rstr){
+      rstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  rv = dolist(rnum, disp);
+  return rv;
+}
+
+
+/* parse arguments of map command */
+int runmap(int argc, char **argv){
+  int i, rnum, bnum, disp, rv;
+  char *rstr, *bstr;
+  rstr = NULL;
+  bstr = NULL;
+  rnum = 0;
+  bnum = -1;
+  disp = FALSE;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        disp = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!rstr){
+      rstr = argv[i];
+    } else if(!bstr){
+      bstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  if(bstr) bnum = atoi(bstr);
+  rv = domap(rnum, bnum, disp);
+  return rv;
+}
+
+
+/* parse arguments of heap command */
+int runheap(int argc, char **argv){
+  int i, rnum, max, disp, rv;
+  char *rstr, *mstr;
+  rstr = NULL;
+  mstr = NULL;
+  rnum = 0;
+  max = -1;
+  disp = FALSE;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      if(!strcmp(argv[i], "-d")){
+        disp = TRUE;
+      } else {
+        usage();
+      }
+    } else if(!rstr){
+      rstr = argv[i];
+    } else if(!mstr){
+      mstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  if(mstr) max = atoi(mstr);
+  if(max < 0) max = rnum;
+  rv = doheap(rnum, max, disp);
+  rv = 0;
+  return rv;
+}
+
+
+/* parse arguments of wicked command */
+int runwicked(int argc, char **argv){
+  int i, rnum, rv;
+  char *rstr;
+  rstr = NULL;
+  rnum = 0;
+  for(i = 2; i < argc; i++){
+    if(argv[i][0] == '-'){
+      usage();
+    } else if(!rstr){
+      rstr = argv[i];
+    } else {
+      usage();
+    }
+  }
+  if(!rstr) usage();
+  rnum = atoi(rstr);
+  if(rnum < 1) usage();
+  rv = dowicked(rnum);
+  return rv;
+}
+
+
+/* parse arguments of misc command */
+int runmisc(int argc, char **argv){
+  int rv;
+  rv = domisc();
+  return rv;
+}
+
+
+/* print formatted string and flush the buffer */
+int printfflush(const char *format, ...){
+  va_list ap;
+  int rv;
+  va_start(ap, format);
+  rv = vprintf(format, ap);
+  if(fflush(stdout) == EOF) rv = -1;
+  va_end(ap);
+  return rv;
+}
+
+
+/* comparing function for strings */
+int strpcmp(const void *ap, const void *bp){
+  return strcmp(*(char **)ap, *(char **)bp);
+}
+
+
+/* comparing function for integers */
+int intpcmp(const void *ap, const void *bp){
+  return *(int *)ap - *(int *)bp;
+}
+
+
+/* pseudo random number generator */
+int myrand(void){
+  static int cnt = 0;
+  if(cnt == 0) srand(time(NULL));
+  return (rand() * rand() + (rand() >> (sizeof(int) * 4)) + (cnt++)) & INT_MAX;
+}
+
+
+/* perform sort command */
+int dosort(int rnum, int disp){
+  char **ivector1, **ivector2, **ivector3, **ivector4, **ivector5;
+  char buf[RECBUFSIZ];
+  int i, len, err;
+  if(!disp) printfflush("<Sorting Test>\n  rnum=%d\n\n", rnum);
+  ivector1 = cbmalloc(rnum * sizeof(ivector1[0]));
+  ivector2 = cbmalloc(rnum * sizeof(ivector2[0]));
+  ivector3 = cbmalloc(rnum * sizeof(ivector3[0]));
+  ivector4 = cbmalloc(rnum * sizeof(ivector4[0]));
+  ivector5 = cbmalloc(rnum * sizeof(ivector5[0]));
+  err = FALSE;
+  for(i = 0; i < rnum; i++){
+    len = sprintf(buf, "%08d", myrand() % rnum + 1);
+    ivector1[i] = cbmemdup(buf, len);
+    ivector2[i] = cbmemdup(buf, len);
+    ivector3[i] = cbmemdup(buf, len);
+    ivector4[i] = cbmemdup(buf, len);
+    ivector5[i] = cbmemdup(buf, len);
+  }
+  if(!disp) printfflush("Sorting with insert sort ... ");
+  cbisort(ivector1, rnum, sizeof(ivector1[0]), strpcmp);
+  if(!disp) printfflush("ok\n");
+  if(!disp) printfflush("Sorting with shell sort ... ");
+  cbssort(ivector2, rnum, sizeof(ivector2[0]), strpcmp);
+  if(!disp) printfflush("ok\n");
+  if(!disp) printfflush("Sorting with heap sort ... ");
+  cbhsort(ivector3, rnum, sizeof(ivector3[0]), strpcmp);
+  if(!disp) printfflush("ok\n");
+  if(!disp) printfflush("Sorting with quick sort ... ");
+  cbqsort(ivector4, rnum, sizeof(ivector4[0]), strpcmp);
+  if(!disp) printfflush("ok\n");
+  for(i = 0; i < rnum; i++){
+    if(disp) printfflush("%s\t%s\t%s\t%s\t[%s]\n",
+                        ivector1[i], ivector2[i], ivector3[i], ivector4[i], ivector5[i]);
+    if(strcmp(ivector1[i], ivector2[i])) err = TRUE;
+    if(strcmp(ivector1[i], ivector3[i])) err = TRUE;
+    if(strcmp(ivector1[i], ivector4[i])) err = TRUE;
+    free(ivector1[i]);
+    free(ivector2[i]);
+    free(ivector3[i]);
+    free(ivector4[i]);
+    free(ivector5[i]);
+  }
+  free(ivector1);
+  free(ivector2);
+  free(ivector3);
+  free(ivector4);
+  free(ivector5);
+  if(err) fprintf(stderr, "%s: sorting failed\n", progname);
+  if(!disp && !err) printfflush("all ok\n\n");
+  return err ? 1 : 0;
+}
+
+
+/* perform strstr command */
+int dostrstr(int rnum, int disp){
+  char *text, buf[RECBUFSIZ], *std, *kmp, *bm;
+  int i, j, len, err;
+  text = cbmalloc(TEXTBUFSIZ);
+  for(i = 0; i < TEXTBUFSIZ - 1; i++){
+    text[i] = 'a' + myrand() % ('z' - 'a');
+  }
+  text[i] = '\0';
+  err = FALSE;
+  if(!disp) printfflush("Locating substrings ... ");
+  for(i = 0; i < rnum; i++){
+    len = myrand() % (RECBUFSIZ - 1);
+    for(j = 0; j < len; j++){
+      buf[j] = 'a' + myrand() % ('z' - 'a');
+    }
+    buf[j] = 0;
+    std = strstr(text, buf);
+    kmp = cbstrstrkmp(text, buf);
+    bm = cbstrstrbm(text, buf);
+    if(kmp != std || bm != std){
+      err = TRUE;
+      break;
+    }
+    if(disp && std) printf("%s\n", buf);
+  }
+  if(err) fprintf(stderr, "%s: string scanning failed\n", progname);
+  if(!disp && !err){
+    printfflush("ok\n");
+    printfflush("all ok\n\n");
+  }
+  free(text);
+  return err ? 1 : 0;
+}
+
+
+/* perform list command */
+int dolist(int rnum, int disp){
+  CBLIST *list;
+  const char *vbuf;
+  char buf[RECBUFSIZ], *tmp;
+  int i, err, len, vsiz;
+  if(!disp) printfflush("<List Writing Test>\n  rnum=%d\n\n", rnum);
+  list = cblistopen();
+  err = FALSE;
+  for(i = 1; i <= rnum; i++){
+    len = sprintf(buf, "%08d", i);
+    cblistpush(list, buf, len);
+    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
+      putchar('.');
+      fflush(stdout);
+      if(i == rnum || i % (rnum / 10) == 0){
+        printfflush(" (%08d)\n", i);
+      }
+    }
+  }
+  if(disp){
+    for(i = 0; i < cblistnum(list); i++){
+      if((vbuf = cblistval(list, i, &vsiz)) != NULL){
+        printfflush("%s:%d\n", vbuf, vsiz);
+      } else {
+        fprintf(stderr, "%s: val error\n", progname);
+        err = TRUE;
+        break;
+      }
+    }
+    printfflush("\n");
+    while((tmp = cblistpop(list, &vsiz)) != NULL){
+      printfflush("%s:%d\n", tmp, vsiz);
+      free(tmp);
+    }
+  }
+  cblistclose(list);
+  if(!disp && !err) printfflush("ok\n\n");
+  return err ? 1 : 0;
+}
+
+
+/* perform list command */
+int domap(int rnum, int bnum, int disp){
+  CBMAP *map;
+  const char *kbuf, *vbuf;
+  char buf[RECBUFSIZ];
+  int i, err, len, ksiz, vsiz;
+  if(!disp) printfflush("<Map Writing Test>\n  rnum=%d  bnum=%d\n\n", rnum, bnum);
+  map = bnum > 0 ? cbmapopenex(bnum) : cbmapopen();
+  err = FALSE;
+  for(i = 1; i <= rnum; i++){
+    len = sprintf(buf, "%08d", i);
+    if(!cbmapput(map, buf, len, buf, len, FALSE)){
+      fprintf(stderr, "%s: put error\n", progname);
+      err = TRUE;
+      break;
+    }
+    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
+      putchar('.');
+      fflush(stdout);
+      if(i == rnum || i % (rnum / 10) == 0){
+        printfflush(" (%08d)\n", i);
+      }
+    }
+  }
+  if(disp){
+    for(i = 1; i <= rnum; i++){
+      len = sprintf(buf, "%08d", i);
+      if((vbuf = cbmapget(map, buf, len, &vsiz)) != NULL){
+        printfflush("%s:%d\t%s:%d\n", buf, len, vbuf, vsiz);
+      } else {
+        fprintf(stderr, "%s: get error\n", progname);
+      }
+    }
+    printfflush("\n");
+    cbmapiterinit(map);
+    while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
+      vbuf = cbmapiterval(kbuf, &vsiz);
+      printfflush("%s:%d\t%s:%d\n", kbuf, ksiz, vbuf, vsiz);
+    }
+  }
+  cbmapclose(map);
+  if(!disp && !err) printfflush("ok\n\n");
+  return err ? 1 : 0;
+}
+
+
+/* perform heap command */
+int doheap(int rnum, int max, int disp){
+  CBHEAP *heap;
+  int *orig, *ary;
+  int i, err, num, anum;
+  if(!disp) printfflush("<Heap Writing Test>\n  rnum=%d  max=%d\n\n", rnum, max);
+  orig = disp ? cbmalloc(rnum * sizeof(int) + 1) : NULL;
+  heap = cbheapopen(sizeof(int), max, intpcmp);
+  err = FALSE;
+  for(i = 1; i <= rnum; i++){
+    num = myrand() % rnum + 1;
+    if(orig) orig[i-1] = num;
+    cbheapinsert(heap, &num);
+    if(!disp && rnum > 250 && i % (rnum / 250) == 0){
+      putchar('.');
+      fflush(stdout);
+      if(i == rnum || i % (rnum / 10) == 0){
+        printfflush(" (%08d)\n", i);
+      }
+    }
+  }
+  if(disp){
+    for(i = 0; i < cbheapnum(heap); i++){
+      printf("%d\n", *(int *)cbheapval(heap, i));
+    }
+    printf("\n");
+    qsort(orig, rnum, sizeof(int), intpcmp);
+    ary = (int *)cbheaptomalloc(heap, &anum);
+    if(anum != rnum && anum != max) err = TRUE;
+    for(i = 0; i < anum; i++){
+      printf("%d\t%d\n", ary[i], orig[i]);
+      if(ary[i] != orig[i]) err = TRUE;
+    }
+    free(ary);
+  } else {
+    cbheapclose(heap);
+  }
+  free(orig);
+  if(!disp && !err) printfflush("ok\n\n");
+  return err ? 1 : 0;
+}
+
+
+/* perform wicked command */
+int dowicked(int rnum){
+  CBLIST *list;
+  CBMAP *map;
+  int i, len;
+  char buf[RECBUFSIZ], *tmp;
+  printfflush("<Wicked Writing Test>\n  rnum=%d\n\n", rnum);
+  list = cblistopen();
+  for(i = 1; i <= rnum; i++){
+    len = sprintf(buf, "%d", myrand() % rnum + 1);
+    switch(myrand() % 16){
+    case 0:
+      free(cblistpop(list, NULL));
+      putchar('O');
+      break;
+    case 1:
+      cblistunshift(list, buf, len);
+      putchar('U');
+      break;
+    case 2:
+      free(cblistshift(list, NULL));
+      putchar('S');
+      break;
+    case 3:
+      cblistinsert(list, myrand() % (cblistnum(list) + 1), buf, len);
+      putchar('I');
+      break;
+    case 4:
+      free(cblistremove(list, myrand() % (cblistnum(list) + 1), NULL));
+      putchar('R');
+      break;
+    case 5:
+      cblistover(list, myrand() % (cblistnum(list) + 1), buf, len);
+      putchar('V');
+      break;
+    case 6:
+      tmp = cbmemdup(buf, len);
+      cblistpushbuf(list, tmp, len);
+      putchar('B');
+      break;
+    default:
+      cblistpush(list, buf, len);
+      putchar('P');
+      break;
+    }
+    if(i % 50 == 0) printfflush(" (%08d)\n", i);
+  }
+  cblistclose(list);
+  map = cbmapopen();
+  for(i = 1; i <= rnum; i++){
+    len = sprintf(buf, "%d", myrand() % rnum + 1);
+    switch(myrand() % 16){
+    case 0:
+      cbmapput(map, buf, len, buf, len, FALSE);
+      putchar('I');
+      break;
+    case 1:
+      cbmapputcat(map, buf, len, buf, len);
+      putchar('C');
+      break;
+    case 2:
+      cbmapget(map, buf, len, NULL);
+      putchar('V');
+      break;
+    case 3:
+      cbmapout(map, buf, len);
+      putchar('D');
+      break;
+    case 4:
+      cbmapmove(map, buf, len, myrand() % 2);
+      putchar('M');
+      break;
+    default:
+      cbmapput(map, buf, len, buf, len, TRUE);
+      putchar('O');
+      break;
+    }
+    if(i % 50 == 0) printfflush(" (%08d)\n", i);
+  }
+  cbmapclose(map);
+  printfflush("ok\n\n");
+  return 0;
+}
+
+
+/* perform misc command */
+int domisc(void){
+  CBDATUM *odatum, *ndatum;
+  CBLIST *olist, *nlist, *elems, *glist;
+  CBMAP *omap, *nmap, *pairs, *gmap;
+  int i, j, ssiz, osiz, tsiz, jl;
+  char kbuf[RECBUFSIZ], vbuf[RECBUFSIZ], *sbuf, spbuf[1024], *tmp, *orig, renc[64];
+  const char *op, *np;
+  time_t t;
+  printfflush("<Miscellaneous Test>\n\n");
+  printfflush("Checking memory allocation ... ");
+  tmp = cbmalloc(1024);
+  for(i = 1; i <= 65536; i *= 2){
+    tmp = cbrealloc(tmp, i);
+  }
+  cbfree(tmp);
+  printfflush("ok\n");
+  printfflush("Checking basic datum ... ");
+  odatum = cbdatumopen("x", -1);
+  for(i = 0; i < 1000; i++){
+    cbdatumcat(odatum, "x", 1);
+  }
+  cbdatumclose(odatum);
+  tmp = cbmalloc(3);
+  memcpy(tmp, "abc", 3);
+  odatum = cbdatumopenbuf(tmp, 3);
+  for(i = 0; i < 1000; i++){
+    cbdatumcat(odatum, ".", 1);
+  }
+  ndatum = cbdatumdup(odatum);
+  for(i = 0; i < 1000; i++){
+    cbdatumcat(ndatum, "*", 1);
+  }
+  for(i = 0; i < 1000; i++){
+    tmp = cbmalloc(3);
+    memcpy(tmp, "123", 3);
+    cbdatumsetbuf(ndatum, tmp, 3);
+  }
+  cbdatumprintf(ndatum, "[%s\t%08d\t%08o\t%08x\t%08.1f\t%@\t%?\t%:]",
+                "mikio", 1978, 1978, 1978, 1978.0211, "<>&#!+-*/%", "<>&#!+-*/%", "<>&#!+-*/%");
+  cbdatumclose(ndatum);
+  cbdatumclose(odatum);
+  printfflush("ok\n");
+  printfflush("Checking serialization of list ... ");
+  olist = cblistopen();
+  for(i = 1; i <= 1000; i++){
+    sprintf(vbuf, "%d", i);
+    cblistpush(olist, vbuf, -1);
+  }
+  sbuf = cblistdump(olist, &ssiz);
+  nlist = cblistload(sbuf, ssiz);
+  free(sbuf);
+  for(i = 0; i < cblistnum(olist); i++){
+    op = cblistval(olist, i, NULL);
+    np = cblistval(nlist, i, NULL);
+    if(!op || !np || strcmp(op, np)){
+      cblistclose(nlist);
+      cblistclose(olist);
+      fprintf(stderr, "%s: validation failed\n", progname);
+      return 1;
+    }
+  }
+  cblistclose(nlist);
+  cblistclose(olist);
+  printfflush("ok\n");
+  printfflush("Checking serialization of map ... ");
+  omap = cbmapopen();
+  for(i = 1; i <= 1000; i++){
+    sprintf(kbuf, "%X", i);
+    sprintf(vbuf, "[%d]", i);
+    cbmapput(omap, kbuf, -1, vbuf, -1, TRUE);
+  }
+  sbuf = cbmapdump(omap, &ssiz);
+  nmap = cbmapload(sbuf, ssiz);
+  free(cbmaploadone(sbuf, ssiz, "1", 2, &tsiz));
+  free(cbmaploadone(sbuf, ssiz, "33", 2, &tsiz));
+  free(sbuf);
+  cbmapiterinit(omap);
+  while((op = cbmapiternext(omap, NULL)) != NULL){
+    if(!(np = cbmapget(nmap, op, -1, NULL))){
+      cbmapclose(nmap);
+      cbmapclose(omap);
+      fprintf(stderr, "%s: validation failed\n", progname);
+      return 1;
+    }
+  }
+  cbmapclose(nmap);
+  cbmapclose(omap);
+  printfflush("ok\n");
+  printfflush("Checking string utilities ... ");
+  sprintf(spbuf, "[%08d/%08o/%08u/%08x/%08X/%08.3e/%08.3E/%08.3f/%08.3g/%08.3G/%c/%s/%%]",
+          123456, 123456, 123456, 123456, 123456,
+          123456.789, 123456.789, 123456.789, 123456.789, 123456.789,
+          'A', "hoge");
+  tmp = cbsprintf("[%08d/%08o/%08u/%08x/%08X/%08.3e/%08.3E/%08.3f/%08.3g/%08.3G/%c/%s/%%]",
+                  123456, 123456, 123456, 123456, 123456,
+                  123456.789, 123456.789, 123456.789, 123456.789, 123456.789,
+                  'A', "hoge");
+  while(strcmp(spbuf, tmp)){
+    free(tmp);
+    fprintf(stderr, "%s: cbsprintf is invalid\n", progname);
+    return 1;
+  }
+  free(tmp);
+  pairs = cbmapopen();
+  cbmapput(pairs, "aa", -1, "AAA", -1, TRUE);
+  cbmapput(pairs, "bb", -1, "BBB", -1, TRUE);
+  cbmapput(pairs, "cc", -1, "CCC", -1, TRUE);
+  cbmapput(pairs, "ZZZ", -1, "z", -1, TRUE);
+  tmp = cbreplace("[aaaaabbbbbcccccdddddZZZZ]", pairs);
+  if(strcmp(tmp, "[AAAAAAaBBBBBBbCCCCCCcdddddzZ]")){
+    free(tmp);
+    cbmapclose(pairs);
+    fprintf(stderr, "%s: cbreplace is invalid\n", progname);
+    return 1;
+  }
+  free(tmp);
+  cbmapclose(pairs);
+  elems = cbsplit("aa bb,ccc-dd,", -1, " ,-");
+  if(cblistnum(elems) != 5 || strcmp(cblistval(elems, 0, NULL), "aa") ||
+     strcmp(cblistval(elems, 1, NULL), "bb") || strcmp(cblistval(elems, 2, NULL), "ccc") ||
+     strcmp(cblistval(elems, 3, NULL), "dd") || strcmp(cblistval(elems, 4, NULL), "")){
+    cblistclose(elems);
+    fprintf(stderr, "%s: cbsplit is invalid\n", progname);
+    return 1;
+  }
+  cblistclose(elems);
+  if(cbstricmp("abc", "ABC") || !cbstricmp("abc", "abcd")){
+    fprintf(stderr, "%s: cbstricmp is invalid\n", progname);
+    return 1;
+  }
+  if(!cbstrfwmatch("abcd", "abc") || cbstrfwmatch("abc", "abcd")){
+    fprintf(stderr, "%s: cbstrfwmatch is invalid\n", progname);
+    return 1;
+  }
+  if(!cbstrfwimatch("abcd", "ABC") || cbstrfwmatch("abc", "ABCD")){
+    fprintf(stderr, "%s: cbstrfwimatch is invalid\n", progname);
+    return 1;
+  }
+  if(!cbstrbwmatch("dcba", "cba") || cbstrbwmatch("cba", "dcba")){
+    fprintf(stderr, "%s: cbstrbwmatch is invalid\n", progname);
+    return 1;
+  }
+  if(!cbstrbwimatch("dcba", "CBA") || cbstrbwimatch("cba", "DCBA")){
+    fprintf(stderr, "%s: cbstrbwimatch is invalid\n", progname);
+    return 1;
+  }
+  tmp = cbmemdup(" \r\n[Quick   Database Manager]\r\n ", -1);
+  if(cbstrtoupper(tmp) != tmp || strcmp(tmp, " \r\n[QUICK   DATABASE MANAGER]\r\n ")){
+    free(tmp);
+    fprintf(stderr, "%s: cbstrtoupper is invalid\n", progname);
+    return 1;
+  }
+  if(cbstrtolower(tmp) != tmp || strcmp(tmp, " \r\n[quick   database manager]\r\n ")){
+    free(tmp);
+    fprintf(stderr, "%s: cbstrtolower is invalid\n", progname);
+    return 1;
+  }
+  if(cbstrtrim(tmp) != tmp || strcmp(tmp, "[quick   database manager]")){
+    free(tmp);
+    fprintf(stderr, "%s: cbstrtrim is invalid\n", progname);
+    return 1;
+  }
+  if(cbstrsqzspc(tmp) != tmp || strcmp(tmp, "[quick database manager]")){
+    free(tmp);
+    fprintf(stderr, "%s: cbstrsqzspc is invalid\n", progname);
+    return 1;
+  }
+  cbstrcututf(tmp, 5);
+  if(cbstrcountutf(tmp) != 5){
+    free(tmp);
+    fprintf(stderr, "%s: cbstrcututf or cbstrcountutf is invalid\n", progname);
+    return 1;
+  }
+  free(tmp);
+  printfflush("ok\n");
+  printfflush("Checking encoding utilities ... ");
+  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
+  tmp = cbbaseencode(spbuf, -1);
+  orig = cbbasedecode(tmp, &osiz);
+  if(osiz != strlen(spbuf) || strcmp(orig, spbuf)){
+    free(orig);
+    free(tmp);
+    fprintf(stderr, "%s: Base64 encoding is invalid\n", progname);
+    return 1;
+  }
+  free(orig);
+  free(tmp);
+  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
+  tmp = cbquoteencode(spbuf, -1);
+  orig = cbquotedecode(tmp, &osiz);
+  if(osiz != strlen(spbuf) || strcmp(orig, spbuf)){
+    free(orig);
+    free(tmp);
+    fprintf(stderr, "%s: quoted-printable encoding is invalid\n", progname);
+    return 1;
+  }
+  free(orig);
+  free(tmp);
+  strcpy(spbuf, "My name is \xca\xbf\xce\xd3\xb4\xb4\xcd\xba.\n\n<Love & Peace!>\n");
+  tmp = cbmimeencode(spbuf, "ISO-8859-1", TRUE);
+  orig = cbmimedecode(tmp, renc);
+  if(osiz != strlen(spbuf) || strcmp(orig, spbuf) || strcmp(renc, "ISO-8859-1")){
+    free(orig);
+    free(tmp);
+    fprintf(stderr, "%s: MIME encoding is invalid\n", progname);
+    return 1;
+  }
+  free(orig);
+  free(tmp);
+  strcpy(spbuf, "\"He says...\r\n\"\"What PROGRAM are they watching?\"\"\"");
+  tmp = cbcsvunescape(spbuf);
+  orig = cbcsvescape(tmp);
+  if(strcmp(orig, spbuf)){
+    free(orig);
+    free(tmp);
+    fprintf(stderr, "%s: CSV escaping is invalid\n", progname);
+    return 1;
+  }
+  free(orig);
+  free(tmp);
+  strcpy(spbuf, "<Nuts&Milk> is "very" surfin'!");
+  tmp = cbxmlunescape(spbuf);
+  orig = cbxmlescape(tmp);
+  if(strcmp(orig, spbuf)){
+    free(orig);
+    free(tmp);
+    fprintf(stderr, "%s: XML escaping is invalid\n", progname);
+    return 1;
+  }
+  free(orig);
+  free(tmp);
+  printfflush("ok\n");
+  printfflush("Checking date utilities ... ");
+  for(i = 0; i < 200; i++){
+    jl = (myrand() % 23) * 1800;
+    if(myrand() % 2 == 0) jl *= -1;
+    t = myrand() % (INT_MAX - 3600 * 24 * 365 * 6) + 3600 * 24 * 365 * 5;
+    tmp = cbdatestrwww(t, jl);
+    t = cbstrmktime(tmp);
+    orig = cbdatestrwww(t, jl);
+    if(strcmp(orig, tmp)){
+      free(orig);
+      free(tmp);
+      fprintf(stderr, "%s: W3CDTF formatter is invalid\n", progname);
+      return 1;
+    }
+    free(orig);
+    free(tmp);
+    tmp = cbdatestrhttp(t, jl);
+    t = cbstrmktime(tmp);
+    orig = cbdatestrhttp(t, jl);
+    if(strcmp(orig, tmp)){
+      free(orig);
+      free(tmp);
+      fprintf(stderr, "%s: RFC 822 date formatter is invalid\n", progname);
+      return 1;
+    }
+    free(orig);
+    free(tmp);
+  }
+  printfflush("ok\n");
+  printfflush("Checking the global garbage collector ... ");
+  for(i = 0; i < 512; i++){
+    glist = cblistopen();
+    cbglobalgc(glist, (void (*)(void *))cblistclose);
+    for(j = 0; j < 10; j++){
+      sprintf(kbuf, "%08d", j);
+      cblistpush(glist, kbuf, -1);
+    }
+    gmap = cbmapopen();
+    cbglobalgc(gmap, (void (*)(void *))cbmapclose);
+    for(j = 0; j < 10; j++){
+      sprintf(kbuf, "%08d", j);
+      cbmapput(gmap, kbuf, -1, kbuf, -1, TRUE);
+    }
+    if(myrand() % 64 == 0){
+      cbvmemavail(100);
+      cbggcsweep();
+    }
+  }
+  printfflush("ok\n");
+  printfflush("all ok\n\n");
+  return 0;
+}
+
+
+
+/* END OF FILE */

Deleted: box/trunk/qdbm/configure
===================================================================
--- box/trunk/qdbm/configure	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/configure	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,3913 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for qdbm 1.8.77.
-#
-# Copyright (C) 2003 Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; 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
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# 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
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  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
-
-       ;;
-  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
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # 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 sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-exec 6>&1
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_config_libobj_dir=.
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
-# Identity of this package.
-PACKAGE_NAME='qdbm'
-PACKAGE_TARNAME='qdbm'
-PACKAGE_VERSION='1.8.77'
-PACKAGE_STRING='qdbm 1.8.77'
-PACKAGE_BUGREPORT=''
-
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT LIBVER LIBREV TARGETS MYDEFS MYOPTS MGWLIBS LD AR LIBOBJS LTLIBOBJS'
-ac_subst_files=''
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-ac_prev=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_option in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
-   { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
-fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
-   { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures qdbm 1.8.77 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-_ACEOF
-
-  cat <<_ACEOF
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
-_ACEOF
-
-  cat <<\_ACEOF
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of qdbm 1.8.77:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-debug          build for debugging
-  --enable-devel          build for development
-  --enable-stable         build for stable release
-  --enable-pthread        use POSIX thread and make APIs thread-safe
-  --disable-lock          build for environments without file locking
-  --disable-mmap          build for environments without memory mapping
-  --enable-zlib           feature ZLIB for B+ tree and inverted index
-  --enable-lzo            feature LZO for B+ tree and inverted index
-  --enable-bzip           feature BZIP2 for B+ tree and inverted index
-  --enable-iconv          feature ICONV utilities
-  --disable-warn          hide warnings in the configuration
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-_ACEOF
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
-    ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
-    else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
-  done
-fi
-
-test -n "$ac_init_help" && exit 0
-if $ac_init_version; then
-  cat <<\_ACEOF
-qdbm configure 1.8.77
-generated by GNU Autoconf 2.59
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit 0
-fi
-exec 5>config.log
-cat >&5 <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by qdbm $as_me 1.8.77, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-{
-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`
-hostinfo               = `(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=.
-  echo "PATH: $as_dir"
-done
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_sep=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
-    2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
-      ;;
-    esac
-  done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-{
-  (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
-    *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-}
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      sed "/^$/d" confdefs.h | sort
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-     ' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
-    esac
-  fi
-else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Export variables
-LIBVER=14
-LIBREV=13
-TARGETS="all"
-MYDEFS=""
-MYOPTS=""
-MGWLIBS=""
-LD="ld"
-AR="ar"
-
-# Building paths
-pathtmp="$PATH"
-PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
-PATH="$PATH:/usr/ccs/bin:/usr/ucb:/usr/xpg4/bin:/usr/xpg6/bin:$pathtmp"
-LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LIBRARY_PATH"
-LD_LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LD_LIBRARY_PATH"
-CPATH="$HOME/include:/usr/local/include:$CPATH"
-export PATH LIBRARY_PATH LD_LIBRARY_PATH CPATH
-
-
-
-#================================================================
-# Options
-#================================================================
-
-
-# Internal variables
-enables=""
-ispthread=""
-iszlib=""
-isiconv=""
-isnowarn=""
-
-# Debug mode
-# Check whether --enable-debug or --disable-debug was given.
-if test "${enable_debug+set}" = set; then
-  enableval="$enable_debug"
-
-fi;
-if test "$enable_debug" = "yes"
-then
-  TARGETS="debug"
-  enables="$enables (debug)"
-fi
-
-# Developping mode
-# Check whether --enable-devel or --disable-devel was given.
-if test "${enable_devel+set}" = set; then
-  enableval="$enable_devel"
-
-fi;
-if test "$enable_devel" = "yes"
-then
-  TARGETS="devel"
-  enables="$enables (devel)"
-fi
-
-# Stable mode
-# Check whether --enable-stable or --disable-stable was given.
-if test "${enable_stable+set}" = set; then
-  enableval="$enable_stable"
-
-fi;
-if test "$enable_stable" = "yes"
-then
-  TARGETS="stable"
-  enables="$enables (stable)"
-fi
-
-# Enable POSIX thread
-# Check whether --enable-pthread or --disable-pthread was given.
-if test "${enable_pthread+set}" = set; then
-  enableval="$enable_pthread"
-
-fi;
-if test "$enable_pthread" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYPTHREAD"
-  enables="$enables (pthread)"
-  ispthread="yes"
-fi
-
-# Disable file locking
-# Check whether --enable-lock or --disable-lock was given.
-if test "${enable_lock+set}" = set; then
-  enableval="$enable_lock"
-
-fi;
-if test "$enable_lock" = "no"
-then
-  MYDEFS="$MYDEFS -DMYNOLOCK"
-  enables="$enables (no-lock)"
-fi
-
-# Disable memory mapping
-# Check whether --enable-mmap or --disable-mmap was given.
-if test "${enable_mmap+set}" = set; then
-  enableval="$enable_mmap"
-
-fi;
-if test "$enable_mmap" = "no"
-then
-  MYDEFS="$MYDEFS -DMYNOMMAP"
-  enables="$enables (no-mmap)"
-fi
-
-# Enable ZLIB compression
-# Check whether --enable-zlib or --disable-zlib was given.
-if test "${enable_zlib+set}" = set; then
-  enableval="$enable_zlib"
-
-fi;
-if test "$enable_zlib" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYZLIB"
-  MGWLIBS="-lz $MGWLIBS"
-  enables="$enables (zlib)"
-  iszlib="yes"
-fi
-
-# Enable LZO compression
-# Check whether --enable-lzo or --disable-lzo was given.
-if test "${enable_lzo+set}" = set; then
-  enableval="$enable_lzo"
-
-fi;
-if test "$enable_lzo" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYLZO"
-  MGWLIBS="-llzo2 $MGWLIBS"
-  enables="$enables (lzo)"
-  islzo="yes"
-fi
-
-# Enable BZIP2 compression
-# Check whether --enable-bzip or --disable-bzip was given.
-if test "${enable_bzip+set}" = set; then
-  enableval="$enable_bzip"
-
-fi;
-if test "$enable_bzip" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYBZIP"
-  MGWLIBS="-lbz2 $MGWLIBS"
-  enables="$enables (bzip)"
-  isbzip="yes"
-fi
-
-# Enable ICONV utilities
-# Check whether --enable-iconv or --disable-iconv was given.
-if test "${enable_iconv+set}" = set; then
-  enableval="$enable_iconv"
-
-fi;
-if test "$enable_iconv" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYICONV"
-  MGWLIBS="-liconv $MGWLIBS"
-  enables="$enables (iconv)"
-  isiconv="yes"
-fi
-
-# No warning configuration
-# Check whether --enable-warn or --disable-warn was given.
-if test "${enable_warn+set}" = set; then
-  enableval="$enable_warn"
-
-fi;
-if test "$enable_warn" = "no"
-then
-  isnowarn="yes"
-fi
-
-# Messages
-printf '#================================================================\n'
-printf '# Configuring QDBM version %s%s.\n' "$PACKAGE_VERSION" "$enables"
-printf '#================================================================\n'
-
-
-
-#================================================================
-# Checking Commands to Build with
-#================================================================
-
-
-# C compiler
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
-	break;;
-    * )
-	break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
-
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-if test "$GCC" != "yes"
-then
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: GCC is required to build this package.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-if uname | egrep -i 'Linux' > /dev/null 2>&1 &&
-  uname -m | egrep '(x|i)(3|4|5|6|7|8|9)?86' > /dev/null 2>&1
-then
-  MYOPTS="-minline-all-stringops"
-fi
-if uname | egrep -i 'SunOS' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-if uname | egrep -i 'BSD' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-if gcc --version | egrep -i '^2\.(8|9)' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-
-# Linker
-printf 'checking for ld... '
-if which ld | grep '/ld$' > /dev/null 2>&1
-then
-  LD=`which ld`
-  printf '%s\n' "$LD"
-else
-  printf 'no\n'
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: ld is not found in PATH.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-
-# Archiver
-printf 'checking for ar... '
-if which ar | grep '/ar$' > /dev/null 2>&1
-then
-  AR=`which ar`
-  printf '%s\n' "$AR"
-else
-  printf 'no\n'
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: ar is not found in PATH.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-
-
-
-#================================================================
-# Checking Libraries
-#================================================================
-
-
-# Underlying libraries
-
-
-echo "$as_me:$LINENO: checking for main in -lc" >&5
-echo $ECHO_N "checking for main in -lc... $ECHO_C" >&6
-if test "${ac_cv_lib_c_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_c_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_c_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_c_main" >&5
-echo "${ECHO_T}$ac_cv_lib_c_main" >&6
-if test $ac_cv_lib_c_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBC 1
-_ACEOF
-
-  LIBS="-lc $LIBS"
-
-fi
-
-
-# for pthread
-if test "$ispthread" = "yes"
-then
-
-echo "$as_me:$LINENO: checking for main in -lpthread" >&5
-echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6
-if test "${ac_cv_lib_pthread_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_pthread_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_pthread_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5
-echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6
-if test $ac_cv_lib_pthread_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBPTHREAD 1
-_ACEOF
-
-  LIBS="-lpthread $LIBS"
-
-fi
-
-fi
-
-# for zlib
-if test "$iszlib" = "yes"
-then
-
-echo "$as_me:$LINENO: checking for main in -lz" >&5
-echo $ECHO_N "checking for main in -lz... $ECHO_C" >&6
-if test "${ac_cv_lib_z_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lz  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_z_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_z_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_z_main" >&5
-echo "${ECHO_T}$ac_cv_lib_z_main" >&6
-if test $ac_cv_lib_z_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBZ 1
-_ACEOF
-
-  LIBS="-lz $LIBS"
-
-fi
-
-fi
-
-# for lzo
-if test "$islzo" = "yes"
-then
-
-echo "$as_me:$LINENO: checking for main in -llzo2" >&5
-echo $ECHO_N "checking for main in -llzo2... $ECHO_C" >&6
-if test "${ac_cv_lib_lzo2_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-llzo2  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_lzo2_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_lzo2_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_lzo2_main" >&5
-echo "${ECHO_T}$ac_cv_lib_lzo2_main" >&6
-if test $ac_cv_lib_lzo2_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBLZO2 1
-_ACEOF
-
-  LIBS="-llzo2 $LIBS"
-
-fi
-
-fi
-
-# for bzip
-if test "$isbzip" = "yes"
-then
-
-echo "$as_me:$LINENO: checking for main in -lbz2" >&5
-echo $ECHO_N "checking for main in -lbz2... $ECHO_C" >&6
-if test "${ac_cv_lib_bz2_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lbz2  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_bz2_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_bz2_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_bz2_main" >&5
-echo "${ECHO_T}$ac_cv_lib_bz2_main" >&6
-if test $ac_cv_lib_bz2_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBBZ2 1
-_ACEOF
-
-  LIBS="-lbz2 $LIBS"
-
-fi
-
-fi
-
-# for iconv
-if test "$isiconv" = "yes"
-then
-
-echo "$as_me:$LINENO: checking for main in -liconv" >&5
-echo $ECHO_N "checking for main in -liconv... $ECHO_C" >&6
-if test "${ac_cv_lib_iconv_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-liconv  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_iconv_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_iconv_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_main" >&5
-echo "${ECHO_T}$ac_cv_lib_iconv_main" >&6
-if test $ac_cv_lib_iconv_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBICONV 1
-_ACEOF
-
-  LIBS="-liconv $LIBS"
-
-fi
-
-fi
-
-# For old BSDs
-if test "$ispthread" = "yes" && uname -a | grep BSD > /dev/null &&
-  test -f /usr/lib/libc_r.a && test ! -f /usr/lib/libpthread.a
-then
-  LIBS=`printf '%s' "$LIBS" | sed 's/-lc/-lc_r/g'`
-fi
-
-# Duplication of QDBM for C
-echo "$as_me:$LINENO: checking for main in -lqdbm" >&5
-echo $ECHO_N "checking for main in -lqdbm... $ECHO_C" >&6
-if test "${ac_cv_lib_qdbm_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lqdbm  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_qdbm_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_qdbm_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_qdbm_main" >&5
-echo "${ECHO_T}$ac_cv_lib_qdbm_main" >&6
-if test $ac_cv_lib_qdbm_main = yes; then
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: The existing library was detected.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-
-fi
-
-
-
-
-#================================================================
-# Generic Settings
-#================================================================
-
-
-# Export variables
-
-
-
-
-
-
-
-
-
-
-
-# Targets
-                                        ac_config_files="$ac_config_files Makefile LTmakefile qdbm.spec qdbm.pc"
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
-  (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-} |
-  sed '
-     t clear
-     : clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
-    cat confcache >$cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-#
-# If the first sed substitution is executed (which looks for macros that
-# take arguments), then we branch to the quote section.  Otherwise,
-# look for a macro that doesn't take arguments.
-cat >confdef2opt.sed <<\_ACEOF
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\),-D\1=\2,g
-t quote
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\),-D\1=\2,g
-t quote
-d
-: quote
-s,[	 `~#$^&*(){}\\|;'"<>?],\\&,g
-s,\[,\\&,g
-s,\],\\&,g
-s,\$,$$,g
-p
-_ACEOF
-# We use echo to avoid assuming a particular line-breaking character.
-# The extra dot is to prevent the shell from consuming trailing
-# line-breaks from the sub-command output.  A line-break within
-# single-quotes doesn't work because, if this script is created in a
-# platform that uses two characters for line-breaks (e.g., DOS), tr
-# would break.
-ac_LF_and_DOT=`echo; echo .`
-DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
-rm -f confdef2opt.sed
-
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; 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
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# 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
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  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
-
-       ;;
-  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
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
-
-  # 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 sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# 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'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by qdbm $as_me 1.8.77, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
-
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-
-Configuration files:
-$config_files
-
-Report bugs to <bug-autoconf at gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-qdbm config.status 1.8.77
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1" ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-
-
-
-
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "LTmakefile" ) CONFIG_FILES="$CONFIG_FILES LTmakefile" ;;
-  "qdbm.spec" ) CONFIG_FILES="$CONFIG_FILES qdbm.spec" ;;
-  "qdbm.pc" ) CONFIG_FILES="$CONFIG_FILES qdbm.pc" ;;
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s, at SHELL@,$SHELL,;t t
-s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s, at exec_prefix@,$exec_prefix,;t t
-s, at prefix@,$prefix,;t t
-s, at program_transform_name@,$program_transform_name,;t t
-s, at bindir@,$bindir,;t t
-s, at sbindir@,$sbindir,;t t
-s, at libexecdir@,$libexecdir,;t t
-s, at datadir@,$datadir,;t t
-s, at sysconfdir@,$sysconfdir,;t t
-s, at sharedstatedir@,$sharedstatedir,;t t
-s, at localstatedir@,$localstatedir,;t t
-s, at libdir@,$libdir,;t t
-s, at includedir@,$includedir,;t t
-s, at oldincludedir@,$oldincludedir,;t t
-s, at infodir@,$infodir,;t t
-s, at mandir@,$mandir,;t t
-s, at build_alias@,$build_alias,;t t
-s, at host_alias@,$host_alias,;t t
-s, at target_alias@,$target_alias,;t t
-s, at DEFS@,$DEFS,;t t
-s, at ECHO_C@,$ECHO_C,;t t
-s, at ECHO_N@,$ECHO_N,;t t
-s, at ECHO_T@,$ECHO_T,;t t
-s, at LIBS@,$LIBS,;t t
-s, at CC@,$CC,;t t
-s, at CFLAGS@,$CFLAGS,;t t
-s, at LDFLAGS@,$LDFLAGS,;t t
-s, at CPPFLAGS@,$CPPFLAGS,;t t
-s, at ac_ct_CC@,$ac_ct_CC,;t t
-s, at EXEEXT@,$EXEEXT,;t t
-s, at OBJEXT@,$OBJEXT,;t t
-s, at LIBVER@,$LIBVER,;t t
-s, at LIBREV@,$LIBREV,;t t
-s, at TARGETS@,$TARGETS,;t t
-s, at MYDEFS@,$MYDEFS,;t t
-s, at MYOPTS@,$MYOPTS,;t t
-s, at MGWLIBS@,$MGWLIBS,;t t
-s, at LD@,$LD,;t t
-s, at AR@,$AR,;t t
-s, at LIBOBJS@,$LIBOBJS,;t t
-s, at LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
-
-_ACEOF
-
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s, at configure_input@,$configure_input,;t t
-s, at srcdir@,$ac_srcdir,;t t
-s, at abs_srcdir@,$ac_abs_srcdir,;t t
-s, at top_srcdir@,$ac_top_srcdir,;t t
-s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s, at builddir@,$ac_builddir,;t t
-s, at abs_builddir@,$ac_abs_builddir,;t t
-s, at top_builddir@,$ac_top_builddir,;t t
-s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
-
-done
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
-fi
-
-
-# Messages
-printf '#================================================================\n'
-printf '# Ready to make.\n'
-printf '#================================================================\n'
-
-
-
-# END OF FILE

Copied: box/trunk/qdbm/configure (from rev 2716, box/trunk/qdbm/configure)
===================================================================
--- box/trunk/qdbm/configure	                        (rev 0)
+++ box/trunk/qdbm/configure	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,3913 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for qdbm 1.8.77.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  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
+
+       ;;
+  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
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # 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 sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='qdbm'
+PACKAGE_TARNAME='qdbm'
+PACKAGE_VERSION='1.8.77'
+PACKAGE_STRING='qdbm 1.8.77'
+PACKAGE_BUGREPORT=''
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT LIBVER LIBREV TARGETS MYDEFS MYOPTS MGWLIBS LD AR LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures qdbm 1.8.77 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of qdbm 1.8.77:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-debug          build for debugging
+  --enable-devel          build for development
+  --enable-stable         build for stable release
+  --enable-pthread        use POSIX thread and make APIs thread-safe
+  --disable-lock          build for environments without file locking
+  --disable-mmap          build for environments without memory mapping
+  --enable-zlib           feature ZLIB for B+ tree and inverted index
+  --enable-lzo            feature LZO for B+ tree and inverted index
+  --enable-bzip           feature BZIP2 for B+ tree and inverted index
+  --enable-iconv          feature ICONV utilities
+  --disable-warn          hide warnings in the configuration
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+qdbm configure 1.8.77
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by qdbm $as_me 1.8.77, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+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`
+hostinfo               = `(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=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Export variables
+LIBVER=14
+LIBREV=13
+TARGETS="all"
+MYDEFS=""
+MYOPTS=""
+MGWLIBS=""
+LD="ld"
+AR="ar"
+
+# Building paths
+pathtmp="$PATH"
+PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
+PATH="$PATH:/usr/ccs/bin:/usr/ucb:/usr/xpg4/bin:/usr/xpg6/bin:$pathtmp"
+LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LIBRARY_PATH"
+LD_LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LD_LIBRARY_PATH"
+CPATH="$HOME/include:/usr/local/include:$CPATH"
+export PATH LIBRARY_PATH LD_LIBRARY_PATH CPATH
+
+
+
+#================================================================
+# Options
+#================================================================
+
+
+# Internal variables
+enables=""
+ispthread=""
+iszlib=""
+isiconv=""
+isnowarn=""
+
+# Debug mode
+# Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+  enableval="$enable_debug"
+
+fi;
+if test "$enable_debug" = "yes"
+then
+  TARGETS="debug"
+  enables="$enables (debug)"
+fi
+
+# Developping mode
+# Check whether --enable-devel or --disable-devel was given.
+if test "${enable_devel+set}" = set; then
+  enableval="$enable_devel"
+
+fi;
+if test "$enable_devel" = "yes"
+then
+  TARGETS="devel"
+  enables="$enables (devel)"
+fi
+
+# Stable mode
+# Check whether --enable-stable or --disable-stable was given.
+if test "${enable_stable+set}" = set; then
+  enableval="$enable_stable"
+
+fi;
+if test "$enable_stable" = "yes"
+then
+  TARGETS="stable"
+  enables="$enables (stable)"
+fi
+
+# Enable POSIX thread
+# Check whether --enable-pthread or --disable-pthread was given.
+if test "${enable_pthread+set}" = set; then
+  enableval="$enable_pthread"
+
+fi;
+if test "$enable_pthread" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYPTHREAD"
+  enables="$enables (pthread)"
+  ispthread="yes"
+fi
+
+# Disable file locking
+# Check whether --enable-lock or --disable-lock was given.
+if test "${enable_lock+set}" = set; then
+  enableval="$enable_lock"
+
+fi;
+if test "$enable_lock" = "no"
+then
+  MYDEFS="$MYDEFS -DMYNOLOCK"
+  enables="$enables (no-lock)"
+fi
+
+# Disable memory mapping
+# Check whether --enable-mmap or --disable-mmap was given.
+if test "${enable_mmap+set}" = set; then
+  enableval="$enable_mmap"
+
+fi;
+if test "$enable_mmap" = "no"
+then
+  MYDEFS="$MYDEFS -DMYNOMMAP"
+  enables="$enables (no-mmap)"
+fi
+
+# Enable ZLIB compression
+# Check whether --enable-zlib or --disable-zlib was given.
+if test "${enable_zlib+set}" = set; then
+  enableval="$enable_zlib"
+
+fi;
+if test "$enable_zlib" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYZLIB"
+  MGWLIBS="-lz $MGWLIBS"
+  enables="$enables (zlib)"
+  iszlib="yes"
+fi
+
+# Enable LZO compression
+# Check whether --enable-lzo or --disable-lzo was given.
+if test "${enable_lzo+set}" = set; then
+  enableval="$enable_lzo"
+
+fi;
+if test "$enable_lzo" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYLZO"
+  MGWLIBS="-llzo2 $MGWLIBS"
+  enables="$enables (lzo)"
+  islzo="yes"
+fi
+
+# Enable BZIP2 compression
+# Check whether --enable-bzip or --disable-bzip was given.
+if test "${enable_bzip+set}" = set; then
+  enableval="$enable_bzip"
+
+fi;
+if test "$enable_bzip" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYBZIP"
+  MGWLIBS="-lbz2 $MGWLIBS"
+  enables="$enables (bzip)"
+  isbzip="yes"
+fi
+
+# Enable ICONV utilities
+# Check whether --enable-iconv or --disable-iconv was given.
+if test "${enable_iconv+set}" = set; then
+  enableval="$enable_iconv"
+
+fi;
+if test "$enable_iconv" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYICONV"
+  MGWLIBS="-liconv $MGWLIBS"
+  enables="$enables (iconv)"
+  isiconv="yes"
+fi
+
+# No warning configuration
+# Check whether --enable-warn or --disable-warn was given.
+if test "${enable_warn+set}" = set; then
+  enableval="$enable_warn"
+
+fi;
+if test "$enable_warn" = "no"
+then
+  isnowarn="yes"
+fi
+
+# Messages
+printf '#================================================================\n'
+printf '# Configuring QDBM version %s%s.\n' "$PACKAGE_VERSION" "$enables"
+printf '#================================================================\n'
+
+
+
+#================================================================
+# Checking Commands to Build with
+#================================================================
+
+
+# C compiler
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test "$GCC" != "yes"
+then
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: GCC is required to build this package.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+if uname | egrep -i 'Linux' > /dev/null 2>&1 &&
+  uname -m | egrep '(x|i)(3|4|5|6|7|8|9)?86' > /dev/null 2>&1
+then
+  MYOPTS="-minline-all-stringops"
+fi
+if uname | egrep -i 'SunOS' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+if uname | egrep -i 'BSD' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+if gcc --version | egrep -i '^2\.(8|9)' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+
+# Linker
+printf 'checking for ld... '
+if which ld | grep '/ld$' > /dev/null 2>&1
+then
+  LD=`which ld`
+  printf '%s\n' "$LD"
+else
+  printf 'no\n'
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: ld is not found in PATH.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+
+# Archiver
+printf 'checking for ar... '
+if which ar | grep '/ar$' > /dev/null 2>&1
+then
+  AR=`which ar`
+  printf '%s\n' "$AR"
+else
+  printf 'no\n'
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: ar is not found in PATH.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+
+
+
+#================================================================
+# Checking Libraries
+#================================================================
+
+
+# Underlying libraries
+
+
+echo "$as_me:$LINENO: checking for main in -lc" >&5
+echo $ECHO_N "checking for main in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_c_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_c_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_c_main" >&5
+echo "${ECHO_T}$ac_cv_lib_c_main" >&6
+if test $ac_cv_lib_c_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBC 1
+_ACEOF
+
+  LIBS="-lc $LIBS"
+
+fi
+
+
+# for pthread
+if test "$ispthread" = "yes"
+then
+
+echo "$as_me:$LINENO: checking for main in -lpthread" >&5
+echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6
+if test "${ac_cv_lib_pthread_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_pthread_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_pthread_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5
+echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6
+if test $ac_cv_lib_pthread_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+fi
+
+fi
+
+# for zlib
+if test "$iszlib" = "yes"
+then
+
+echo "$as_me:$LINENO: checking for main in -lz" >&5
+echo $ECHO_N "checking for main in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_z_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_z_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_main" >&5
+echo "${ECHO_T}$ac_cv_lib_z_main" >&6
+if test $ac_cv_lib_z_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBZ 1
+_ACEOF
+
+  LIBS="-lz $LIBS"
+
+fi
+
+fi
+
+# for lzo
+if test "$islzo" = "yes"
+then
+
+echo "$as_me:$LINENO: checking for main in -llzo2" >&5
+echo $ECHO_N "checking for main in -llzo2... $ECHO_C" >&6
+if test "${ac_cv_lib_lzo2_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-llzo2  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_lzo2_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_lzo2_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_lzo2_main" >&5
+echo "${ECHO_T}$ac_cv_lib_lzo2_main" >&6
+if test $ac_cv_lib_lzo2_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBLZO2 1
+_ACEOF
+
+  LIBS="-llzo2 $LIBS"
+
+fi
+
+fi
+
+# for bzip
+if test "$isbzip" = "yes"
+then
+
+echo "$as_me:$LINENO: checking for main in -lbz2" >&5
+echo $ECHO_N "checking for main in -lbz2... $ECHO_C" >&6
+if test "${ac_cv_lib_bz2_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbz2  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_bz2_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_bz2_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_bz2_main" >&5
+echo "${ECHO_T}$ac_cv_lib_bz2_main" >&6
+if test $ac_cv_lib_bz2_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBBZ2 1
+_ACEOF
+
+  LIBS="-lbz2 $LIBS"
+
+fi
+
+fi
+
+# for iconv
+if test "$isiconv" = "yes"
+then
+
+echo "$as_me:$LINENO: checking for main in -liconv" >&5
+echo $ECHO_N "checking for main in -liconv... $ECHO_C" >&6
+if test "${ac_cv_lib_iconv_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_iconv_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_iconv_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_main" >&5
+echo "${ECHO_T}$ac_cv_lib_iconv_main" >&6
+if test $ac_cv_lib_iconv_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBICONV 1
+_ACEOF
+
+  LIBS="-liconv $LIBS"
+
+fi
+
+fi
+
+# For old BSDs
+if test "$ispthread" = "yes" && uname -a | grep BSD > /dev/null &&
+  test -f /usr/lib/libc_r.a && test ! -f /usr/lib/libpthread.a
+then
+  LIBS=`printf '%s' "$LIBS" | sed 's/-lc/-lc_r/g'`
+fi
+
+# Duplication of QDBM for C
+echo "$as_me:$LINENO: checking for main in -lqdbm" >&5
+echo $ECHO_N "checking for main in -lqdbm... $ECHO_C" >&6
+if test "${ac_cv_lib_qdbm_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lqdbm  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_qdbm_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_qdbm_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_qdbm_main" >&5
+echo "${ECHO_T}$ac_cv_lib_qdbm_main" >&6
+if test $ac_cv_lib_qdbm_main = yes; then
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: The existing library was detected.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+
+fi
+
+
+
+
+#================================================================
+# Generic Settings
+#================================================================
+
+
+# Export variables
+
+
+
+
+
+
+
+
+
+
+
+# Targets
+                                        ac_config_files="$ac_config_files Makefile LTmakefile qdbm.spec qdbm.pc"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\),-D\1=\2,g
+t quote
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[	 `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output.  A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  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
+
+       ;;
+  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
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # 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 sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by qdbm $as_me 1.8.77, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+qdbm config.status 1.8.77
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "LTmakefile" ) CONFIG_FILES="$CONFIG_FILES LTmakefile" ;;
+  "qdbm.spec" ) CONFIG_FILES="$CONFIG_FILES qdbm.spec" ;;
+  "qdbm.pc" ) CONFIG_FILES="$CONFIG_FILES qdbm.pc" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at LIBVER@,$LIBVER,;t t
+s, at LIBREV@,$LIBREV,;t t
+s, at TARGETS@,$TARGETS,;t t
+s, at MYDEFS@,$MYDEFS,;t t
+s, at MYOPTS@,$MYOPTS,;t t
+s, at MGWLIBS@,$MGWLIBS,;t t
+s, at LD@,$LD,;t t
+s, at AR@,$AR,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+# Messages
+printf '#================================================================\n'
+printf '# Ready to make.\n'
+printf '#================================================================\n'
+
+
+
+# END OF FILE

Deleted: box/trunk/qdbm/configure.in
===================================================================
--- box/trunk/qdbm/configure.in	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/configure.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,312 +0,0 @@
-# Source of configuration for QDBM
-
-
-
-#================================================================
-# Generic Settings
-#================================================================
-
-
-# Targets
-AC_INIT(qdbm, 1.8.77)
-
-# Export variables
-LIBVER=14
-LIBREV=13
-TARGETS="all"
-MYDEFS=""
-MYOPTS=""
-MGWLIBS=""
-LD="ld"
-AR="ar"
-
-# Building paths
-pathtmp="$PATH"
-PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
-PATH="$PATH:/usr/ccs/bin:/usr/ucb:/usr/xpg4/bin:/usr/xpg6/bin:$pathtmp"
-LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LIBRARY_PATH"
-LD_LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LD_LIBRARY_PATH"
-CPATH="$HOME/include:/usr/local/include:$CPATH"
-export PATH LIBRARY_PATH LD_LIBRARY_PATH CPATH
-
-
-
-#================================================================
-# Options
-#================================================================
-
-
-# Internal variables
-enables=""
-ispthread=""
-iszlib=""
-isiconv=""
-isnowarn=""
-
-# Debug mode
-AC_ARG_ENABLE(debug,
-  AC_HELP_STRING([--enable-debug], [build for debugging]))
-if test "$enable_debug" = "yes"
-then
-  TARGETS="debug"
-  enables="$enables (debug)"
-fi
-
-# Developping mode
-AC_ARG_ENABLE(devel,
-  AC_HELP_STRING([--enable-devel], [build for development]))
-if test "$enable_devel" = "yes"
-then
-  TARGETS="devel"
-  enables="$enables (devel)"
-fi
-
-# Stable mode
-AC_ARG_ENABLE(stable,
-  AC_HELP_STRING([--enable-stable], [build for stable release]))
-if test "$enable_stable" = "yes"
-then
-  TARGETS="stable"
-  enables="$enables (stable)"
-fi
-
-# Enable POSIX thread
-AC_ARG_ENABLE(pthread,
-  AC_HELP_STRING([--enable-pthread], [use POSIX thread and make APIs thread-safe]))
-if test "$enable_pthread" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYPTHREAD"
-  enables="$enables (pthread)"
-  ispthread="yes"
-fi
-
-# Disable file locking
-AC_ARG_ENABLE(lock,
-  AC_HELP_STRING([--disable-lock], [build for environments without file locking]))
-if test "$enable_lock" = "no"
-then
-  MYDEFS="$MYDEFS -DMYNOLOCK"
-  enables="$enables (no-lock)"
-fi
-
-# Disable memory mapping
-AC_ARG_ENABLE(mmap,
-  AC_HELP_STRING([--disable-mmap], [build for environments without memory mapping]))
-if test "$enable_mmap" = "no"
-then
-  MYDEFS="$MYDEFS -DMYNOMMAP"
-  enables="$enables (no-mmap)"
-fi
-
-# Enable ZLIB compression
-AC_ARG_ENABLE(zlib,
-  AC_HELP_STRING([--enable-zlib], [feature ZLIB for B+ tree and inverted index]))
-if test "$enable_zlib" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYZLIB"
-  MGWLIBS="-lz $MGWLIBS"
-  enables="$enables (zlib)"
-  iszlib="yes"
-fi
-
-# Enable LZO compression
-AC_ARG_ENABLE(lzo,
-  AC_HELP_STRING([--enable-lzo], [feature LZO for B+ tree and inverted index]))
-if test "$enable_lzo" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYLZO"
-  MGWLIBS="-llzo2 $MGWLIBS"
-  enables="$enables (lzo)"
-  islzo="yes"
-fi
-
-# Enable BZIP2 compression
-AC_ARG_ENABLE(bzip,
-  AC_HELP_STRING([--enable-bzip], [feature BZIP2 for B+ tree and inverted index]))
-if test "$enable_bzip" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYBZIP"
-  MGWLIBS="-lbz2 $MGWLIBS"
-  enables="$enables (bzip)"
-  isbzip="yes"
-fi
-
-# Enable ICONV utilities
-AC_ARG_ENABLE(iconv,
-  AC_HELP_STRING([--enable-iconv], [feature ICONV utilities]))
-if test "$enable_iconv" = "yes"
-then
-  MYDEFS="$MYDEFS -DMYICONV"
-  MGWLIBS="-liconv $MGWLIBS"
-  enables="$enables (iconv)"
-  isiconv="yes"
-fi
-
-# No warning configuration
-AC_ARG_ENABLE(warn,
-  AC_HELP_STRING([--disable-warn], [hide warnings in the configuration]))
-if test "$enable_warn" = "no"
-then
-  isnowarn="yes"
-fi
-
-# Messages
-printf '#================================================================\n'
-printf '# Configuring QDBM version %s%s.\n' "$PACKAGE_VERSION" "$enables"
-printf '#================================================================\n'
-
-
-
-#================================================================
-# Checking Commands to Build with
-#================================================================
-
-
-# C compiler
-AC_PROG_CC
-if test "$GCC" != "yes"
-then
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: GCC is required to build this package.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-if uname | egrep -i 'Linux' > /dev/null 2>&1 &&
-  uname -m | egrep '(x|i)(3|4|5|6|7|8|9)?86' > /dev/null 2>&1
-then
-  MYOPTS="-minline-all-stringops"
-fi
-if uname | egrep -i 'SunOS' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-if uname | egrep -i 'BSD' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-if gcc --version | egrep -i '^2\.(8|9)' > /dev/null 2>&1
-then
-  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
-fi
-
-# Linker
-printf 'checking for ld... '
-if which ld | grep '/ld$' > /dev/null 2>&1
-then
-  LD=`which ld`
-  printf '%s\n' "$LD"
-else
-  printf 'no\n'
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: ld is not found in PATH.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-
-# Archiver
-printf 'checking for ar... '
-if which ar | grep '/ar$' > /dev/null 2>&1
-then
-  AR=`which ar`
-  printf '%s\n' "$AR"
-else
-  printf 'no\n'
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: ar is not found in PATH.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-fi
-
-
-
-#================================================================
-# Checking Libraries
-#================================================================
-
-
-# Underlying libraries
-AC_CHECK_LIB(c, main)
-
-# for pthread
-if test "$ispthread" = "yes"
-then
-  AC_CHECK_LIB(pthread, main)
-fi
-
-# for zlib
-if test "$iszlib" = "yes"
-then
-  AC_CHECK_LIB(z, main)
-fi
-
-# for lzo
-if test "$islzo" = "yes"
-then
-  AC_CHECK_LIB(lzo2, main)
-fi
-
-# for bzip
-if test "$isbzip" = "yes"
-then
-  AC_CHECK_LIB(bz2, main)
-fi
-
-# for iconv
-if test "$isiconv" = "yes"
-then
-  AC_CHECK_LIB(iconv, main)
-fi
-
-# For old BSDs
-if test "$ispthread" = "yes" && uname -a | grep BSD > /dev/null &&
-  test -f /usr/lib/libc_r.a && test ! -f /usr/lib/libpthread.a
-then
-  LIBS=`printf '%s' "$LIBS" | sed 's/-lc/-lc_r/g'`
-fi
-
-# Duplication of QDBM for C
-AC_CHECK_LIB(qdbm, main,
-  if test "$isnowarn" != "yes"
-  then
-    printf '#================================================================\n' 1>&2
-    printf '# WARNING: The existing library was detected.\n' 1>&2
-    printf '#================================================================\n' 1>&2
-  fi
-)
-
-
-
-#================================================================
-# Generic Settings
-#================================================================
-
-
-# Export variables
-AC_SUBST(LIBVER)
-AC_SUBST(LIBREV)
-AC_SUBST(TARGETS)
-AC_SUBST(MYDEFS)
-AC_SUBST(MYOPTS)
-AC_SUBST(MGWLIBS)
-AC_SUBST(LD)
-AC_SUBST(AR)
-AC_SUBST(CPPFLAGS)
-AC_SUBST(LDFLAGS)
-
-# Targets
-AC_OUTPUT(Makefile LTmakefile qdbm.spec qdbm.pc)
-
-# Messages
-printf '#================================================================\n'
-printf '# Ready to make.\n'
-printf '#================================================================\n'
-
-
-
-# END OF FILE

Copied: box/trunk/qdbm/configure.in (from rev 2716, box/trunk/qdbm/configure.in)
===================================================================
--- box/trunk/qdbm/configure.in	                        (rev 0)
+++ box/trunk/qdbm/configure.in	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,312 @@
+# Source of configuration for QDBM
+
+
+
+#================================================================
+# Generic Settings
+#================================================================
+
+
+# Targets
+AC_INIT(qdbm, 1.8.77)
+
+# Export variables
+LIBVER=14
+LIBREV=13
+TARGETS="all"
+MYDEFS=""
+MYOPTS=""
+MGWLIBS=""
+LD="ld"
+AR="ar"
+
+# Building paths
+pathtmp="$PATH"
+PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
+PATH="$PATH:/usr/ccs/bin:/usr/ucb:/usr/xpg4/bin:/usr/xpg6/bin:$pathtmp"
+LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LIBRARY_PATH"
+LD_LIBRARY_PATH="$HOME/lib:/usr/local/lib:$LD_LIBRARY_PATH"
+CPATH="$HOME/include:/usr/local/include:$CPATH"
+export PATH LIBRARY_PATH LD_LIBRARY_PATH CPATH
+
+
+
+#================================================================
+# Options
+#================================================================
+
+
+# Internal variables
+enables=""
+ispthread=""
+iszlib=""
+isiconv=""
+isnowarn=""
+
+# Debug mode
+AC_ARG_ENABLE(debug,
+  AC_HELP_STRING([--enable-debug], [build for debugging]))
+if test "$enable_debug" = "yes"
+then
+  TARGETS="debug"
+  enables="$enables (debug)"
+fi
+
+# Developping mode
+AC_ARG_ENABLE(devel,
+  AC_HELP_STRING([--enable-devel], [build for development]))
+if test "$enable_devel" = "yes"
+then
+  TARGETS="devel"
+  enables="$enables (devel)"
+fi
+
+# Stable mode
+AC_ARG_ENABLE(stable,
+  AC_HELP_STRING([--enable-stable], [build for stable release]))
+if test "$enable_stable" = "yes"
+then
+  TARGETS="stable"
+  enables="$enables (stable)"
+fi
+
+# Enable POSIX thread
+AC_ARG_ENABLE(pthread,
+  AC_HELP_STRING([--enable-pthread], [use POSIX thread and make APIs thread-safe]))
+if test "$enable_pthread" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYPTHREAD"
+  enables="$enables (pthread)"
+  ispthread="yes"
+fi
+
+# Disable file locking
+AC_ARG_ENABLE(lock,
+  AC_HELP_STRING([--disable-lock], [build for environments without file locking]))
+if test "$enable_lock" = "no"
+then
+  MYDEFS="$MYDEFS -DMYNOLOCK"
+  enables="$enables (no-lock)"
+fi
+
+# Disable memory mapping
+AC_ARG_ENABLE(mmap,
+  AC_HELP_STRING([--disable-mmap], [build for environments without memory mapping]))
+if test "$enable_mmap" = "no"
+then
+  MYDEFS="$MYDEFS -DMYNOMMAP"
+  enables="$enables (no-mmap)"
+fi
+
+# Enable ZLIB compression
+AC_ARG_ENABLE(zlib,
+  AC_HELP_STRING([--enable-zlib], [feature ZLIB for B+ tree and inverted index]))
+if test "$enable_zlib" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYZLIB"
+  MGWLIBS="-lz $MGWLIBS"
+  enables="$enables (zlib)"
+  iszlib="yes"
+fi
+
+# Enable LZO compression
+AC_ARG_ENABLE(lzo,
+  AC_HELP_STRING([--enable-lzo], [feature LZO for B+ tree and inverted index]))
+if test "$enable_lzo" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYLZO"
+  MGWLIBS="-llzo2 $MGWLIBS"
+  enables="$enables (lzo)"
+  islzo="yes"
+fi
+
+# Enable BZIP2 compression
+AC_ARG_ENABLE(bzip,
+  AC_HELP_STRING([--enable-bzip], [feature BZIP2 for B+ tree and inverted index]))
+if test "$enable_bzip" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYBZIP"
+  MGWLIBS="-lbz2 $MGWLIBS"
+  enables="$enables (bzip)"
+  isbzip="yes"
+fi
+
+# Enable ICONV utilities
+AC_ARG_ENABLE(iconv,
+  AC_HELP_STRING([--enable-iconv], [feature ICONV utilities]))
+if test "$enable_iconv" = "yes"
+then
+  MYDEFS="$MYDEFS -DMYICONV"
+  MGWLIBS="-liconv $MGWLIBS"
+  enables="$enables (iconv)"
+  isiconv="yes"
+fi
+
+# No warning configuration
+AC_ARG_ENABLE(warn,
+  AC_HELP_STRING([--disable-warn], [hide warnings in the configuration]))
+if test "$enable_warn" = "no"
+then
+  isnowarn="yes"
+fi
+
+# Messages
+printf '#================================================================\n'
+printf '# Configuring QDBM version %s%s.\n' "$PACKAGE_VERSION" "$enables"
+printf '#================================================================\n'
+
+
+
+#================================================================
+# Checking Commands to Build with
+#================================================================
+
+
+# C compiler
+AC_PROG_CC
+if test "$GCC" != "yes"
+then
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: GCC is required to build this package.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+if uname | egrep -i 'Linux' > /dev/null 2>&1 &&
+  uname -m | egrep '(x|i)(3|4|5|6|7|8|9)?86' > /dev/null 2>&1
+then
+  MYOPTS="-minline-all-stringops"
+fi
+if uname | egrep -i 'SunOS' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+if uname | egrep -i 'BSD' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+if gcc --version | egrep -i '^2\.(8|9)' > /dev/null 2>&1
+then
+  MYOPTS="-O1 -fno-omit-frame-pointer -fno-force-addr"
+fi
+
+# Linker
+printf 'checking for ld... '
+if which ld | grep '/ld$' > /dev/null 2>&1
+then
+  LD=`which ld`
+  printf '%s\n' "$LD"
+else
+  printf 'no\n'
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: ld is not found in PATH.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+
+# Archiver
+printf 'checking for ar... '
+if which ar | grep '/ar$' > /dev/null 2>&1
+then
+  AR=`which ar`
+  printf '%s\n' "$AR"
+else
+  printf 'no\n'
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: ar is not found in PATH.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+fi
+
+
+
+#================================================================
+# Checking Libraries
+#================================================================
+
+
+# Underlying libraries
+AC_CHECK_LIB(c, main)
+
+# for pthread
+if test "$ispthread" = "yes"
+then
+  AC_CHECK_LIB(pthread, main)
+fi
+
+# for zlib
+if test "$iszlib" = "yes"
+then
+  AC_CHECK_LIB(z, main)
+fi
+
+# for lzo
+if test "$islzo" = "yes"
+then
+  AC_CHECK_LIB(lzo2, main)
+fi
+
+# for bzip
+if test "$isbzip" = "yes"
+then
+  AC_CHECK_LIB(bz2, main)
+fi
+
+# for iconv
+if test "$isiconv" = "yes"
+then
+  AC_CHECK_LIB(iconv, main)
+fi
+
+# For old BSDs
+if test "$ispthread" = "yes" && uname -a | grep BSD > /dev/null &&
+  test -f /usr/lib/libc_r.a && test ! -f /usr/lib/libpthread.a
+then
+  LIBS=`printf '%s' "$LIBS" | sed 's/-lc/-lc_r/g'`
+fi
+
+# Duplication of QDBM for C
+AC_CHECK_LIB(qdbm, main,
+  if test "$isnowarn" != "yes"
+  then
+    printf '#================================================================\n' 1>&2
+    printf '# WARNING: The existing library was detected.\n' 1>&2
+    printf '#================================================================\n' 1>&2
+  fi
+)
+
+
+
+#================================================================
+# Generic Settings
+#================================================================
+
+
+# Export variables
+AC_SUBST(LIBVER)
+AC_SUBST(LIBREV)
+AC_SUBST(TARGETS)
+AC_SUBST(MYDEFS)
+AC_SUBST(MYOPTS)
+AC_SUBST(MGWLIBS)
+AC_SUBST(LD)
+AC_SUBST(AR)
+AC_SUBST(CPPFLAGS)
+AC_SUBST(LDFLAGS)
+
+# Targets
+AC_OUTPUT(Makefile LTmakefile qdbm.spec qdbm.pc)
+
+# Messages
+printf '#================================================================\n'
+printf '# Ready to make.\n'
+printf '#================================================================\n'
+
+
+
+# END OF FILE

Deleted: box/trunk/qdbm/crmgr.c
===================================================================
--- box/trunk/qdbm/crmgr.c	2010-08-27 18:33:13 UTC (rev 2716)
+++ box/trunk/qdbm/crmgr.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -1,956 +0,0 @@
-/*************************************************************************************************
- * Utility for debugging Curia and its applications
- *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
- * This file is part of QDBM, Quick Database Manager.
- * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
- * Lesser General Public License as published by the Free Software Foundation; either version
- * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
- * details.
- * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
- * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 USA.
- *************************************************************************************************/
-
-
-#include <depot.h>
-#include <curia.h>
-#include <cabin.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#undef TRUE
-#define TRUE           1                 /* boolean true */
-#undef FALSE
-#define FALSE          0                 /* boolean false */
-
-#define ALIGNSIZ       32                /* basic size of alignment */
-
-
-/* for RISC OS */
-#if defined(__riscos__) || defined(__riscos)
-#include <unixlib/local.h>
-int __riscosify_control = __RISCOSIFY_NO_PROCESS;
-#endif
-
-
-/* global variables */
-const char *progname;                    /* program name */
-
-
-/* function prototypes */
-int main(int argc, char **argv);
-void usage(void);
-char *hextoobj(const char *str, int *sp);
-char *dectoiobj(const char *str, int *sp);
-int runcreate(int argc, char **argv);
-int runput(int argc, char **argv);
-int runout(int argc, char **argv);
-int runget(int argc, char **argv);
-int runlist(int argc, char **argv);
-int runoptimize(int argc, char **argv);
-int runinform(int argc, char **argv);
-int runremove(int argc, char **argv);
-int runrepair(int argc, char **argv);
-int runexportdb(int argc, char **argv);
-int runimportdb(int argc, char **argv);
-int runsnaffle(int argc, char **argv);
-void pdperror(const char *name);
-void printobj(const char *obj, int size);
-void printobjhex(const char *obj, int size);
-int docreate(const char *name, int bnum, int dnum, int sparse);
-int doput(const char *name, const char *kbuf, int ksiz,
-          const char *vbuf, int vsiz, int dmode, int lob, int align);
-int doout(const char *name, const char *kbuf, int ksiz, int lob);
-int doget(const char *name, int opts, const char *kbuf, int ksiz,
-          int start, int max, int ox, int lob, int nb);
-int dolist(const char *name, int opts, int kb, int vb, int ox);
-int dooptimize(const char *name, int bnum, int align);
-int doinform(const char *name, int opts);
-int doremove(const char *name);
-int dorepair(const char *name);
-int doexportdb(const char *name, const char *dir);
-int doimportdb(const char *name, const char *dir, int bnum, int dnum);
-int dosnaffle(const char *name, const char *kbuf, int ksiz, int ox, int nb);
-
-
-/* main routine */
-int main(int argc, char **argv){
-  char *env;
-  int rv;
-  cbstdiobin();
-  progname = argv[0];
-  if((env = getenv("QDBMDBGFD")) != NULL) dpdbgfd = atoi(env);
-  if(argc < 2) usage();
-  rv = 0;
-  if(!strcmp(argv[1], "create")){
-    rv = runcreate(argc, argv);
-  } else if(!strcmp(argv[1], "put")){
-    rv = runput(argc, argv);
-  } else if(!strcmp(argv[1], "out")){
-    rv = runout(argc, argv);
-  } else if(!strcmp(argv[1], "get")){
-    rv = runget(argc, argv);
-  } else if(!strcmp(argv[1], "list")){
-    rv = runlist(argc, argv);
-  } else if(!strcmp(argv[1], "optimize")){
-    rv = runoptimize(argc, argv);
-  } else if(!strcmp(argv[1], "inform")){
-    rv = runinform(argc, argv);
-  } else if(!strcmp(argv[1], "remove")){
-    rv = runremove(argc, argv);
-  } else if(!strcmp(argv[1], "repair")){
-    rv = runrepair(argc, argv);
-  } else if(!strcmp(argv[1], "exportdb")){
-    rv = runexportdb(argc, argv);
-  } else if(!strcmp(argv[1], "importdb")){
-    rv = runimportdb(argc, argv);
-  } else if(!strcmp(argv[1], "snaffle")){
-    rv = runsnaffle(argc, argv);
-  } else if(!strcmp(argv[1], "version") || !strcmp(argv[1], "--version")){
-    printf("Powered by QDBM version %s on %s%s\n",
-           dpversion, dpsysname, dpisreentrant ? " (reentrant)" : "");
-    printf("Copyright (c) 2000-2007 Mikio Hirabayashi\n");
-    rv = 0;
-  } else {
-    usage();
-  }
-  return rv;
-}
-
-
-/* print the usage and exit */
-void usage(void){
-  fprintf(stderr, "%s: administration utility for Curia\n", progname);
-  fprintf(stderr, "\n");
-  fprintf(stderr, "usage:\n");
-  fprintf(stderr, "  %s create [-s] [-bnum num] [-dnum num] name\n", progname);
-  fprintf(stderr, "  %s put [-kx|-ki] [-vx|-vi|-vf] [-keep|-cat] [-lob] [-na] "
-          "name key val\n", progname);
-  fprintf(stderr, "  %s out [-kx|-ki] [-lob] name key\n", progname);
-  fprintf(stderr, "  %s get [-nl] [-kx|-ki] [-start num] [-max num] [-ox] [-lob] [-n] name key\n",
-          progname);
-  fprintf(stderr, "  %s list [-nl] [-k|-v] [-ox] name\n", progname);
-  fprintf(stderr, "  %s optimize [-bnum num] [-na] name\n", progname);
-  fprintf(stderr, "  %s inform [-nl] name\n", progname);
-  fprintf(stderr, "  %s remove name\n", progname);
-  fprintf(stderr, "  %s repair name\n", progname);
-  fprintf(stderr, "  %s exportdb name dir\n", progname);
-  fprintf(stderr, "  %s importdb [-bnum num] [-dnum num] name dir\n", progname);
-  fprintf(stderr, "  %s snaffle [-kx|-ki] [-ox] [-n] name key\n", progname);
-  fprintf(stderr, "  %s version\n", progname);
-  fprintf(stderr, "\n");
-  exit(1);
-}
-
-
-/* create a binary object from a hexadecimal string */
-char *hextoobj(const char *str, int *sp){
-  char *buf, mbuf[3];
-  int len, i, j;
-  len = strlen(str);
-  if(!(buf = malloc(len + 1))) return NULL;
-  j = 0;
-  for(i = 0; i < len; i += 2){
-    while(strchr(" \n\r\t\f\v", str[i])){
-      i++;
-    }
-    if((mbuf[0] = str[i]) == '\0') break;
-    if((mbuf[1] = str[i+1]) == '\0') break;
-    mbuf[2] = '\0';
-    buf[j++] = (char)strtol(mbuf, NULL, 16);
-  }
-  buf[j] = '\0';
-  *sp = j;
-  return buf;
-}
-
-
-/* create a integer object from a decimal string */
-char *dectoiobj(const char *str, int *sp){
-  char *buf;
-  int num;
-  num = atoi(str);
-  if(!(buf = malloc(sizeof(int)))) return NULL;
-  *(int *)buf = num;
-  *sp = sizeof(int);
-  return buf;
-}
-
-
-/* parse arguments of create command */
-int runcreate(int argc, char **argv){
-  char *name;
-  int i, sb, bnum, dnum, rv;
-  name = NULL;
-  sb = FALSE;
-  bnum = -1;
-  dnum = -1;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-s")){
-        sb = TRUE;
-      } else if(!strcmp(argv[i], "-bnum")){
-        if(++i >= argc) usage();
-        bnum = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-dnum")){
-        if(++i >= argc) usage();
-        dnum = atoi(argv[i]);
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = docreate(name, bnum, dnum, sb);
-  return rv;
-}
-
-
-/* parse arguments of put command */
-int runput(int argc, char **argv){
-  char *name, *key, *val, *kbuf, *vbuf;
-  int i, kx, ki, vx, vi, vf, lob, ksiz, vsiz, align, rv;
-  int dmode;
-  name = NULL;
-  kx = FALSE;
-  ki = FALSE;
-  vx = FALSE;
-  vi = FALSE;
-  vf = FALSE;
-  lob = FALSE;
-  align = ALIGNSIZ;
-  key = NULL;
-  val = NULL;
-  dmode = CR_DOVER;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-kx")){
-        kx = TRUE;
-      } else if(!strcmp(argv[i], "-ki")){
-        ki = TRUE;
-      } else if(!strcmp(argv[i], "-vx")){
-        vx = TRUE;
-      } else if(!strcmp(argv[i], "-vi")){
-        vi = TRUE;
-      } else if(!strcmp(argv[i], "-vf")){
-        vf = TRUE;
-      } else if(!strcmp(argv[i], "-keep")){
-        dmode = CR_DKEEP;
-      } else if(!strcmp(argv[i], "-cat")){
-        dmode = CR_DCAT;
-      } else if(!strcmp(argv[i], "-lob")){
-        lob = TRUE;
-      } else if(!strcmp(argv[i], "-na")){
-        align = 0;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else if(!key){
-      key = argv[i];
-    } else if(!val){
-      val = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !key || !val) usage();
-  if(kx){
-    kbuf = hextoobj(key, &ksiz);
-  } else if(ki){
-    kbuf = dectoiobj(key, &ksiz);
-  } else {
-    kbuf = cbmemdup(key, -1);
-    ksiz = -1;
-  }
-  if(vx){
-    vbuf = hextoobj(val, &vsiz);
-  } else if(vi){
-    vbuf = dectoiobj(val, &vsiz);
-  } else if(vf){
-    vbuf = cbreadfile(val, &vsiz);
-  } else {
-    vbuf = cbmemdup(val, -1);
-    vsiz = -1;
-  }
-  if(kbuf && vbuf){
-    rv = doput(name, kbuf, ksiz, vbuf, vsiz, dmode, lob, align);
-  } else {
-    if(vf){
-      fprintf(stderr, "%s: %s: cannot read\n", progname, val);
-    } else {
-      fprintf(stderr, "%s: out of memory\n", progname);
-    }
-    rv = 1;
-  }
-  free(kbuf);
-  free(vbuf);
-  return rv;
-}
-
-
-/* parse arguments of out command */
-int runout(int argc, char **argv){
-  char *name, *key, *kbuf;
-  int i, kx, ki, lob, ksiz, rv;
-  name = NULL;
-  kx = FALSE;
-  ki = FALSE;
-  lob = FALSE;
-  key = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-kx")){
-        kx = TRUE;
-      } else if(!strcmp(argv[i], "-ki")){
-        ki = TRUE;
-      } else if(!strcmp(argv[i], "-lob")){
-        lob = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else if(!key){
-      key = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !key) usage();
-  if(kx){
-    kbuf = hextoobj(key, &ksiz);
-  } else if(ki){
-    kbuf = dectoiobj(key, &ksiz);
-  } else {
-    kbuf = cbmemdup(key, -1);
-    ksiz = -1;
-  }
-  if(kbuf){
-    rv = doout(name, kbuf, ksiz, lob);
-  } else {
-    fprintf(stderr, "%s: out of memory\n", progname);
-    rv = 1;
-  }
-  free(kbuf);
-  return rv;
-}
-
-
-/* parse arguments of get command */
-int runget(int argc, char **argv){
-  char *name, *key, *kbuf;
-  int i, opts, kx, ki, ox, lob, nb, start, max, ksiz, rv;
-  name = NULL;
-  opts = 0;
-  kx = FALSE;
-  ki = FALSE;
-  ox = FALSE;
-  lob = FALSE;
-  nb = FALSE;
-  start = 0;
-  max = -1;
-  key = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-nl")){
-        opts |= CR_ONOLCK;
-      } else if(!strcmp(argv[i], "-kx")){
-        kx = TRUE;
-      } else if(!strcmp(argv[i], "-ki")){
-        ki = TRUE;
-      } else if(!strcmp(argv[i], "-ox")){
-        ox = TRUE;
-      } else if(!strcmp(argv[i], "-lob")){
-        lob = TRUE;
-      } else if(!strcmp(argv[i], "-n")){
-        nb = TRUE;
-      } else if(!strcmp(argv[i], "-start")){
-        if(++i >= argc) usage();
-        start = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-max")){
-        if(++i >= argc) usage();
-        max = atoi(argv[i]);
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else if(!key){
-      key = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !key || start < 0) usage();
-  if(kx){
-    kbuf = hextoobj(key, &ksiz);
-  } else if(ki){
-    kbuf = dectoiobj(key, &ksiz);
-  } else {
-    kbuf = cbmemdup(key, -1);
-    ksiz = -1;
-  }
-  if(kbuf){
-    rv = doget(name, opts, kbuf, ksiz, start, max, ox, lob, nb);
-  } else {
-    fprintf(stderr, "%s: out of memory\n", progname);
-    rv = 1;
-  }
-  free(kbuf);
-  return rv;
-}
-
-
-/* parse arguments of list command */
-int runlist(int argc, char **argv){
-  char *name;
-  int i, opts, kb, vb, ox, rv;
-  name = NULL;
-  opts = 0;
-  kb = FALSE;
-  vb = FALSE;
-  ox = FALSE;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-nl")){
-        opts |= CR_ONOLCK;
-      } else if(!strcmp(argv[i], "-k")){
-        kb = TRUE;
-      } else if(!strcmp(argv[i], "-v")){
-        vb = TRUE;
-      } else if(!strcmp(argv[i], "-ox")){
-        ox = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = dolist(name, opts, kb, vb, ox);
-  return rv;
-}
-
-
-/* parse arguments of optimize command */
-int runoptimize(int argc, char **argv){
-  char *name;
-  int i, bnum, align, rv;
-  name = NULL;
-  bnum = -1;
-  align = ALIGNSIZ;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-bnum")){
-        if(++i >= argc) usage();
-        bnum = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-na")){
-        align = 0;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = dooptimize(name, bnum, align);
-  return rv;
-}
-
-
-/* parse arguments of inform command */
-int runinform(int argc, char **argv){
-  char *name;
-  int i, opts, rv;
-  name = NULL;
-  opts = 0;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-nl")){
-        opts |= CR_ONOLCK;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = doinform(name, opts);
-  return rv;
-}
-
-
-/* parse arguments of remove command */
-int runremove(int argc, char **argv){
-  char *name;
-  int i, rv;
-  name = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      usage();
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = doremove(name);
-  return rv;
-}
-
-
-/* parse arguments of repair command */
-int runrepair(int argc, char **argv){
-  char *name;
-  int i, rv;
-  name = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      usage();
-    } else if(!name){
-      name = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name) usage();
-  rv = dorepair(name);
-  return rv;
-}
-
-
-/* parse arguments of exportdb command */
-int runexportdb(int argc, char **argv){
-  char *name, *dir;
-  int i, rv;
-  name = NULL;
-  dir = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      usage();
-    } else if(!name){
-      name = argv[i];
-    } else if(!dir){
-      dir = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !dir) usage();
-  rv = doexportdb(name, dir);
-  return rv;
-}
-
-
-/* parse arguments of importdb command */
-int runimportdb(int argc, char **argv){
-  char *name, *dir;
-  int i, bnum, dnum, rv;
-  name = NULL;
-  dir = NULL;
-  bnum = -1;
-  dnum = -1;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-bnum")){
-        if(++i >= argc) usage();
-        bnum = atoi(argv[i]);
-      } else if(!strcmp(argv[i], "-dnum")){
-        if(++i >= argc) usage();
-        dnum = atoi(argv[i]);
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else if(!dir){
-      dir = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !dir) usage();
-  rv = doimportdb(name, dir, bnum, dnum);
-  return rv;
-}
-
-
-/* parse arguments of snaffle command */
-int runsnaffle(int argc, char **argv){
-  char *name, *key, *kbuf;
-  int i, kx, ki, ox, nb, start, max, ksiz, rv;
-  name = NULL;
-  kx = FALSE;
-  ki = FALSE;
-  ox = FALSE;
-  nb = FALSE;
-  start = 0;
-  max = -1;
-  key = NULL;
-  for(i = 2; i < argc; i++){
-    if(!name && argv[i][0] == '-'){
-      if(!strcmp(argv[i], "-kx")){
-        kx = TRUE;
-      } else if(!strcmp(argv[i], "-ki")){
-        ki = TRUE;
-      } else if(!strcmp(argv[i], "-ox")){
-        ox = TRUE;
-      } else if(!strcmp(argv[i], "-n")){
-        nb = TRUE;
-      } else {
-        usage();
-      }
-    } else if(!name){
-      name = argv[i];
-    } else if(!key){
-      key = argv[i];
-    } else {
-      usage();
-    }
-  }
-  if(!name || !key || start < 0) usage();
-  if(kx){
-    kbuf = hextoobj(key, &ksiz);
-  } else if(ki){
-    kbuf = dectoiobj(key, &ksiz);
-  } else {
-    kbuf = cbmemdup(key, -1);
-    ksiz = -1;
-  }
-  if(kbuf){
-    rv = dosnaffle(name, kbuf, ksiz, ox, nb);
-  } else {
-    fprintf(stderr, "%s: out of memory\n", progname);
-    rv = 1;
-  }
-  free(kbuf);
-  return rv;
-}
-
-
-/* print an error message */
-void pdperror(const char *name){
-  fprintf(stderr, "%s: %s: %s\n", progname, name, dperrmsg(dpecode));
-}
-
-
-/* print an object */
-void printobj(const char *obj, int size){
-  int i;
-  for(i = 0; i < size; i++){
-    putchar(obj[i]);
-  }
-}
-
-
-/* print an object as a hexadecimal string */
-void printobjhex(const char *obj, int size){
-  int i;
-  for(i = 0; i < size; i++){
-    printf("%s%02X", i > 0 ? " " : "", ((const unsigned char *)obj)[i]);
-  }
-}
-
-
-/* perform create command */
-int docreate(const char *name, int bnum, int dnum, int sparse){
-  CURIA *curia;
-  int omode;
-  omode = CR_OWRITER | CR_OCREAT | CR_OTRUNC | (sparse ? CR_OSPARSE : 0);
-  if(!(curia = cropen(name, omode, bnum, dnum))){
-    pdperror(name);
-    return 1;
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform put command */
-int doput(const char *name, const char *kbuf, int ksiz,
-          const char *vbuf, int vsiz, int dmode, int lob, int align){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OWRITER, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  if(align > 0 && !crsetalign(curia, ALIGNSIZ)){
-    pdperror(name);
-    crclose(curia);
-    return 1;
-  }
-  if(lob){
-    if(!crputlob(curia, kbuf, ksiz, vbuf, vsiz, dmode)){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  } else {
-    if(!crput(curia, kbuf, ksiz, vbuf, vsiz, dmode)){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform out command */
-int doout(const char *name, const char *kbuf, int ksiz, int lob){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OWRITER, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  if(lob){
-    if(!croutlob(curia, kbuf, ksiz)){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  } else {
-    if(!crout(curia, kbuf, ksiz)){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform get command */
-int doget(const char *name, int opts, const char *kbuf, int ksiz,
-          int start, int max, int ox, int lob, int nb){
-  CURIA *curia;
-  char *vbuf;
-  int vsiz;
-  if(!(curia = cropen(name, CR_OREADER | opts, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  if(lob){
-    if(!(vbuf = crgetlob(curia, kbuf, ksiz, start, max, &vsiz))){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  } else {
-    if(!(vbuf = crget(curia, kbuf, ksiz, start, max, &vsiz))){
-      pdperror(name);
-      crclose(curia);
-      return 1;
-    }
-  }
-  if(ox){
-    printobjhex(vbuf, vsiz);
-  } else {
-    printobj(vbuf, vsiz);
-  }
-  free(vbuf);
-  if(!nb) putchar('\n');
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform list command */
-int dolist(const char *name, int opts, int kb, int vb, int ox){
-  CURIA *curia;
-  char *kbuf, *vbuf;
-  int ksiz, vsiz;
-  if(!(curia = cropen(name, CR_OREADER | opts, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  criterinit(curia);
-  while((kbuf = criternext(curia, &ksiz)) != NULL){
-    if(!(vbuf = crget(curia, kbuf, ksiz, 0, -1, &vsiz))){
-      pdperror(name);
-      free(kbuf);
-      break;
-    }
-    if(ox){
-      if(!vb) printobjhex(kbuf, ksiz);
-      if(!kb && !vb) putchar('\t');
-      if(!kb) printobjhex(vbuf, vsiz);
-    } else {
-      if(!vb) printobj(kbuf, ksiz);
-      if(!kb && !vb) putchar('\t');
-      if(!kb) printobj(vbuf, vsiz);
-    }
-    putchar('\n');
-    free(vbuf);
-    free(kbuf);
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform optimize command */
-int dooptimize(const char *name, int bnum, int align){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OWRITER, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  if(align > 0 && !crsetalign(curia, ALIGNSIZ)){
-    pdperror(name);
-    crclose(curia);
-    return 1;
-  }
-  if(!croptimize(curia, bnum)){
-    pdperror(name);
-    crclose(curia);
-    return 1;
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform inform command */
-int doinform(const char *name, int opts){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OREADER | opts, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  printf("name: %s\n", crname(curia));
-  printf("file size: %.0f\n", crfsizd(curia));
-  printf("all buckets: %d\n", crbnum(curia));
-  printf("used buckets: %d\n", crbusenum(curia));
-  printf("records: %d\n", crrnum(curia));
-  printf("inode number: %d\n", crinode(curia));
-  printf("modified time: %.0f\n", (double)crmtime(curia));
-  printf("LOB records: %d\n", crrnumlob(curia));
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform remove command */
-int doremove(const char *name){
-  if(!crremove(name)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform repair command */
-int dorepair(const char *name){
-  if(!crrepair(name)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform exportdb command */
-int doexportdb(const char *name, const char *dir){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OREADER, -1, -1))){
-    pdperror(name);
-    return 1;
-  }
-  if(!crexportdb(curia, dir)){
-    pdperror(name);
-    crclose(curia);
-    return 1;
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform importdb command */
-int doimportdb(const char *name, const char *dir, int bnum, int dnum){
-  CURIA *curia;
-  if(!(curia = cropen(name, CR_OWRITER | CR_OCREAT | CR_OTRUNC, bnum, dnum))){
-    pdperror(name);
-    return 1;
-  }
-  if(!crimportdb(curia, dir)){
-    pdperror(name);
-    crclose(curia);
-    return 1;
-  }
-  if(!crclose(curia)){
-    pdperror(name);
-    return 1;
-  }
-  return 0;
-}
-
-
-/* perform snaffle command */
-int dosnaffle(const char *name, const char *kbuf, int ksiz, int ox, int nb){
-  char *vbuf;
-  int vsiz;
-  if(!(vbuf = crsnaffle(name, kbuf, ksiz, &vsiz))){
-    pdperror(name);
-    return 1;
-  }
-  if(ox){
-    printobjhex(vbuf, vsiz);
-  } else {
-    printobj(vbuf, vsiz);
-  }
-  free(vbuf);
-  if(!nb) putchar('\n');
-  return 0;
-}
-
-
-
-/* END OF FILE */

Copied: box/trunk/qdbm/crmgr.c (from rev 2716, box/trunk/qdbm/crmgr.c)
===================================================================
--- box/trunk/qdbm/crmgr.c	                        (rev 0)
+++ box/trunk/qdbm/crmgr.c	2010-10-18 20:34:25 UTC (rev 2794)
@@ -0,0 +1,956 @@
+/*************************************************************************************************
+ * Utility for debugging Curia and its applications
+ *                                                      Copyright (C) 2000-2007 Mikio Hirabayashi
+ * This file is part of QDBM, Quick Database Manager.
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
+ * Lesser General Public License as published by the Free Software Foundation; either version
+ * 2.1 of the License or any later version.  QDBM 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 Lesser General Public License for more
+ * details.
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA.
+ *************************************************************************************************/
+
+
+#include <depot.h>
+#include <curia.h>
+#include <cabin.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include