gstein 00/12/02 08:13:50
Added: . .cvsignore Makefile.in STATUS buildconf.sh
configure.in
build .cvsignore Makefile.in install-sh rules.mk.in
include sdbm.h
src .cvsignore Makefile.in
src/buckets .cvsignore Makefile.in
src/crypto .cvsignore Makefile.in
src/dbm .cvsignore Makefile.in
src/dbm/sdbm .cvsignore Makefile.in sdbm.c sdbm_hash.c
sdbm_lock.c sdbm_pair.c sdbm_pair.h sdbm_private.h
sdbm_tune.h
src/encoding .cvsignore Makefile.in
src/hooks .cvsignore Makefile.in
src/uri .cvsignore Makefile.in
src/xml .cvsignore Makefile.in
test .cvsignore Makefile.in
Log:
initial population of the APRUTIL module.
*) add configure/build system
*) add an initial directory layout (from email proposal)
*) add the SDBM files as a quick test of the build
[ these came from apache-2.0/src/lib/sdbm; no tag ]
*) add an empty STATUS file for tracking the project
Revision Changes Path
1.1 apr-util/.cvsignore
Index: .cvsignore
===================================================================
.libs
Makefile
aclocal.m4
config.cache
config.log
config.status
configure
libtool
libaprutil.la
1.1 apr-util/Makefile.in
Index: Makefile.in
===================================================================
#
# Top-level Makefile for APRUTIL
#
TARGETS = libaprutil.la
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
SUBDIRS = src . test build
DISTCLEAN_TARGETS = config.cache config.log config.status config.sub \
include/apu_config.h
EXTRACLEAN_TARGETS = configure libtool aclocal.m4 include/apu_config.h.in
### fix this up at some point (install location)
libdir = /usr/local/lib
libaprutil.la:
@objects="`find src -name '*.lo'`" ; \
echo $(LINK) $$objects ; \
$(LINK) -rpath $(libdir) $$objects
1.1 apr-util/STATUS
Index: STATUS
===================================================================
APRUTIL LIBRARY STATUS:
Last modified at [$Date: 2000/12/02 16:13:46 $]
Release:
RELEASE SHOWSTOPPERS:
* Fill repository with code
RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP:
Documentation that needs writing:
* API documentation
Status:
1.1 apr-util/buildconf.sh
Index: buildconf.sh
===================================================================
#!/bin/sh
#
# Get a copy of libtool's libtool.m4 and copy it into our aclocal.m4
#
# If we ever have our own .m4 files, then we will want to concatenate
# them altogether into aclocal.m4
#
### we may need to get smarter with these two lines
ltpath=`which libtoolize`
ltpath=`dirname $ltpath`
ltfile=`cd $ltpath/../share/aclocal ; pwd`/libtool.m4
echo "Incorporating $ltfile into aclocal.m4 ..."
cat $ltfile > aclocal.m4
#
# Create the libtool helper files
#
# Note: we always replace the files, and we copy (rather than link) them.
#
echo "Copying libtool helper files ..."
$ltpath/libtoolize --force --copy
#
# Generate the autoconf header (include/apu_config.h) and ./configure
#
echo "Creating include/apu_config.h ..."
autoheader
echo "Creating configure ..."
### do some work to toss config.cache?
autoconf
1.1 apr-util/configure.in
Index: configure.in
===================================================================
dnl
dnl Process this file with autoconf to produce a configure script
dnl
AC_PREREQ(2.13)
AC_INIT(build/rules.mk.in)
AC_CONFIG_HEADER(include/apu_config.h)
AC_CONFIG_AUX_DIR(build)
AC_PROG_CC
AC_CHECK_PROG(RM, rm, rm)
dnl
dnl figure out where APR is located
dnl
AC_MSG_CHECKING(for APR)
AC_ARG_WITH(apr,
[ --with-apr=DIR path to APR source or the APR includes.],
[
if test "$withval" = "yes"; then
AC_MSG_ERROR(You need to specify a directory with --with-apr)
fi
absdir="`cd $withval ; pwd`"
if test -f "$absdir/apr_pools.h"; then
APR_INCLUDES="$absdir"
elif test -f "$absdir/include/apr_pools.h"; then
APR_INCLUDES="$absdir/include"
fi
],[
dnl see if we can find APR
if test -f "$srcdir/apr/include/apr_pools.h"; then
APR_INCLUDES="$srcdir/apr/include"
fi
])
if test -z "$APR_INCLUDES"; then
AC_MSG_RESULT(not found)
AC_MSG_ERROR(APR could not be located. Please use the --with-apr option.)
fi
AC_MSG_RESULT($APR_INCLUDES)
dnl
dnl compute the top directory of the build
dnl
top_builddir="`cd $srcdir ; pwd`"
AC_SUBST(top_builddir)
dnl
dnl prep libtool
dnl
echo "performing libtool configuration..."
AC_PROG_LIBTOOL
dnl
dnl set up the compilation flags and stuff
dnl
INCLUDES="-I$APR_INCLUDES -I\$(top_builddir)/include"
CFLAGS="$CFLAGS $INCLUDES"
AC_OUTPUT([
Makefile
build/Makefile
build/rules.mk
src/Makefile
src/buckets/Makefile
src/crypto/Makefile
src/dbm/Makefile
src/dbm/sdbm/Makefile
src/encoding/Makefile
src/hooks/Makefile
src/uri/Makefile
src/xml/Makefile
test/Makefile
])
1.1 apr-util/build/.cvsignore
Index: .cvsignore
===================================================================
config.guess
config.sub
ltconfig
ltmain.sh
rules.mk
1.1 apr-util/build/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
EXTRACLEAN_TARGETS = config.guess config.sub ltconfig ltmain.sh rules.mk
1.1 apr-util/build/install-sh
Index: install-sh
===================================================================
#!/bin/sh
##
## install.sh -- install a program, script or datafile
##
## Based on `install-sh' from the X Consortium's X11R5 distribution
## as of 89/12/18 which is freely available.
## Cleaned up for Apache's Autoconf-style Interface (APACI)
## by Ralf S. Engelschall <[EMAIL PROTECTED]>
##
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE
#
# put in absolute paths if you don't have them in your path;
# or use env. vars.
#
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
#
# parse argument line
#
instcmd="$mvprog"
chmodcmd=""
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
ext=""
src=""
dst=""
while [ "x$1" != "x" ]; do
case $1 in
-c) instcmd="$cpprog"
shift; continue
;;
-m) chmodcmd="$chmodprog $2"
shift; shift; continue
;;
-o) chowncmd="$chownprog $2"
shift; shift; continue
;;
-g) chgrpcmd="$chgrpprog $2"
shift; shift; continue
;;
-s) stripcmd="$stripprog"
shift; continue
;;
-S) stripcmd="$stripprog $2"
shift; shift; continue
;;
-e) ext="$2"
shift; shift; continue
;;
*) if [ "x$src" = "x" ]; then
src=$1
else
dst=$1
fi
shift; continue
;;
esac
done
if [ "x$src" = "x" ]; then
echo "install.sh: no input file specified"
exit 1
fi
if [ "x$dst" = "x" ]; then
echo "install.sh: no destination specified"
exit 1
fi
#
# If destination is a directory, append the input filename; if
# your system does not like double slashes in filenames, you may
# need to add some logic
#
if [ -d $dst ]; then
dst="$dst/`basename $src`"
fi
# Add a possible extension (such as ".exe") to src and dst
src="$src$ext"
dst="$dst$ext"
# Make a temp file name in the proper directory.
dstdir=`dirname $dst`
dsttmp=$dstdir/#inst.$$#
# Move or copy the file name to the temp name
$instcmd $src $dsttmp
# And set any options; do chmod last to preserve setuid bits
if [ "x$chowncmd" != "x" ]; then $chowncmd $dsttmp; fi
if [ "x$chgrpcmd" != "x" ]; then $chgrpcmd $dsttmp; fi
if [ "x$stripcmd" != "x" ]; then $stripcmd $dsttmp; fi
if [ "x$chmodcmd" != "x" ]; then $chmodcmd $dsttmp; fi
# Now rename the file to the real destination.
$rmcmd $dst
$mvcmd $dsttmp $dst
exit 0
1.1 apr-util/build/rules.mk.in
Index: rules.mk.in
===================================================================
# ====================================================================
# The Apache Software License, Version 1.1
#
# Copyright (c) 2000 The Apache Software Foundation. All rights
# reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# 3. The end-user documentation included with the redistribution,
# if any, must include the following acknowledgment:
# "This product includes software developed by the
# Apache Software Foundation (http://www.apache.org/)."
# Alternately, this acknowledgment may appear in the software itself,
# if and wherever such third-party acknowledgments normally appear.
#
# 4. The names "Apache" and "Apache Software Foundation" must
# not be used to endorse or promote products derived from this
# software without prior written permission. For written
# permission, please contact [EMAIL PROTECTED]
#
# 5. Products derived from this software may not be called "Apache",
# nor may "Apache" appear in their name, without prior written
# permission of the Apache Software Foundation.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# ====================================================================
#
# This software consists of voluntary contributions made by many
# individuals on behalf of the Apache Software Foundation. For more
# information on the Apache Software Foundation, please see
# <http://www.apache.org/>.
#
#
# rules.mk: standard rules for APRUTIL
#
#
# Configuration variables
#
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
### make LTFLAGS somewhat variable?
LTFLAGS = --silent
#
# Basic macro setup
#
COMPILE = $(CC) $(CFLAGS)
LT_COMPILE = $(LIBTOOL) --mode=compile $(LTFLAGS) $(COMPILE) -c $< && touch
$@
LINK = $(LIBTOOL) --mode=link $(LTFLAGS) $(COMPILE) $(LDFLAGS) -o $@
#
# Standard build rules
#
all: all-recursive
depend: depend-recursive
clean: clean-recursive
distclean: distclean-recursive
extraclean: extraclean-recursive
install: all-recursive
local-clean:
$(RM) -f *.o *.lo *.a *.la *.so $(CLEAN_TARGETS)
$(RM) -rf .libs
all-recursive depend-recursive clean-recursive distclean-recursive \
extraclean-recursive:
@otarget=`echo $@|sed s/-recursive//`; \
for i in $(SUBDIRS); do \
target="$$otarget"; \
echo "Making $$target in $$i"; \
if test "$$i" = "."; then \
made_local=yes; \
target="local-$$target"; \
fi; \
(cd $$i && $(MAKE) $$target) || exit 1; \
done; \
if test "$$otarget" = "all" && test -z "$(TARGETS)"; then \
made_local=n/a; \
fi; \
if test -z "$$made_local"; then \
$(MAKE) "local-$$otarget" || exit 1; \
fi
# nothing to do for this target
local-distclean: local-clean
$(RM) -f Makefile $(DISTCLEAN_TARGETS)
local-extraclean: local-distclean
@if test -n "$(EXTRACLEAN_TARGETS)"; then \
echo $(RM) -f $(EXTRACLEAN_TARGETS) ; \
$(RM) -f $(EXTRACLEAN_TARGETS) ; \
fi
local-all: $(TARGETS)
local-depend:
### need something here
#
# Implicit rules for creating outputs from input files
#
.SUFFIXES:
.SUFFIXES: .c .lo .o
.c.o:
$(COMPILE) -c $<
.c.lo:
$(LT_COMPILE)
.PHONY: all depend clean distclean install \
all-recursive depend-recursive clean-recursive distclean-recursive \
local-all local-depend local-clean local-distclean
1.1 apr-util/include/sdbm.h
Index: sdbm.h
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: [EMAIL PROTECTED]
* status: ex-public domain
*/
#ifndef SDBM_H
#define SDBM_H
#include "apr_errno.h"
#include "apr_file_io.h" /* for apr_fileperms_t */
typedef struct SDBM SDBM;
/* utility functions */
int sdbm_rdonly(SDBM *db);
int sdbm_error(SDBM *db);
int sdbm_clearerr(SDBM *db);
typedef struct {
char *dptr;
int dsize;
} sdbm_datum;
/* The extensions used for the database files */
#define SDBM_DIRFEXT ".dir"
#define SDBM_PAGFEXT ".pag"
/* Standard dbm interface */
apr_status_t sdbm_open(SDBM **db, const char *filename, apr_int32_t flags,
apr_fileperms_t perms, apr_pool_t *p);
void sdbm_close(SDBM *db); /* ### should return value? */
sdbm_datum sdbm_fetch(SDBM *db, sdbm_datum key);
apr_status_t sdbm_delete(SDBM *db, const sdbm_datum key);
/* * flags to sdbm_store */
#define SDBM_INSERT 0
#define SDBM_REPLACE 1
apr_status_t sdbm_store(SDBM *db, sdbm_datum key, sdbm_datum value, int
flags);
sdbm_datum sdbm_firstkey(SDBM *db);
sdbm_datum sdbm_nextkey(SDBM *db);
/*
* other
*/
apr_status_t sdbm_prep(SDBM **db, const char *dirname, const char *pagname,
apr_int32_t flags, apr_fileperms_t perms,
apr_pool_t *pool);
long sdbm_hash(const char *str, int len);
#endif /* SDBM_H */
1.1 apr-util/src/.cvsignore
Index: .cvsignore
===================================================================
Makefile
1.1 apr-util/src/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
SUBDIRS = buckets crypto dbm encoding hooks uri xml
1.1 apr-util/src/buckets/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/buckets/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/crypto/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/crypto/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/dbm/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/dbm/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
SUBDIRS = sdbm .
1.1 apr-util/src/dbm/sdbm/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/dbm/sdbm/Makefile.in
Index: Makefile.in
===================================================================
TARGETS = sdbm.lo sdbm_hash.lo sdbm_lock.lo sdbm_pair.lo
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/dbm/sdbm/sdbm.c
Index: sdbm.c
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: [EMAIL PROTECTED]
* ex-public domain, ported to APR for Apache 2
* core routines
*/
#include "sdbm.h"
#include "sdbm_tune.h"
#include "sdbm_pair.h"
#include "sdbm_private.h"
#include "apr.h"
#include "apr_file_io.h"
#include "apr_strings.h"
#include "apr_errno.h"
#include <string.h> /* for memset() */
#include <stdlib.h> /* for malloc() and free() */
/*
* forward
*/
static int getdbit (SDBM *, long);
static apr_status_t setdbit(SDBM *, long);
static apr_status_t getpage(SDBM *db, long);
static sdbm_datum getnext(SDBM *db);
static apr_status_t makroom(SDBM *, long, int);
/*
* useful macros
*/
#define SDBM_IOERR 0x2 /* data base I/O error */
#define bad(x) ((x).dptr == NULL || (x).dsize <= 0)
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
#define ioerr(db) ((db)->flags |= SDBM_IOERR)
/* ### Does anything need these externally? */
#define sdbm_dirfno(db) ((db)->dirf)
#define sdbm_pagfno(db) ((db)->pagf)
#define OFF_PAG(off) (apr_off_t) (off) * PBLKSIZ
#define OFF_DIR(off) (apr_off_t) (off) * DBLKSIZ
static long masks[] = {
000000000000, 000000000001, 000000000003, 000000000007,
000000000017, 000000000037, 000000000077, 000000000177,
000000000377, 000000000777, 000000001777, 000000003777,
000000007777, 000000017777, 000000037777, 000000077777,
000000177777, 000000377777, 000000777777, 000001777777,
000003777777, 000007777777, 000017777777, 000037777777,
000077777777, 000177777777, 000377777777, 000777777777,
001777777777, 003777777777, 007777777777, 017777777777
};
const sdbm_datum sdbm_nullitem = { NULL, 0 };
static apr_status_t database_cleanup(void *data)
{
SDBM *db = data;
(void) apr_close(db->dirf);
(void) sdbm_unlock(db);
(void) apr_close(db->pagf);
free(db);
return APR_SUCCESS;
}
apr_status_t
sdbm_open(SDBM **db, const char *file, apr_int32_t flags, apr_fileperms_t
perms, apr_pool_t *p)
{
char *dirname = apr_pstrcat(p, file, SDBM_DIRFEXT, NULL);
char *pagname = apr_pstrcat(p, file, SDBM_PAGFEXT, NULL);
return sdbm_prep(db, dirname, pagname, flags, perms, p);
}
apr_status_t
sdbm_prep(SDBM **pdb, const char *dirname, const char *pagname,
apr_int32_t flags, apr_fileperms_t perms, apr_pool_t *p)
{
SDBM *db;
apr_finfo_t finfo;
apr_status_t status;
*pdb = NULL;
db = malloc(sizeof(*db));
memset(db, 0, sizeof(*db));
db->pool = p;
/*
* adjust user flags so that WRONLY becomes RDWR,
* as required by this package. Also set our internal
* flag for RDONLY if needed.
*/
if (!(flags & APR_WRITE)) {
db->flags = SDBM_RDONLY;
}
flags |= APR_BINARY | APR_READ;
/*
* open the files in sequence, and stat the dirfile.
* If we fail anywhere, undo everything, return NULL.
*/
if ((status = apr_open(&db->pagf, pagname, flags, perms, p))
!= APR_SUCCESS)
goto error;
if ((status = sdbm_lock(db)) != APR_SUCCESS)
goto error;
if ((status = apr_open(&db->dirf, dirname, flags, perms, p))
!= APR_SUCCESS)
goto error;
/*
* need the dirfile size to establish max bit number.
*/
if ((status = apr_getfileinfo(&finfo, db->dirf)) != APR_SUCCESS)
goto error;
/*
* zero size: either a fresh database, or one with a single,
* unsplit data page: dirpage is all zeros.
*/
db->dirbno = (!finfo.size) ? 0 : -1;
db->pagbno = -1;
db->maxbno = finfo.size * BYTESIZ;
/* (apr_pcalloc zeroed the buffers) */
/* make sure that we close the database at some point */
apr_register_cleanup(p, db, database_cleanup, apr_null_cleanup);
/* Done! */
*pdb = db;
return APR_SUCCESS;
error:
if (db->dirf != NULL)
(void) apr_close(db->dirf);
if (db->pagf != NULL) {
(void) sdbm_unlock(db);
(void) apr_close(db->dirf);
}
free(db);
return status;
}
void
sdbm_close(SDBM *db)
{
(void) apr_run_cleanup(db->pool, db, database_cleanup);
}
sdbm_datum
sdbm_fetch(SDBM *db, sdbm_datum key)
{
if (db == NULL || bad(key))
return sdbm_nullitem;
if (getpage(db, exhash(key)) == APR_SUCCESS)
return getpair(db->pagbuf, key);
ioerr(db);
return sdbm_nullitem;
}
static apr_status_t write_page(SDBM *db, const char *buf, long pagno)
{
apr_status_t status;
apr_off_t off = OFF_PAG(pagno);
if ((status = apr_seek(db->pagf, APR_SET, &off)) != APR_SUCCESS ||
(status = apr_full_write(db->pagf, buf, PBLKSIZ, NULL)) != APR_SUCCESS)
{
ioerr(db);
return status;
}
return APR_SUCCESS;
}
apr_status_t
sdbm_delete(SDBM *db, const sdbm_datum key)
{
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (sdbm_rdonly(db))
return APR_EINVAL;
if (getpage(db, exhash(key)) == APR_SUCCESS) {
if (!delpair(db->pagbuf, key))
return -1;
/*
* update the page file
*/
if ((status = write_page(db, db->pagbuf, db->pagbno)) !=
APR_SUCCESS)
return status;
return APR_SUCCESS;
}
ioerr(db);
return APR_EACCES;
}
apr_status_t sdbm_store(SDBM *db, sdbm_datum key, sdbm_datum val, int flags)
{
int need;
register long hash;
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (sdbm_rdonly(db))
return APR_EINVAL;
need = key.dsize + val.dsize;
/*
* is the pair too big (or too small) for this database ??
*/
if (need < 0 || need > PAIRMAX)
return APR_EINVAL;
if ((status = getpage(db, (hash = exhash(key)))) == APR_SUCCESS) {
/*
* if we need to replace, delete the key/data pair
* first. If it is not there, ignore.
*/
if (flags == SDBM_REPLACE)
(void) delpair(db->pagbuf, key);
#ifdef SEEDUPS
else if (duppair(db->pagbuf, key))
return APR_EEXIST;
#endif
/*
* if we do not have enough room, we have to split.
*/
if (!fitpair(db->pagbuf, need))
if ((status = makroom(db, hash, need)) != APR_SUCCESS)
return status;
/*
* we have enough room or split is successful. insert the key,
* and update the page file.
*/
(void) putpair(db->pagbuf, key, val);
if ((status = write_page(db, db->pagbuf, db->pagbno)) !=
APR_SUCCESS)
return status;
/*
* success
*/
return APR_SUCCESS;
}
ioerr(db);
return status;
}
/*
* makroom - make room by splitting the overfull page
* this routine will attempt to make room for SPLTMAX times before
* giving up.
*/
static apr_status_t
makroom(SDBM *db, long hash, int need)
{
long newp;
char twin[PBLKSIZ];
char *pag = db->pagbuf;
char *new = twin;
register int smax = SPLTMAX;
apr_status_t status;
do {
/*
* split the current page
*/
(void) splpage(pag, new, db->hmask + 1);
/*
* address of the new page
*/
newp = (hash & db->hmask) | (db->hmask + 1);
/*
* write delay, read avoidence/cache shuffle:
* select the page for incoming pair: if key is to go to the new page,
* write out the previous one, and copy the new one over, thus making
* it the current page. If not, simply write the new page, and we are
* still looking at the page of interest. current page is not updated
* here, as sdbm_store will do so, after it inserts the incoming pair.
*/
if (hash & (db->hmask + 1)) {
if ((status = write_page(db, db->pagbuf, db->pagbno)) !=
APR_SUCCESS)
return status;
db->pagbno = newp;
(void) memcpy(pag, new, PBLKSIZ);
}
else {
if ((status = write_page(db, new, newp)) != APR_SUCCESS)
return status;
}
if ((status = setdbit(db, db->curbit)) != APR_SUCCESS)
return status;
/*
* see if we have enough room now
*/
if (fitpair(pag, need))
return APR_SUCCESS;
/*
* try again... update curbit and hmask as getpage would have
* done. because of our update of the current page, we do not
* need to read in anything. BUT we have to write the current
* [deferred] page out, as the window of failure is too great.
*/
db->curbit = 2 * db->curbit +
((hash & (db->hmask + 1)) ? 2 : 1);
db->hmask |= db->hmask + 1;
if ((status = write_page(db, db->pagbuf, db->pagbno))
!= APR_SUCCESS)
return status;
} while (--smax);
/*
* if we are here, this is real bad news. After SPLTMAX splits,
* we still cannot fit the key. say goodnight.
*/
#if 0
(void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44);
#endif
/* ### ENOSPC not really appropriate but better than nothing */
return APR_ENOSPC;
}
/* Reads 'len' bytes from file 'f' at offset 'off' into buf.
* 'off' is given relative to the start of the file.
* If EOF is returned while reading, this is taken as success.
*/
static apr_status_t read_from(apr_file_t *f, void *buf,
apr_off_t off, apr_size_t len)
{
apr_status_t status;
if ((status = apr_seek(f, APR_SET, &off)) != APR_SUCCESS ||
((status = apr_full_read(f, buf, len, NULL)) != APR_SUCCESS)) {
/* if EOF is reached, pretend we read all zero's */
if (status == APR_EOF) {
memset(buf, 0, len);
status = APR_SUCCESS;
}
return status;
}
return APR_SUCCESS;
}
/*
* the following two routines will break if
* deletions aren't taken into account. (ndbm bug)
*/
sdbm_datum
sdbm_firstkey(SDBM *db)
{
/*
* start at page 0
*/
if (read_from(db->pagf, db->pagbuf, OFF_PAG(0), PBLKSIZ) !=
APR_SUCCESS) {
ioerr(db);
return sdbm_nullitem;
}
db->pagbno = 0;
db->blkptr = 0;
db->keyptr = 0;
return getnext(db);
}
sdbm_datum
sdbm_nextkey(SDBM *db)
{
return getnext(db);
}
/*
* all important binary tree traversal
*/
static apr_status_t
getpage(SDBM *db, long hash)
{
register int hbit;
register long dbit;
register long pagb;
apr_status_t status;
dbit = 0;
hbit = 0;
while (dbit < db->maxbno && getdbit(db, dbit))
dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1);
debug(("dbit: %d...", dbit));
db->curbit = dbit;
db->hmask = masks[hbit];
pagb = hash & db->hmask;
/*
* see if the block we need is already in memory.
* note: this lookaside cache has about 10% hit rate.
*/
if (pagb != db->pagbno) {
/*
* note: here, we assume a "hole" is read as 0s.
* if not, must zero pagbuf first.
* ### joe: this assumption was surely never correct? but
* ### we make it so in read_from anyway.
*/
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(pagb),
PBLKSIZ))
!= APR_SUCCESS) {
ioerr(db);
return status;
}
if (!chkpage(db->pagbuf))
return APR_ENOSPC; /* ### better error? */
db->pagbno = pagb;
debug(("pag read: %d\n", pagb));
}
return APR_SUCCESS;
}
static int
getdbit(SDBM *db, long dbit)
{
register long c;
register long dirb;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if (read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ)
!= APR_SUCCESS)
return 0;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ);
}
static apr_status_t
setdbit(SDBM *db, long dbit)
{
register long c;
register long dirb;
apr_status_t status;
apr_off_t off;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if ((status = read_from(db->dirf, db->dirbuf, OFF_DIR(dirb),
DBLKSIZ))
!= APR_SUCCESS)
return status;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
if (dbit >= db->maxbno)
db->maxbno += DBLKSIZ * BYTESIZ;
off = OFF_DIR(dirb);
if (((status = apr_seek(db->dirf, APR_SET, &off)) != APR_SUCCESS)
|| (status = apr_full_write(db->dirf, db->dirbuf, DBLKSIZ,
NULL)) != APR_SUCCESS) {
return status;
}
return APR_SUCCESS;
}
/*
* getnext - get the next key in the page, and if done with
* the page, try the next page in sequence
*/
static sdbm_datum
getnext(SDBM *db)
{
sdbm_datum key;
for (;;) {
db->keyptr++;
key = getnkey(db->pagbuf, db->keyptr);
if (key.dptr != NULL)
return key;
/*
* we either run out, or there is nothing on this page..
* try the next one... If we lost our position on the
* file, we will have to seek.
*/
db->keyptr = 0;
if (db->pagbno != db->blkptr++) {
apr_off_t off = OFF_PAG(db->blkptr);
if (apr_seek(db->pagf, APR_SET, &off) != APR_SUCCESS)
break;
}
db->pagbno = db->blkptr;
/* ### EOF acceptable here too? */
if (apr_full_read(db->pagf, db->pagbuf, PBLKSIZ, NULL) !=
APR_SUCCESS)
break;
if (!chkpage(db->pagbuf))
break;
}
ioerr(db);
return sdbm_nullitem;
}
int sdbm_rdonly(SDBM *db)
{
return ((db)->flags & SDBM_RDONLY);
}
int sdbm_error(SDBM *db)
{
return ((db)->flags & SDBM_IOERR);
}
int sdbm_clearerr(SDBM *db)
{
return ((db)->flags &= ~SDBM_IOERR); /* ouch */
}
1.1 apr-util/src/dbm/sdbm/sdbm_hash.c
Index: sdbm_hash.c
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: [EMAIL PROTECTED]
* status: ex-public domain. keep it that way.
*
* hashing routine
*/
#include "sdbm.h"
/*
* polynomial conversion ignoring overflows
* [this seems to work remarkably well, in fact better
* then the ndbm hash function. Replace at your own risk]
* use: 65599 nice.
* 65587 even better.
*/
long sdbm_hash(const char *str, int len)
{
register unsigned long n = 0;
#define DUFF /* go ahead and use the loop-unrolled version */
#ifdef DUFF
#define HASHC n = *str++ + 65599 * n
if (len > 0) {
register int loop = (len + 8 - 1) >> 3;
switch(len & (8 - 1)) {
case 0: do {
HASHC; case 7: HASHC;
case 6: HASHC; case 5: HASHC;
case 4: HASHC; case 3: HASHC;
case 2: HASHC; case 1: HASHC;
} while (--loop);
}
}
#else
while (len--)
n = *str++ + 65599 * n;
#endif
return n;
}
1.1 apr-util/src/dbm/sdbm/sdbm_lock.c
Index: sdbm_lock.c
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#include "apr_file_io.h"
#include "sdbm.h"
#include "sdbm_private.h"
/* NOTE: this function blocks until it acquires the lock */
apr_status_t sdbm_lock(SDBM *db)
{
int type;
if ((db->flags & SDBM_RDONLY) == 0)
type = APR_FLOCK_EXCLUSIVE;
else
type = APR_FLOCK_SHARED;
return apr_lock_file(db->pagf, type);
}
apr_status_t sdbm_unlock(SDBM *db)
{
return apr_unlock_file(db->pagf);
}
1.1 apr-util/src/dbm/sdbm/sdbm_pair.c
Index: sdbm_pair.c
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: [EMAIL PROTECTED]
* status: ex-public domain.
*
* page-level routines
*/
#include "sdbm.h"
#include "sdbm_tune.h"
#include "sdbm_pair.h"
#include "sdbm_private.h"
#include <string.h> /* for memset() */
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
/*
* forward
*/
static int seepair(char *, int, char *, int);
/*
* page format:
* +------------------------------+
* ino | n | keyoff | datoff | keyoff |
* +------------+--------+--------+
* | datoff | - - - ----> |
* +--------+---------------------+
* | F R E E A R E A |
* +--------------+---------------+
* | <---- - - - | data |
* +--------+-----+----+----------+
* | key | data | key |
* +--------+----------+----------+
*
* calculating the offsets for free area: if the number
* of entries (ino[0]) is zero, the offset to the END of
* the free area is the block size. Otherwise, it is the
* nth (ino[ino[0]]) entry's offset.
*/
int
fitpair(pag, need)
char *pag;
int need;
{
register int n;
register int off;
register int avail;
register short *ino = (short *) pag;
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
avail = off - (n + 1) * sizeof(short);
need += 2 * sizeof(short);
debug(("avail %d need %d\n", avail, need));
return need <= avail;
}
void
putpair(pag, key, val)
char *pag;
sdbm_datum key;
sdbm_datum val;
{
register int n;
register int off;
register short *ino = (short *) pag;
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
/*
* enter the key first
*/
off -= key.dsize;
(void) memcpy(pag + off, key.dptr, key.dsize);
ino[n + 1] = off;
/*
* now the data
*/
off -= val.dsize;
(void) memcpy(pag + off, val.dptr, val.dsize);
ino[n + 2] = off;
/*
* adjust item count
*/
ino[0] += 2;
}
sdbm_datum
getpair(pag, key)
char *pag;
sdbm_datum key;
{
register int i;
register int n;
sdbm_datum val;
register short *ino = (short *) pag;
if ((n = ino[0]) == 0)
return sdbm_nullitem;
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
return sdbm_nullitem;
val.dptr = pag + ino[i + 1];
val.dsize = ino[i] - ino[i + 1];
return val;
}
#ifdef SEEDUPS
int
duppair(pag, key)
char *pag;
sdbm_datum key;
{
register short *ino = (short *) pag;
return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
}
#endif
sdbm_datum
getnkey(pag, num)
char *pag;
int num;
{
sdbm_datum key;
register int off;
register short *ino = (short *) pag;
num = num * 2 - 1;
if (ino[0] == 0 || num > ino[0])
return sdbm_nullitem;
off = (num > 1) ? ino[num - 1] : PBLKSIZ;
key.dptr = pag + ino[num];
key.dsize = off - ino[num];
return key;
}
int
delpair(pag, key)
char *pag;
sdbm_datum key;
{
register int n;
register int i;
register short *ino = (short *) pag;
if ((n = ino[0]) == 0)
return 0;
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
return 0;
/*
* found the key. if it is the last entry
* [i.e. i == n - 1] we just adjust the entry count.
* hard case: move all data down onto the deleted pair,
* shift offsets onto deleted offsets, and adjust them.
* [note: 0 < i < n]
*/
if (i < n - 1) {
register int m;
register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
register char *src = pag + ino[i + 1];
register int zoo = dst - src;
debug(("free-up %d ", zoo));
/*
* shift data/keys down
*/
m = ino[i + 1] - ino[n];
#undef DUFF /* just use memmove. it should be plenty fast. */
#ifdef DUFF
#define MOVB *--dst = *--src
if (m > 0) {
register int loop = (m + 8 - 1) >> 3;
switch (m & (8 - 1)) {
case 0: do {
MOVB; case 7: MOVB;
case 6: MOVB; case 5: MOVB;
case 4: MOVB; case 3: MOVB;
case 2: MOVB; case 1: MOVB;
} while (--loop);
}
}
#else
dst -= m;
src -= m;
memmove(dst, src, m);
#endif
/*
* adjust offset index up
*/
while (i < n - 1) {
ino[i] = ino[i + 2] + zoo;
i++;
}
}
ino[0] -= 2;
return 1;
}
/*
* search for the key in the page.
* return offset index in the range 0 < i < n.
* return 0 if not found.
*/
static int
seepair(pag, n, key, siz)
char *pag;
register int n;
register char *key;
register int siz;
{
register int i;
register int off = PBLKSIZ;
register short *ino = (short *) pag;
for (i = 1; i < n; i += 2) {
if (siz == off - ino[i] &&
memcmp(key, pag + ino[i], siz) == 0)
return i;
off = ino[i + 1];
}
return 0;
}
void
splpage(pag, new, sbit)
char *pag;
char *new;
long sbit;
{
sdbm_datum key;
sdbm_datum val;
register int n;
register int off = PBLKSIZ;
char cur[PBLKSIZ];
register short *ino = (short *) cur;
(void) memcpy(cur, pag, PBLKSIZ);
(void) memset(pag, 0, PBLKSIZ);
(void) memset(new, 0, PBLKSIZ);
n = ino[0];
for (ino++; n > 0; ino += 2) {
key.dptr = cur + ino[0];
key.dsize = off - ino[0];
val.dptr = cur + ino[1];
val.dsize = ino[0] - ino[1];
/*
* select the page pointer (by looking at sbit) and insert
*/
(void) putpair((exhash(key) & sbit) ? new : pag, key, val);
off = ino[1];
n -= 2;
}
debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
((short *) new)[0] / 2,
((short *) pag)[0] / 2));
}
/*
* check page sanity:
* number of entries should be something
* reasonable, and all offsets in the index should be in order.
* this could be made more rigorous.
*/
int
chkpage(pag)
char *pag;
{
register int n;
register int off;
register short *ino = (short *) pag;
if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short))
return 0;
if (n > 0) {
off = PBLKSIZ;
for (ino++; n > 0; ino += 2) {
if (ino[0] > off || ino[1] > off ||
ino[1] > ino[0])
return 0;
off = ino[1];
n -= 2;
}
}
return 1;
}
1.1 apr-util/src/dbm/sdbm/sdbm_pair.h
Index: sdbm_pair.h
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#ifndef SDBM_PAIR_H
#define SDBM_PAIR_H
/* Mini EMBED (pair.c) */
#define chkpage sdbm__chkpage
#define delpair sdbm__delpair
#define duppair sdbm__duppair
#define fitpair sdbm__fitpair
#define getnkey sdbm__getnkey
#define getpair sdbm__getpair
#define putpair sdbm__putpair
#define splpage sdbm__splpage
int fitpair(char *, int);
void putpair(char *, sdbm_datum, sdbm_datum);
sdbm_datum getpair(char *, sdbm_datum);
int delpair(char *, sdbm_datum);
int chkpage (char *);
sdbm_datum getnkey(char *, int);
void splpage(char *, char *, long);
#ifdef SEEDUPS
int duppair(char *, sdbm_datum);
#endif
#endif /* SDBM_PAIR_H */
1.1 apr-util/src/dbm/sdbm/sdbm_private.h
Index: sdbm_private.h
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: [EMAIL PROTECTED]
*/
#ifndef SDBM_PRIVATE_H
#define SDBM_PRIVATE_H
#include "apr.h"
#include "apr_pools.h"
#include "apr_file_io.h"
#include "apr_errno.h" /* for apr_status_t */
/* increase the block/page size and what can be inserted */
#if 1
#define DBLKSIZ 16384
#define PBLKSIZ 8192
#define PAIRMAX 8008 /* arbitrary on PBLKSIZ-N */
#else
#define DBLKSIZ 4096
#define PBLKSIZ 1024
#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */
#endif
#define SPLTMAX 10 /* maximum allowed splits */
/* for SDBM.flags */
#define SDBM_RDONLY 0x1 /* data base open read-only */
/* for a single insertion */
struct SDBM {
apr_pool_t *pool;
apr_file_t *dirf; /* directory file descriptor */
apr_file_t *pagf; /* page file descriptor */
apr_int32_t flags; /* status/error flags, see below
*/
long maxbno; /* size of dirfile in bits */
long curbit; /* current bit number */
long hmask; /* current hash mask */
long blkptr; /* current block for nextkey */
int keyptr; /* current key for nextkey */
long blkno; /* current page to read/write */
long pagbno; /* current page in pagbuf */
char pagbuf[PBLKSIZ]; /* page file block buffer */
long dirbno; /* current block in dirbuf */
char dirbuf[DBLKSIZ]; /* directory file block buffer */
};
apr_status_t sdbm_lock(SDBM *db);
apr_status_t sdbm_unlock(SDBM *db);
extern const sdbm_datum sdbm_nullitem;
#endif /* SDBM_PRIVATE_H */
1.1 apr-util/src/dbm/sdbm/sdbm_tune.h
Index: sdbm_tune.h
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* sdbm - ndbm work-alike hashed database library
* tuning and portability constructs [not nearly enough]
* author: [EMAIL PROTECTED]
*/
#ifndef SDBM_TUNE_H
#define SDBM_TUNE_H
#include "apr_errno.h"
/* ### this might be better off as sizeof(char *) */
#define BYTESIZ 8
/*
* important tuning parms (hah)
*/
#define SEEDUPS /* always detect duplicates */
#define BADMESS /* generate a message for worst case:
cannot make room after SPLTMAX splits */
/*
* misc
*/
#ifdef DEBUG
#define debug(x) printf x
#else
#define debug(x)
#endif
apr_status_t sdbm_fd_lock(int fd, int readonly);
apr_status_t sdbm_fd_unlock(int fd);
#endif /* SDBM_TUNE_H */
1.1 apr-util/src/encoding/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/encoding/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/hooks/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/hooks/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/uri/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/uri/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/src/xml/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/src/xml/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk
1.1 apr-util/test/.cvsignore
Index: .cvsignore
===================================================================
Makefile
*.lo
*.la
.libs
1.1 apr-util/test/Makefile.in
Index: Makefile.in
===================================================================
top_builddir = @top_builddir@
include $(top_builddir)/build/rules.mk