diff --git a/buckets/.cvsignore b/buckets/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/buckets/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/buckets/Makefile.in b/buckets/Makefile.in
deleted file mode 100644
index 941e7eb..0000000
--- a/buckets/Makefile.in
+++ /dev/null
@@ -1,8 +0,0 @@
-
-TARGETS = ap_buckets_file.lo ap_buckets_pool.lo ap_buckets_flush.lo \
-ap_buckets_refcount.lo ap_buckets_heap.lo ap_buckets_simple.lo ap_buckets.lo \
-ap_buckets_mmap.lo ap_buckets_socket.lo ap_buckets_eos.lo ap_buckets_pipe.lo \
-ap_buckets.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/buckets/ap_buckets.c b/buckets/ap_buckets.c
deleted file mode 100644
index 34fba9c..0000000
--- a/buckets/ap_buckets.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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.h"
-#include "apr_lib.h"
-#include "apr_pools.h"
-#include "apr_tables.h"
-#include "apr_errno.h"
-
-#include <stdlib.h>
-#if APR_HAVE_SYS_UIO_H
-#include <sys/uio.h>
-#endif
-
-#include "ap_buckets.h"
-
-static apr_array_header_t *bucket_types;
-
-static apr_status_t ap_brigade_cleanup(void *data)
-{
-    ap_bucket_brigade *b = data;
-    ap_bucket *e;
-
-    /*
-     * Bah! We can't use AP_RING_FOREACH here because this bucket has
-     * gone away when we dig inside it to get the next one.
-     */
-    while (!AP_BRIGADE_EMPTY(b)) {
-	e = AP_BRIGADE_FIRST(b);
-	AP_BUCKET_REMOVE(e);
-	ap_bucket_destroy(e);
-    }
-    /*
-     * We don't need to free(bb) because it's allocated from a pool.
-     */
-    return APR_SUCCESS;
-}
-APR_DECLARE(apr_status_t) ap_brigade_destroy(ap_bucket_brigade *b)
-{
-    apr_kill_cleanup(b->p, b, ap_brigade_cleanup);
-    return ap_brigade_cleanup(b);
-}
-
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_create(apr_pool_t *p)
-{
-    ap_bucket_brigade *b;
-
-    b = apr_palloc(p, sizeof(*b));
-    b->p = p;
-    AP_RING_INIT(&b->list, ap_bucket, link);
-
-    apr_register_cleanup(b->p, b, ap_brigade_cleanup, ap_brigade_cleanup);
-    return b;
-}
-
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_split(ap_bucket_brigade *b,
-						 ap_bucket *e)
-{
-    ap_bucket_brigade *a;
-    ap_bucket *f;
-
-    a = ap_brigade_create(b->p);
-    /* Return an empty brigade if there is nothing left in 
-     * the first brigade to split off 
-     */
-    if (e != AP_BRIGADE_SENTINEL(b)) {
-        f = AP_RING_LAST(&b->list);
-        AP_RING_UNSPLICE(e, f, link);
-        AP_RING_SPLICE_HEAD(&a->list, e, f, ap_bucket, link);
-    }
-    return a;
-}
-
-APR_DECLARE(ap_bucket *) ap_brigade_partition(ap_bucket_brigade *b, apr_off_t point)
-{
-    ap_bucket *e;
-    const char *s;
-    apr_size_t len;
-
-    if (point < 0)
-        return NULL;
-
-    AP_BRIGADE_FOREACH(e, b) {
-        /* bucket is of a known length */
-        if ((point > e->length) && (e->length != -1)) {
-            if (AP_BUCKET_IS_EOS(e))
-                return NULL;
-            point -= e->length;
-        }
-        else if (point == e->length) {
-            return AP_BUCKET_NEXT(e);
-        }
-        else {
-            /* try to split the bucket natively */
-            if (ap_bucket_split(e, point) != APR_ENOTIMPL)
-                return AP_BUCKET_NEXT(e);
-
-            /* if the bucket cannot be split, we must read from it,
-             * changing its type to one that can be split */
-            if (ap_bucket_read(e, &s, &len, AP_BLOCK_READ) != APR_SUCCESS)
-                return NULL;
-
-            if (point < len) {
-                if (ap_bucket_split(e, point) == APR_SUCCESS)
-                    return AP_BUCKET_NEXT(e);
-                else
-                    return NULL;
-            }
-            else if (point == len)
-                return AP_BUCKET_NEXT(e);
-            else
-                point -= len;
-        }
-    }
-    return NULL;
-}
-
-APR_DECLARE(int) ap_brigade_to_iovec(ap_bucket_brigade *b, 
-				    struct iovec *vec, int nvec)
-{
-    ap_bucket *e;
-    struct iovec *orig;
-    apr_size_t iov_len;
-
-    orig = vec;
-    AP_BRIGADE_FOREACH(e, b) {
-	if (nvec-- == 0)
-            break;
-	ap_bucket_read(e, (const char **)&vec->iov_base, &iov_len, AP_NONBLOCK_READ);
-        vec->iov_len = iov_len; /* set indirectly in case size differs */
-	++vec;
-    }
-    return vec - orig;
-}
-
-APR_DECLARE(int) ap_brigade_vputstrs(ap_bucket_brigade *b, va_list va)
-{
-    ap_bucket *r;
-    const char *x;
-    int j, k;
-    apr_size_t i;
-
-    for (k = 0;;) {
-        x = va_arg(va, const char *);
-        if (x == NULL)
-            break;
-        j = strlen(x);
-       
-	/* XXX: copy or not? let the caller decide? */
-        r = ap_bucket_create_heap(x, j, 1, &i);
-        if (i != j) {
-            /* Do we need better error reporting?  */
-            return -1;
-        }
-        k += i;
-
-        AP_BRIGADE_INSERT_TAIL(b, r);
-    }
-
-    return k;
-}
-
-APR_DECLARE_NONSTD(int) ap_brigade_putstrs(ap_bucket_brigade *b, ...)
-{
-    va_list va;
-    int written;
-
-    va_start(va, b);
-    written = ap_brigade_vputstrs(b, va);
-    va_end(va);
-    return written;
-}
-
-APR_DECLARE_NONSTD(int) ap_brigade_printf(ap_bucket_brigade *b, const char *fmt, ...)
-{
-    va_list ap;
-    int res;
-
-    va_start(ap, fmt);
-    res = ap_brigade_vprintf(b, fmt, ap);
-    va_end(ap);
-    return res;
-}
-
-APR_DECLARE(int) ap_brigade_vprintf(ap_bucket_brigade *b, const char *fmt, va_list va)
-{
-    /* XXX:  This needs to be replaced with a function to printf
-     * directly into a bucket.  I'm being lazy right now.  RBB
-     */
-    char buf[4096];
-    ap_bucket *r;
-    int res;
-
-    res = apr_vsnprintf(buf, 4096, fmt, va);
-
-    r = ap_bucket_create_heap(buf, strlen(buf), 1, NULL);
-    AP_BRIGADE_INSERT_TAIL(b, r);
-
-    return res;
-}
-
-void ap_init_bucket_types(apr_pool_t *p)
-{
-    bucket_types = apr_make_array(p, 8, sizeof(ap_bucket_type));
-
-    ap_insert_bucket_type(&ap_eos_type);
-    ap_insert_bucket_type(&ap_file_type);
-    ap_insert_bucket_type(&ap_heap_type);
-#ifdef AP_USE_MMAP_FILES
-    ap_insert_bucket_type(&ap_mmap_type);
-#endif
-    ap_insert_bucket_type(&ap_pipe_type);
-    ap_insert_bucket_type(&ap_immortal_type);
-    ap_insert_bucket_type(&ap_transient_type);
-    ap_insert_bucket_type(&ap_socket_type);
-}
-
-int ap_insert_bucket_type(const ap_bucket_type *type)
-{
-    const ap_bucket_type **newone;
-
-    newone = (const ap_bucket_type **)apr_push_array(bucket_types);
-    newone = &type;
-
-    return bucket_types->nelts - 1;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_setaside_notimpl(ap_bucket *data)
-{
-    return APR_ENOTIMPL;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_notimpl(ap_bucket *data, apr_off_t point)
-{
-    return APR_ENOTIMPL;
-}
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_notimpl(ap_bucket *e, ap_bucket **c)
-{
-    return APR_ENOTIMPL;
-}
-APR_DECLARE_NONSTD(void) ap_bucket_destroy_notimpl(void *data)
-{
-    return;
-}
diff --git a/buckets/ap_buckets_eos.c b/buckets/ap_buckets_eos.c
deleted file mode 100644
index d7d2019..0000000
--- a/buckets/ap_buckets_eos.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t eos_read(ap_bucket *b, const char **str, 
-                                apr_size_t *len, ap_read_type block)
-{
-    *str = NULL;
-    *len = 0;
-    return APR_SUCCESS;
-}
-
-static apr_status_t eos_copy(ap_bucket *e, ap_bucket **c)
-{
-    *c = ap_bucket_create_eos();
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_eos(ap_bucket *b)
-{
-    b->length    = 0;
-    b->data      = NULL;
-
-    b->type      = &ap_eos_type;
-    
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_eos(void)
-{
-    ap_bucket_do_create(ap_bucket_make_eos(b));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_eos_type = {
-    "EOS", 5,
-    ap_bucket_destroy_notimpl,
-    eos_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    eos_copy
-};
diff --git a/buckets/ap_buckets_file.c b/buckets/ap_buckets_file.c
deleted file mode 100644
index dc3922d..0000000
--- a/buckets/ap_buckets_file.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "apr_file_io.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* Allow Apache to use ap_mmap */
-#ifdef AP_USE_MMAP_FILES
-#include "apr_mmap.h"
-
-/* mmap support for static files based on ideas from John Heidemann's
- * patch against 1.0.5.  See
- * <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
- */
-
-/* Files have to be at least this big before they're mmap()d.  This is to deal
- * with systems where the expense of doing an mmap() and an munmap() outweighs
- * the benefit for small files.  It shouldn't be set lower than 1.
- */
-#ifndef MMAP_THRESHOLD
-#  ifdef SUNOS4
-#  define MMAP_THRESHOLD                (8*1024)
-#  else
-#  define MMAP_THRESHOLD                1
-#  endif /* SUNOS4 */
-#endif /* MMAP_THRESHOLD */
-#ifndef MMAP_LIMIT
-#define MMAP_LIMIT              (4*1024*1024)
-#endif
-#endif /* AP_USE_MMAP_FILES */
-
-
-/* XXX: We should obey the block flag */
-static apr_status_t file_read(ap_bucket *e, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_file *a = (ap_bucket_file *)e->data;
-    apr_file_t *f = (apr_file_t *) a->fd;
-    ap_bucket *b = NULL;
-    char *buf;
-    apr_status_t rv;
-#ifdef AP_USE_MMAP_FILES
-    apr_mmap_t *mm = NULL;
-#endif
-
-#ifdef AP_USE_MMAP_FILES
-    if ((e->length >= MMAP_THRESHOLD)
-        && (e->length < MMAP_LIMIT)) {
-        /* we need to protect ourselves in case we die while we've got the
-         * file mmapped */
-        apr_status_t status;
-        if ((status = apr_mmap_create(&mm, f, a->offset, e->length, 
-                                      APR_MMAP_READ, NULL)) != APR_SUCCESS) {
-            mm = NULL;
-        }
-    }
-    else {
-        mm = NULL;
-    }
-    if (mm) {
-        ap_bucket_make_mmap(e, mm, 0, e->length); /*XXX: check for failure? */
-        return ap_bucket_read(e, str, len, block);
-    }
-    else {
-#endif
-
-        buf = malloc(HUGE_STRING_LEN);
-        *str = buf;
-
-        if (e->length > HUGE_STRING_LEN) {
-            *len = HUGE_STRING_LEN;
-        }
-        else {
-            *len = e->length;
-        }
-
-        /* Handle offset ... */
-        if (a->offset) {
-            rv = apr_seek(f, APR_SET, &a->offset);
-            if (rv != APR_SUCCESS) {
-                free(buf);
-                return rv;
-            }
-            /* Only need to do seek the first time through */
-            a->offset = 0;
-        }
-        rv = apr_read(f, buf, len);
-        if (rv != APR_SUCCESS && rv != APR_EOF) {
-	    free(buf);
-            return rv;
-        }
-
-        /*
-         * Change the current bucket to refer to what we read,
-         * even if we read nothing because we hit EOF.
-         */
-        ap_bucket_make_heap(e, buf, *len, 0, NULL); /*XXX: check for failure? */
-
-        /* If we have more to read from the file, then create another bucket */
-        if (*len > 0) {
-            b = ap_bucket_create_file(f, 0, e->length);
-            AP_BUCKET_INSERT_AFTER(e, b);
-        }
-#ifdef AP_USE_MMAP_FILES
-    }
-#endif
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_file(ap_bucket *b, apr_file_t *fd,
-                                            apr_off_t offset, apr_size_t len)
-{
-    ap_bucket_file *f;
-
-    f = malloc(sizeof(*f));
-    if (f == NULL) {
-        return NULL;
-    }
- 
-    f->fd = fd;
-    f->offset = offset;
-
-    b->type = &ap_file_type;
-    b->data = f;
-    b->length = len;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_file(apr_file_t *fd,
-                                              apr_off_t offset, apr_size_t len)
-{
-    ap_bucket_do_create(ap_bucket_make_file(b, fd, offset, len));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_file_type = {
-    "FILE", 5,
-    ap_bucket_destroy_notimpl,
-    file_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/buckets/ap_buckets_flush.c b/buckets/ap_buckets_flush.c
deleted file mode 100644
index 357299e..0000000
--- a/buckets/ap_buckets_flush.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t flush_read(ap_bucket *b, const char **str, 
-                                apr_size_t *len, ap_read_type block)
-{
-    *str = NULL;
-    *len = 0;
-    return APR_SUCCESS;
-}
-
-static apr_status_t flush_copy(ap_bucket *e, ap_bucket **c)
-{
-    *c = ap_bucket_create_flush();
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_flush(ap_bucket *b)
-{
-    b->length    = 0;
-    b->data      = NULL;
-
-    b->type      = &ap_flush_type;
-    
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_flush(void)
-{
-    ap_bucket_do_create(ap_bucket_make_flush(b));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_flush_type = {
-    "FLUSH", 5,
-    ap_bucket_destroy_notimpl,
-    flush_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    flush_copy
-};
diff --git a/buckets/ap_buckets_heap.c b/buckets/ap_buckets_heap.c
deleted file mode 100644
index f8fdf2d..0000000
--- a/buckets/ap_buckets_heap.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-/*
- * The size of heap bucket memory allocations.
- * XXX: This is currently a guess and should be adjusted to an
- * empirically good value.
- */
-#ifndef DEFAULT_BUCKET_SIZE
-#define DEFAULT_BUCKET_SIZE (4096)
-#endif
-
-static apr_status_t heap_read(ap_bucket *b, const char **str, 
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_heap *h = s->data;
-
-    *str = h->base + s->start;
-    *len = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void heap_destroy(void *data)
-{
-    ap_bucket_heap *h;
-
-    h = ap_bucket_destroy_shared(data);
-    if (h == NULL) {
-	return;
-    }
-    free(h->base);
-    free(h);
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_heap(ap_bucket *b,
-		const char *buf, apr_size_t length, int copy, apr_size_t *w)
-{
-    ap_bucket_heap *h;
-
-    h = malloc(sizeof(*h));
-    if (h == NULL) {
-	return NULL;
-    }
-
-    if (copy) {
-	h->base = malloc(DEFAULT_BUCKET_SIZE);
-	if (h->base == NULL) {
-	    free(h);
-	    return NULL;
-	}
-	h->alloc_len = DEFAULT_BUCKET_SIZE;
-	if (length > DEFAULT_BUCKET_SIZE) {
-	    length = DEFAULT_BUCKET_SIZE;
-	}
-	memcpy(h->base, buf, length);
-    }
-    else {
-	/* XXX: we lose the const qualifier here which indicates
-         * there's something screwy with the API...
-	 */
-	h->base = (char *) buf;
-	h->alloc_len = length;
-    }
-
-    b = ap_bucket_make_shared(b, h, 0, length);
-    if (b == NULL) {
-	if (copy) {
-	    free(h->base);
-	}
-	free(h);
-	return NULL;
-    }
-
-    b->type = &ap_heap_type;
-
-    if (w)
-        *w = length;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_heap(
-		const char *buf, apr_size_t length, int copy, apr_size_t *w)
-{
-    ap_bucket_do_create(ap_bucket_make_heap(b, buf, length, copy, w));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_heap_type = {
-    "HEAP", 5,
-    heap_destroy,
-    heap_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/ap_buckets_mmap.c b/buckets/ap_buckets_mmap.c
deleted file mode 100644
index 81f426c..0000000
--- a/buckets/ap_buckets_mmap.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t mmap_read(ap_bucket *b, const char **str, 
-			      apr_size_t *length, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_mmap *m = s->data;
-    apr_status_t ok;
-    void *addr;
-    
-    ok = apr_mmap_offset(&addr, m->mmap, s->start);
-    if (ok != APR_SUCCESS) {
-	return ok;
-    }
-    *str = addr;
-    *length = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void mmap_destroy(void *data)
-{
-    ap_bucket_mmap *m;
-
-    m = ap_bucket_destroy_shared(data);
-    if (m == NULL) {
-	return;
-    }
-    free(m);
-}
-
-/*
- * XXX: are the start and length arguments useful?
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_mmap(ap_bucket *b,
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length)
-{
-    ap_bucket_mmap *m;
-
-    m = malloc(sizeof(*m));
-    if (m == NULL) {
-	return NULL;
-    }
-    m->mmap = mm;
-
-    b = ap_bucket_make_shared(b, m, start, start+length);
-    if (b == NULL) {
-	free(m);
-	return NULL;
-    }
-
-    b->type     = &ap_mmap_type;
-
-    return b;
-}
-
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_mmap(
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_mmap(b, mm, start, length));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_mmap_type = {
-    "MMAP", 5,
-    mmap_destroy,
-    mmap_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/ap_buckets_pipe.c b/buckets/ap_buckets_pipe.c
deleted file mode 100644
index 327d93d..0000000
--- a/buckets/ap_buckets_pipe.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* XXX: We should obey the block flag */
-static apr_status_t pipe_read(ap_bucket *a, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    apr_file_t *p = a->data;
-    ap_bucket *b;
-    char *buf;
-    apr_status_t rv;
-    apr_interval_time_t timeout;
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_get_pipe_timeout(p, &timeout);
-        apr_set_pipe_timeout(p, 0);
-    }
-
-    buf = malloc(HUGE_STRING_LEN); /* XXX: check for failure? */
-    *str = buf;
-    *len = HUGE_STRING_LEN;
-    rv = apr_read(p, buf, len);
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_set_pipe_timeout(p, timeout);
-    }
-
-    if (rv != APR_SUCCESS && rv != APR_EOF) {
-        *str = NULL;
-	free(buf);
-        return rv;
-    }
-    /*
-     * Change the current bucket to refer to what we read,
-     * even if we read nothing because we hit EOF.
-     */
-    ap_bucket_make_heap(a, buf, *len, 0, NULL);  /* XXX: check for failure? */
-    /*
-     * If there's more to read we have to keep the rest of the pipe
-     * for later.  Otherwise, we'll close the pipe.
-     * XXX: Note that more complicated bucket types that 
-     * refer to data not in memory and must therefore have a read()
-     * function similar to this one should be wary of copying this
-     * code because if they have a destroy function they probably
-     * want to migrate the bucket's subordinate structure from the
-     * old bucket to a raw new one and adjust it as appropriate,
-     * rather than destroying the old one and creating a completely
-     * new bucket.
-     */
-    if (*len > 0) {
-        b = ap_bucket_create_pipe(p);
-	AP_BUCKET_INSERT_AFTER(a, b);
-    }
-    else {
-        apr_close(p);
-    }
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_pipe(ap_bucket *b, apr_file_t *p)
-{
-    /*
-     * A pipe is closed when the end is reached in pipe_read().  If the
-     * pipe isn't read to the end (e.g., error path), the pipe will be
-     * closed when its pool goes away.
-     *
-     * Note that typically the pipe is allocated from the request pool
-     * so it will disappear when the request is finished. However the
-     * core filter may decide to set aside the tail end of a CGI
-     * response if the connection is pipelined. This turns out not to
-     * be a problem because the core will have read to the end of the
-     * stream so the bucket(s) that it sets aside will be the heap
-     * buckets created by pipe_read() above.
-     */
-    b->type     = &ap_pipe_type;
-    b->length   = -1;
-    b->data     = p;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_pipe(apr_file_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_pipe(b, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_pipe_type = {
-    "PIPE", 5,
-    ap_bucket_destroy_notimpl,
-    pipe_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/buckets/ap_buckets_pool.c b/buckets/ap_buckets_pool.c
deleted file mode 100644
index 6c9b265..0000000
--- a/buckets/ap_buckets_pool.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t pool_bucket_cleanup(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_shared *new;
-    ap_bucket_pool *h = s->data;
-    ap_bucket *b = h->b;
-    apr_size_t w;
-
-    ap_bucket_make_heap(b, h->base, b->length, 1, &w);
-    new = b->data;
-
-    new->start = s->start;
-    new->end = s->end;
-
-    ap_bucket_destroy_shared(s);
-    return APR_SUCCESS;
-}
-
-static apr_status_t pool_read(ap_bucket *b, const char **str, 
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_pool *h = s->data;
-
-    *str = h->base + s->start;
-    *len = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void pool_destroy(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_pool *h = s->data;
-
-    apr_kill_cleanup(h->p, data, pool_bucket_cleanup);
-    h = ap_bucket_destroy_shared(data);
-    if (h == NULL) {
-	return;
-    }
-    free(h);
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_pool(ap_bucket *b,
-		const char *buf, apr_size_t length, apr_pool_t *p)
-{
-    ap_bucket_pool *h;
-
-    h = malloc(sizeof(*h));
-    if (h == NULL) {
-	return NULL;
-    }
-
-    /* XXX: we lose the const qualifier here which indicates
-     * there's something screwy with the API...
-     */
-    h->base = (char *) buf;
-    h->p    = p;
-
-    b = ap_bucket_make_shared(b, h, 0, length);
-    if (b == NULL) {
-	free(h);
-	return NULL;
-    }
-
-    b->type = &ap_pool_type;
-    h->b = b;
-
-    apr_register_cleanup(h->p, b->data, pool_bucket_cleanup, apr_null_cleanup);
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_pool(
-		const char *buf, apr_size_t length, apr_pool_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_pool(b, buf, length, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_pool_type = {
-    "POOL", 5,
-    pool_destroy,
-    pool_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/ap_buckets_refcount.c b/buckets/ap_buckets_refcount.c
deleted file mode 100644
index e15f045..0000000
--- a/buckets/ap_buckets_refcount.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 <stdlib.h>
-
-#include "apr_errno.h"
-
-#include "ap_buckets.h"
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_shared(ap_bucket *a, apr_off_t point)
-{
-    ap_bucket *b;
-    ap_bucket_shared *ad, *bd;
-    apr_status_t rv;
-
-    if (point < 0 || point > a->length) {
-	return APR_EINVAL;
-    }
-
-    rv = ap_bucket_copy_shared(a, &b);
-    if (rv != APR_SUCCESS) {
-        return rv;
-    }
-
-    ad = a->data;
-    bd = b->data;
-
-    a->length = point;
-    ad->end = ad->start + point;
-    b->length -= point;
-    bd->start += point;
-
-    AP_BUCKET_INSERT_AFTER(a, b);
-
-    return APR_SUCCESS;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_shared(ap_bucket *a, ap_bucket **c)
-{
-    ap_bucket *b;
-    ap_bucket_shared *ad, *bd;
-    ap_bucket_refcount *r;
-
-    b = malloc(sizeof(*b));
-    if (b == NULL) {
-        return APR_ENOMEM;
-    }
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-        free(b);
-        return APR_ENOMEM;
-    }
-    *b = *a;
-    ad = a->data;
-    b->data = bd;
-    *bd = *ad;
-
-    r = ad->data;
-    r->refcount += 1;
-
-    *c = b;
-
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(void *) ap_bucket_destroy_shared(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_refcount *r = s->data;
-
-    free(s);
-    r->refcount -= 1;
-    if (r->refcount == 0) {
-	return r;
-    }
-    else {
-	return NULL;
-    }
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_shared(ap_bucket *b, void *data,
-					      apr_off_t start, apr_off_t end)
-{
-    ap_bucket_shared *s;
-    ap_bucket_refcount *r = data;
-
-    s = malloc(sizeof(*s));
-    if (s == NULL) {
-	return NULL;
-    }
-
-    b->data = s;
-    b->length = end - start;
-    /* caller initializes the type field and function pointers */
-    s->start = start;
-    s->end = end;
-    s->data = r;
-    r->refcount = 1;
-    /* caller initializes the rest of r */
-
-    return b;
-}
diff --git a/buckets/ap_buckets_simple.c b/buckets/ap_buckets_simple.c
deleted file mode 100644
index 8f27aad..0000000
--- a/buckets/ap_buckets_simple.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-/*
- * We can't simplify this function by using an ap_bucket_make function
- * because we aren't sure of the exact type of this bucket.
- */
-static apr_status_t simple_copy(ap_bucket *a, ap_bucket **c)
-{
-    ap_bucket *b;
-    ap_bucket_simple *ad, *bd;
-
-    b = malloc(sizeof(*b)); 
-    if (b == NULL) {
-	return APR_ENOMEM;
-    }
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-	free(b);
-	return APR_ENOMEM;
-    }
-    *b = *a;
-    ad = a->data;
-    b->data = bd;
-    *bd = *ad;
-
-    *c = b;
-
-    return APR_SUCCESS;
-}
-
-static apr_status_t simple_split(ap_bucket *a, apr_off_t point)
-{
-    ap_bucket *b;
-    ap_bucket_simple *ad, *bd;
-    apr_status_t rv;
-
-    if (point < 0 || point > a->length) {
-	return APR_EINVAL;
-    }
-
-    rv = simple_copy(a, &b);
-    if (rv != APR_SUCCESS) {
-        return rv;
-    }
-
-    ad = a->data;
-    bd = b->data;
-
-    a->length = point;
-    ad->end = ad->start + point;
-    b->length -= point;
-    bd->start += point;
-
-    AP_BUCKET_INSERT_AFTER(a, b);
-
-    return APR_SUCCESS;
-}
-
-static apr_status_t simple_read(ap_bucket *b, const char **str, 
-				apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_simple *bd = b->data;
-    *str = bd->start;
-    *len = bd->end - bd->start;
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_immortal(ap_bucket *b,
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_simple *bd;
-
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-	return NULL;
-    }
-
-    bd->start   = buf;
-    bd->end     = buf+length;
-
-    b->type     = &ap_immortal_type;
-    b->length   = length;
-    b->data     = bd;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_immortal(
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_immortal(b, buf, length));
-}
-
-/*
- * XXX: This function could do with some tweaking to reduce memory
- * usage in various cases, e.g. share buffers in the heap between all
- * the buckets that are set aside, or even spool set-aside data to
- * disk if it gets too voluminous (but if it does then that's probably
- * a bug elsewhere). There should probably be a ap_brigade_setaside()
- * function that co-ordinates the action of all the bucket setaside
- * functions to improve memory efficiency.
- */
-static apr_status_t transient_setaside(ap_bucket *b)
-{
-    ap_bucket_simple *bd;
-    const char *start, *end;
-    apr_size_t w;
-    
-    bd = b->data;
-    start = bd->start;
-    end = bd->end;
-    /* XXX: handle small heap buckets */
-    b = ap_bucket_make_heap(b, start, end-start, 1, &w);
-    if (b == NULL || w != end-start) {
-	return APR_ENOMEM;
-    }
-    free(bd);
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_transient(ap_bucket *b,
-		const char *buf, apr_size_t length)
-{
-    b = ap_bucket_make_immortal(b, buf, length);
-    if (b == NULL) {
-	return NULL;
-    }
-    b->type = &ap_transient_type;
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_transient(
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_transient(b, buf, length));
-}
-
-const ap_bucket_type ap_immortal_type = {
-    "IMMORTAL", 5,
-    free,
-    simple_read,
-    ap_bucket_setaside_notimpl,
-    simple_split,
-    simple_copy
-};
-
-APR_DECLARE_DATA const ap_bucket_type ap_transient_type = {
-    "TRANSIENT", 5,
-    ap_bucket_destroy_notimpl, 
-    simple_read,
-    transient_setaside,
-    simple_split,
-    simple_copy
-};
diff --git a/buckets/ap_buckets_socket.c b/buckets/ap_buckets_socket.c
deleted file mode 100644
index 996227b..0000000
--- a/buckets/ap_buckets_socket.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* XXX: We should obey the block flag */
-static apr_status_t socket_read(ap_bucket *a, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    apr_socket_t *p = a->data;
-    ap_bucket *b;
-    char *buf;
-    apr_status_t rv;
-    apr_int32_t timeout;
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_getsocketopt(p, APR_SO_TIMEOUT, &timeout);
-        apr_setsocketopt(p, APR_SO_TIMEOUT, 0);
-    }
-
-    buf = malloc(HUGE_STRING_LEN); /* XXX: check for failure? */
-    *str = buf;
-    *len = HUGE_STRING_LEN;
-    rv = apr_recv(p, buf, len);
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_setsocketopt(p, APR_SO_TIMEOUT, timeout);
-    }
-
-    if (rv != APR_SUCCESS && rv != APR_EOF) {
-        *str = NULL;
-	free(buf);
-        return rv;
-    }
-    /*
-     * Change the current bucket to refer to what we read,
-     * even if we read nothing because we hit EOF.
-     */
-    ap_bucket_make_heap(a, buf, *len, 0, NULL);  /* XXX: check for failure? */
-    /*
-     * If there's more to read we have to keep the rest of the socket
-     * for later. XXX: Note that more complicated bucket types that
-     * refer to data not in memory and must therefore have a read()
-     * function similar to this one should be wary of copying this
-     * code because if they have a destroy function they probably
-     * want to migrate the bucket's subordinate structure from the
-     * old bucket to a raw new one and adjust it as appropriate,
-     * rather than destroying the old one and creating a completely
-     * new bucket.
-     *
-     * Even if there is nothing more to read, don't close the socket here
-     * as we have to use it to send any response :)  We could shut it 
-     * down for reading, but there is no benefit to doing so.
-     */
-    if (*len > 0) {
-        b = ap_bucket_create_socket(p);
-	AP_BUCKET_INSERT_AFTER(a, b);
-    }
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_socket(ap_bucket *b, apr_socket_t *p)
-{
-    /*
-     * XXX: We rely on a cleanup on some pool or other to actually
-     * destroy the socket. We should probably explicitly call apr to
-     * destroy it instead.
-     *
-     * Note that typically the socket is allocated from the connection pool
-     * so it will disappear when the connection is finished. 
-     */
-    b->type     = &ap_socket_type;
-    b->length   = -1;
-    b->data     = p;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_socket(apr_socket_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_socket(b, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_socket_type = {
-    "SOCKET", 5,
-    ap_bucket_destroy_notimpl,
-    socket_read,
-    ap_bucket_setaside_notimpl, 
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/buckets/apr_buckets.c b/buckets/apr_buckets.c
deleted file mode 100644
index 34fba9c..0000000
--- a/buckets/apr_buckets.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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.h"
-#include "apr_lib.h"
-#include "apr_pools.h"
-#include "apr_tables.h"
-#include "apr_errno.h"
-
-#include <stdlib.h>
-#if APR_HAVE_SYS_UIO_H
-#include <sys/uio.h>
-#endif
-
-#include "ap_buckets.h"
-
-static apr_array_header_t *bucket_types;
-
-static apr_status_t ap_brigade_cleanup(void *data)
-{
-    ap_bucket_brigade *b = data;
-    ap_bucket *e;
-
-    /*
-     * Bah! We can't use AP_RING_FOREACH here because this bucket has
-     * gone away when we dig inside it to get the next one.
-     */
-    while (!AP_BRIGADE_EMPTY(b)) {
-	e = AP_BRIGADE_FIRST(b);
-	AP_BUCKET_REMOVE(e);
-	ap_bucket_destroy(e);
-    }
-    /*
-     * We don't need to free(bb) because it's allocated from a pool.
-     */
-    return APR_SUCCESS;
-}
-APR_DECLARE(apr_status_t) ap_brigade_destroy(ap_bucket_brigade *b)
-{
-    apr_kill_cleanup(b->p, b, ap_brigade_cleanup);
-    return ap_brigade_cleanup(b);
-}
-
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_create(apr_pool_t *p)
-{
-    ap_bucket_brigade *b;
-
-    b = apr_palloc(p, sizeof(*b));
-    b->p = p;
-    AP_RING_INIT(&b->list, ap_bucket, link);
-
-    apr_register_cleanup(b->p, b, ap_brigade_cleanup, ap_brigade_cleanup);
-    return b;
-}
-
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_split(ap_bucket_brigade *b,
-						 ap_bucket *e)
-{
-    ap_bucket_brigade *a;
-    ap_bucket *f;
-
-    a = ap_brigade_create(b->p);
-    /* Return an empty brigade if there is nothing left in 
-     * the first brigade to split off 
-     */
-    if (e != AP_BRIGADE_SENTINEL(b)) {
-        f = AP_RING_LAST(&b->list);
-        AP_RING_UNSPLICE(e, f, link);
-        AP_RING_SPLICE_HEAD(&a->list, e, f, ap_bucket, link);
-    }
-    return a;
-}
-
-APR_DECLARE(ap_bucket *) ap_brigade_partition(ap_bucket_brigade *b, apr_off_t point)
-{
-    ap_bucket *e;
-    const char *s;
-    apr_size_t len;
-
-    if (point < 0)
-        return NULL;
-
-    AP_BRIGADE_FOREACH(e, b) {
-        /* bucket is of a known length */
-        if ((point > e->length) && (e->length != -1)) {
-            if (AP_BUCKET_IS_EOS(e))
-                return NULL;
-            point -= e->length;
-        }
-        else if (point == e->length) {
-            return AP_BUCKET_NEXT(e);
-        }
-        else {
-            /* try to split the bucket natively */
-            if (ap_bucket_split(e, point) != APR_ENOTIMPL)
-                return AP_BUCKET_NEXT(e);
-
-            /* if the bucket cannot be split, we must read from it,
-             * changing its type to one that can be split */
-            if (ap_bucket_read(e, &s, &len, AP_BLOCK_READ) != APR_SUCCESS)
-                return NULL;
-
-            if (point < len) {
-                if (ap_bucket_split(e, point) == APR_SUCCESS)
-                    return AP_BUCKET_NEXT(e);
-                else
-                    return NULL;
-            }
-            else if (point == len)
-                return AP_BUCKET_NEXT(e);
-            else
-                point -= len;
-        }
-    }
-    return NULL;
-}
-
-APR_DECLARE(int) ap_brigade_to_iovec(ap_bucket_brigade *b, 
-				    struct iovec *vec, int nvec)
-{
-    ap_bucket *e;
-    struct iovec *orig;
-    apr_size_t iov_len;
-
-    orig = vec;
-    AP_BRIGADE_FOREACH(e, b) {
-	if (nvec-- == 0)
-            break;
-	ap_bucket_read(e, (const char **)&vec->iov_base, &iov_len, AP_NONBLOCK_READ);
-        vec->iov_len = iov_len; /* set indirectly in case size differs */
-	++vec;
-    }
-    return vec - orig;
-}
-
-APR_DECLARE(int) ap_brigade_vputstrs(ap_bucket_brigade *b, va_list va)
-{
-    ap_bucket *r;
-    const char *x;
-    int j, k;
-    apr_size_t i;
-
-    for (k = 0;;) {
-        x = va_arg(va, const char *);
-        if (x == NULL)
-            break;
-        j = strlen(x);
-       
-	/* XXX: copy or not? let the caller decide? */
-        r = ap_bucket_create_heap(x, j, 1, &i);
-        if (i != j) {
-            /* Do we need better error reporting?  */
-            return -1;
-        }
-        k += i;
-
-        AP_BRIGADE_INSERT_TAIL(b, r);
-    }
-
-    return k;
-}
-
-APR_DECLARE_NONSTD(int) ap_brigade_putstrs(ap_bucket_brigade *b, ...)
-{
-    va_list va;
-    int written;
-
-    va_start(va, b);
-    written = ap_brigade_vputstrs(b, va);
-    va_end(va);
-    return written;
-}
-
-APR_DECLARE_NONSTD(int) ap_brigade_printf(ap_bucket_brigade *b, const char *fmt, ...)
-{
-    va_list ap;
-    int res;
-
-    va_start(ap, fmt);
-    res = ap_brigade_vprintf(b, fmt, ap);
-    va_end(ap);
-    return res;
-}
-
-APR_DECLARE(int) ap_brigade_vprintf(ap_bucket_brigade *b, const char *fmt, va_list va)
-{
-    /* XXX:  This needs to be replaced with a function to printf
-     * directly into a bucket.  I'm being lazy right now.  RBB
-     */
-    char buf[4096];
-    ap_bucket *r;
-    int res;
-
-    res = apr_vsnprintf(buf, 4096, fmt, va);
-
-    r = ap_bucket_create_heap(buf, strlen(buf), 1, NULL);
-    AP_BRIGADE_INSERT_TAIL(b, r);
-
-    return res;
-}
-
-void ap_init_bucket_types(apr_pool_t *p)
-{
-    bucket_types = apr_make_array(p, 8, sizeof(ap_bucket_type));
-
-    ap_insert_bucket_type(&ap_eos_type);
-    ap_insert_bucket_type(&ap_file_type);
-    ap_insert_bucket_type(&ap_heap_type);
-#ifdef AP_USE_MMAP_FILES
-    ap_insert_bucket_type(&ap_mmap_type);
-#endif
-    ap_insert_bucket_type(&ap_pipe_type);
-    ap_insert_bucket_type(&ap_immortal_type);
-    ap_insert_bucket_type(&ap_transient_type);
-    ap_insert_bucket_type(&ap_socket_type);
-}
-
-int ap_insert_bucket_type(const ap_bucket_type *type)
-{
-    const ap_bucket_type **newone;
-
-    newone = (const ap_bucket_type **)apr_push_array(bucket_types);
-    newone = &type;
-
-    return bucket_types->nelts - 1;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_setaside_notimpl(ap_bucket *data)
-{
-    return APR_ENOTIMPL;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_notimpl(ap_bucket *data, apr_off_t point)
-{
-    return APR_ENOTIMPL;
-}
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_notimpl(ap_bucket *e, ap_bucket **c)
-{
-    return APR_ENOTIMPL;
-}
-APR_DECLARE_NONSTD(void) ap_bucket_destroy_notimpl(void *data)
-{
-    return;
-}
diff --git a/buckets/apr_buckets_eos.c b/buckets/apr_buckets_eos.c
deleted file mode 100644
index d7d2019..0000000
--- a/buckets/apr_buckets_eos.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t eos_read(ap_bucket *b, const char **str, 
-                                apr_size_t *len, ap_read_type block)
-{
-    *str = NULL;
-    *len = 0;
-    return APR_SUCCESS;
-}
-
-static apr_status_t eos_copy(ap_bucket *e, ap_bucket **c)
-{
-    *c = ap_bucket_create_eos();
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_eos(ap_bucket *b)
-{
-    b->length    = 0;
-    b->data      = NULL;
-
-    b->type      = &ap_eos_type;
-    
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_eos(void)
-{
-    ap_bucket_do_create(ap_bucket_make_eos(b));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_eos_type = {
-    "EOS", 5,
-    ap_bucket_destroy_notimpl,
-    eos_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    eos_copy
-};
diff --git a/buckets/apr_buckets_file.c b/buckets/apr_buckets_file.c
deleted file mode 100644
index dc3922d..0000000
--- a/buckets/apr_buckets_file.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "apr_file_io.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* Allow Apache to use ap_mmap */
-#ifdef AP_USE_MMAP_FILES
-#include "apr_mmap.h"
-
-/* mmap support for static files based on ideas from John Heidemann's
- * patch against 1.0.5.  See
- * <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
- */
-
-/* Files have to be at least this big before they're mmap()d.  This is to deal
- * with systems where the expense of doing an mmap() and an munmap() outweighs
- * the benefit for small files.  It shouldn't be set lower than 1.
- */
-#ifndef MMAP_THRESHOLD
-#  ifdef SUNOS4
-#  define MMAP_THRESHOLD                (8*1024)
-#  else
-#  define MMAP_THRESHOLD                1
-#  endif /* SUNOS4 */
-#endif /* MMAP_THRESHOLD */
-#ifndef MMAP_LIMIT
-#define MMAP_LIMIT              (4*1024*1024)
-#endif
-#endif /* AP_USE_MMAP_FILES */
-
-
-/* XXX: We should obey the block flag */
-static apr_status_t file_read(ap_bucket *e, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_file *a = (ap_bucket_file *)e->data;
-    apr_file_t *f = (apr_file_t *) a->fd;
-    ap_bucket *b = NULL;
-    char *buf;
-    apr_status_t rv;
-#ifdef AP_USE_MMAP_FILES
-    apr_mmap_t *mm = NULL;
-#endif
-
-#ifdef AP_USE_MMAP_FILES
-    if ((e->length >= MMAP_THRESHOLD)
-        && (e->length < MMAP_LIMIT)) {
-        /* we need to protect ourselves in case we die while we've got the
-         * file mmapped */
-        apr_status_t status;
-        if ((status = apr_mmap_create(&mm, f, a->offset, e->length, 
-                                      APR_MMAP_READ, NULL)) != APR_SUCCESS) {
-            mm = NULL;
-        }
-    }
-    else {
-        mm = NULL;
-    }
-    if (mm) {
-        ap_bucket_make_mmap(e, mm, 0, e->length); /*XXX: check for failure? */
-        return ap_bucket_read(e, str, len, block);
-    }
-    else {
-#endif
-
-        buf = malloc(HUGE_STRING_LEN);
-        *str = buf;
-
-        if (e->length > HUGE_STRING_LEN) {
-            *len = HUGE_STRING_LEN;
-        }
-        else {
-            *len = e->length;
-        }
-
-        /* Handle offset ... */
-        if (a->offset) {
-            rv = apr_seek(f, APR_SET, &a->offset);
-            if (rv != APR_SUCCESS) {
-                free(buf);
-                return rv;
-            }
-            /* Only need to do seek the first time through */
-            a->offset = 0;
-        }
-        rv = apr_read(f, buf, len);
-        if (rv != APR_SUCCESS && rv != APR_EOF) {
-	    free(buf);
-            return rv;
-        }
-
-        /*
-         * Change the current bucket to refer to what we read,
-         * even if we read nothing because we hit EOF.
-         */
-        ap_bucket_make_heap(e, buf, *len, 0, NULL); /*XXX: check for failure? */
-
-        /* If we have more to read from the file, then create another bucket */
-        if (*len > 0) {
-            b = ap_bucket_create_file(f, 0, e->length);
-            AP_BUCKET_INSERT_AFTER(e, b);
-        }
-#ifdef AP_USE_MMAP_FILES
-    }
-#endif
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_file(ap_bucket *b, apr_file_t *fd,
-                                            apr_off_t offset, apr_size_t len)
-{
-    ap_bucket_file *f;
-
-    f = malloc(sizeof(*f));
-    if (f == NULL) {
-        return NULL;
-    }
- 
-    f->fd = fd;
-    f->offset = offset;
-
-    b->type = &ap_file_type;
-    b->data = f;
-    b->length = len;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_file(apr_file_t *fd,
-                                              apr_off_t offset, apr_size_t len)
-{
-    ap_bucket_do_create(ap_bucket_make_file(b, fd, offset, len));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_file_type = {
-    "FILE", 5,
-    ap_bucket_destroy_notimpl,
-    file_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/buckets/apr_buckets_flush.c b/buckets/apr_buckets_flush.c
deleted file mode 100644
index 357299e..0000000
--- a/buckets/apr_buckets_flush.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t flush_read(ap_bucket *b, const char **str, 
-                                apr_size_t *len, ap_read_type block)
-{
-    *str = NULL;
-    *len = 0;
-    return APR_SUCCESS;
-}
-
-static apr_status_t flush_copy(ap_bucket *e, ap_bucket **c)
-{
-    *c = ap_bucket_create_flush();
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_flush(ap_bucket *b)
-{
-    b->length    = 0;
-    b->data      = NULL;
-
-    b->type      = &ap_flush_type;
-    
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_flush(void)
-{
-    ap_bucket_do_create(ap_bucket_make_flush(b));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_flush_type = {
-    "FLUSH", 5,
-    ap_bucket_destroy_notimpl,
-    flush_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    flush_copy
-};
diff --git a/buckets/apr_buckets_heap.c b/buckets/apr_buckets_heap.c
deleted file mode 100644
index f8fdf2d..0000000
--- a/buckets/apr_buckets_heap.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-/*
- * The size of heap bucket memory allocations.
- * XXX: This is currently a guess and should be adjusted to an
- * empirically good value.
- */
-#ifndef DEFAULT_BUCKET_SIZE
-#define DEFAULT_BUCKET_SIZE (4096)
-#endif
-
-static apr_status_t heap_read(ap_bucket *b, const char **str, 
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_heap *h = s->data;
-
-    *str = h->base + s->start;
-    *len = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void heap_destroy(void *data)
-{
-    ap_bucket_heap *h;
-
-    h = ap_bucket_destroy_shared(data);
-    if (h == NULL) {
-	return;
-    }
-    free(h->base);
-    free(h);
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_heap(ap_bucket *b,
-		const char *buf, apr_size_t length, int copy, apr_size_t *w)
-{
-    ap_bucket_heap *h;
-
-    h = malloc(sizeof(*h));
-    if (h == NULL) {
-	return NULL;
-    }
-
-    if (copy) {
-	h->base = malloc(DEFAULT_BUCKET_SIZE);
-	if (h->base == NULL) {
-	    free(h);
-	    return NULL;
-	}
-	h->alloc_len = DEFAULT_BUCKET_SIZE;
-	if (length > DEFAULT_BUCKET_SIZE) {
-	    length = DEFAULT_BUCKET_SIZE;
-	}
-	memcpy(h->base, buf, length);
-    }
-    else {
-	/* XXX: we lose the const qualifier here which indicates
-         * there's something screwy with the API...
-	 */
-	h->base = (char *) buf;
-	h->alloc_len = length;
-    }
-
-    b = ap_bucket_make_shared(b, h, 0, length);
-    if (b == NULL) {
-	if (copy) {
-	    free(h->base);
-	}
-	free(h);
-	return NULL;
-    }
-
-    b->type = &ap_heap_type;
-
-    if (w)
-        *w = length;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_heap(
-		const char *buf, apr_size_t length, int copy, apr_size_t *w)
-{
-    ap_bucket_do_create(ap_bucket_make_heap(b, buf, length, copy, w));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_heap_type = {
-    "HEAP", 5,
-    heap_destroy,
-    heap_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/apr_buckets_mmap.c b/buckets/apr_buckets_mmap.c
deleted file mode 100644
index 81f426c..0000000
--- a/buckets/apr_buckets_mmap.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t mmap_read(ap_bucket *b, const char **str, 
-			      apr_size_t *length, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_mmap *m = s->data;
-    apr_status_t ok;
-    void *addr;
-    
-    ok = apr_mmap_offset(&addr, m->mmap, s->start);
-    if (ok != APR_SUCCESS) {
-	return ok;
-    }
-    *str = addr;
-    *length = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void mmap_destroy(void *data)
-{
-    ap_bucket_mmap *m;
-
-    m = ap_bucket_destroy_shared(data);
-    if (m == NULL) {
-	return;
-    }
-    free(m);
-}
-
-/*
- * XXX: are the start and length arguments useful?
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_mmap(ap_bucket *b,
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length)
-{
-    ap_bucket_mmap *m;
-
-    m = malloc(sizeof(*m));
-    if (m == NULL) {
-	return NULL;
-    }
-    m->mmap = mm;
-
-    b = ap_bucket_make_shared(b, m, start, start+length);
-    if (b == NULL) {
-	free(m);
-	return NULL;
-    }
-
-    b->type     = &ap_mmap_type;
-
-    return b;
-}
-
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_mmap(
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_mmap(b, mm, start, length));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_mmap_type = {
-    "MMAP", 5,
-    mmap_destroy,
-    mmap_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/apr_buckets_pipe.c b/buckets/apr_buckets_pipe.c
deleted file mode 100644
index 327d93d..0000000
--- a/buckets/apr_buckets_pipe.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* XXX: We should obey the block flag */
-static apr_status_t pipe_read(ap_bucket *a, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    apr_file_t *p = a->data;
-    ap_bucket *b;
-    char *buf;
-    apr_status_t rv;
-    apr_interval_time_t timeout;
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_get_pipe_timeout(p, &timeout);
-        apr_set_pipe_timeout(p, 0);
-    }
-
-    buf = malloc(HUGE_STRING_LEN); /* XXX: check for failure? */
-    *str = buf;
-    *len = HUGE_STRING_LEN;
-    rv = apr_read(p, buf, len);
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_set_pipe_timeout(p, timeout);
-    }
-
-    if (rv != APR_SUCCESS && rv != APR_EOF) {
-        *str = NULL;
-	free(buf);
-        return rv;
-    }
-    /*
-     * Change the current bucket to refer to what we read,
-     * even if we read nothing because we hit EOF.
-     */
-    ap_bucket_make_heap(a, buf, *len, 0, NULL);  /* XXX: check for failure? */
-    /*
-     * If there's more to read we have to keep the rest of the pipe
-     * for later.  Otherwise, we'll close the pipe.
-     * XXX: Note that more complicated bucket types that 
-     * refer to data not in memory and must therefore have a read()
-     * function similar to this one should be wary of copying this
-     * code because if they have a destroy function they probably
-     * want to migrate the bucket's subordinate structure from the
-     * old bucket to a raw new one and adjust it as appropriate,
-     * rather than destroying the old one and creating a completely
-     * new bucket.
-     */
-    if (*len > 0) {
-        b = ap_bucket_create_pipe(p);
-	AP_BUCKET_INSERT_AFTER(a, b);
-    }
-    else {
-        apr_close(p);
-    }
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_pipe(ap_bucket *b, apr_file_t *p)
-{
-    /*
-     * A pipe is closed when the end is reached in pipe_read().  If the
-     * pipe isn't read to the end (e.g., error path), the pipe will be
-     * closed when its pool goes away.
-     *
-     * Note that typically the pipe is allocated from the request pool
-     * so it will disappear when the request is finished. However the
-     * core filter may decide to set aside the tail end of a CGI
-     * response if the connection is pipelined. This turns out not to
-     * be a problem because the core will have read to the end of the
-     * stream so the bucket(s) that it sets aside will be the heap
-     * buckets created by pipe_read() above.
-     */
-    b->type     = &ap_pipe_type;
-    b->length   = -1;
-    b->data     = p;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_pipe(apr_file_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_pipe(b, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_pipe_type = {
-    "PIPE", 5,
-    ap_bucket_destroy_notimpl,
-    pipe_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/buckets/apr_buckets_pool.c b/buckets/apr_buckets_pool.c
deleted file mode 100644
index 6c9b265..0000000
--- a/buckets/apr_buckets_pool.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-static apr_status_t pool_bucket_cleanup(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_shared *new;
-    ap_bucket_pool *h = s->data;
-    ap_bucket *b = h->b;
-    apr_size_t w;
-
-    ap_bucket_make_heap(b, h->base, b->length, 1, &w);
-    new = b->data;
-
-    new->start = s->start;
-    new->end = s->end;
-
-    ap_bucket_destroy_shared(s);
-    return APR_SUCCESS;
-}
-
-static apr_status_t pool_read(ap_bucket *b, const char **str, 
-			      apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_shared *s = b->data;
-    ap_bucket_pool *h = s->data;
-
-    *str = h->base + s->start;
-    *len = s->end - s->start;
-    return APR_SUCCESS;
-}
-
-static void pool_destroy(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_pool *h = s->data;
-
-    apr_kill_cleanup(h->p, data, pool_bucket_cleanup);
-    h = ap_bucket_destroy_shared(data);
-    if (h == NULL) {
-	return;
-    }
-    free(h);
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_pool(ap_bucket *b,
-		const char *buf, apr_size_t length, apr_pool_t *p)
-{
-    ap_bucket_pool *h;
-
-    h = malloc(sizeof(*h));
-    if (h == NULL) {
-	return NULL;
-    }
-
-    /* XXX: we lose the const qualifier here which indicates
-     * there's something screwy with the API...
-     */
-    h->base = (char *) buf;
-    h->p    = p;
-
-    b = ap_bucket_make_shared(b, h, 0, length);
-    if (b == NULL) {
-	free(h);
-	return NULL;
-    }
-
-    b->type = &ap_pool_type;
-    h->b = b;
-
-    apr_register_cleanup(h->p, b->data, pool_bucket_cleanup, apr_null_cleanup);
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_pool(
-		const char *buf, apr_size_t length, apr_pool_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_pool(b, buf, length, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_pool_type = {
-    "POOL", 5,
-    pool_destroy,
-    pool_read,
-    ap_bucket_setaside_notimpl,
-    ap_bucket_split_shared,
-    ap_bucket_copy_shared
-};
diff --git a/buckets/apr_buckets_refcount.c b/buckets/apr_buckets_refcount.c
deleted file mode 100644
index e15f045..0000000
--- a/buckets/apr_buckets_refcount.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 <stdlib.h>
-
-#include "apr_errno.h"
-
-#include "ap_buckets.h"
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_shared(ap_bucket *a, apr_off_t point)
-{
-    ap_bucket *b;
-    ap_bucket_shared *ad, *bd;
-    apr_status_t rv;
-
-    if (point < 0 || point > a->length) {
-	return APR_EINVAL;
-    }
-
-    rv = ap_bucket_copy_shared(a, &b);
-    if (rv != APR_SUCCESS) {
-        return rv;
-    }
-
-    ad = a->data;
-    bd = b->data;
-
-    a->length = point;
-    ad->end = ad->start + point;
-    b->length -= point;
-    bd->start += point;
-
-    AP_BUCKET_INSERT_AFTER(a, b);
-
-    return APR_SUCCESS;
-}
-
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_shared(ap_bucket *a, ap_bucket **c)
-{
-    ap_bucket *b;
-    ap_bucket_shared *ad, *bd;
-    ap_bucket_refcount *r;
-
-    b = malloc(sizeof(*b));
-    if (b == NULL) {
-        return APR_ENOMEM;
-    }
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-        free(b);
-        return APR_ENOMEM;
-    }
-    *b = *a;
-    ad = a->data;
-    b->data = bd;
-    *bd = *ad;
-
-    r = ad->data;
-    r->refcount += 1;
-
-    *c = b;
-
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(void *) ap_bucket_destroy_shared(void *data)
-{
-    ap_bucket_shared *s = data;
-    ap_bucket_refcount *r = s->data;
-
-    free(s);
-    r->refcount -= 1;
-    if (r->refcount == 0) {
-	return r;
-    }
-    else {
-	return NULL;
-    }
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_shared(ap_bucket *b, void *data,
-					      apr_off_t start, apr_off_t end)
-{
-    ap_bucket_shared *s;
-    ap_bucket_refcount *r = data;
-
-    s = malloc(sizeof(*s));
-    if (s == NULL) {
-	return NULL;
-    }
-
-    b->data = s;
-    b->length = end - start;
-    /* caller initializes the type field and function pointers */
-    s->start = start;
-    s->end = end;
-    s->data = r;
-    r->refcount = 1;
-    /* caller initializes the rest of r */
-
-    return b;
-}
diff --git a/buckets/apr_buckets_simple.c b/buckets/apr_buckets_simple.c
deleted file mode 100644
index 8f27aad..0000000
--- a/buckets/apr_buckets_simple.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "ap_buckets.h"
-#include <stdlib.h>
-
-/*
- * We can't simplify this function by using an ap_bucket_make function
- * because we aren't sure of the exact type of this bucket.
- */
-static apr_status_t simple_copy(ap_bucket *a, ap_bucket **c)
-{
-    ap_bucket *b;
-    ap_bucket_simple *ad, *bd;
-
-    b = malloc(sizeof(*b)); 
-    if (b == NULL) {
-	return APR_ENOMEM;
-    }
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-	free(b);
-	return APR_ENOMEM;
-    }
-    *b = *a;
-    ad = a->data;
-    b->data = bd;
-    *bd = *ad;
-
-    *c = b;
-
-    return APR_SUCCESS;
-}
-
-static apr_status_t simple_split(ap_bucket *a, apr_off_t point)
-{
-    ap_bucket *b;
-    ap_bucket_simple *ad, *bd;
-    apr_status_t rv;
-
-    if (point < 0 || point > a->length) {
-	return APR_EINVAL;
-    }
-
-    rv = simple_copy(a, &b);
-    if (rv != APR_SUCCESS) {
-        return rv;
-    }
-
-    ad = a->data;
-    bd = b->data;
-
-    a->length = point;
-    ad->end = ad->start + point;
-    b->length -= point;
-    bd->start += point;
-
-    AP_BUCKET_INSERT_AFTER(a, b);
-
-    return APR_SUCCESS;
-}
-
-static apr_status_t simple_read(ap_bucket *b, const char **str, 
-				apr_size_t *len, ap_read_type block)
-{
-    ap_bucket_simple *bd = b->data;
-    *str = bd->start;
-    *len = bd->end - bd->start;
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_immortal(ap_bucket *b,
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_simple *bd;
-
-    bd = malloc(sizeof(*bd));
-    if (bd == NULL) {
-	return NULL;
-    }
-
-    bd->start   = buf;
-    bd->end     = buf+length;
-
-    b->type     = &ap_immortal_type;
-    b->length   = length;
-    b->data     = bd;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_immortal(
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_immortal(b, buf, length));
-}
-
-/*
- * XXX: This function could do with some tweaking to reduce memory
- * usage in various cases, e.g. share buffers in the heap between all
- * the buckets that are set aside, or even spool set-aside data to
- * disk if it gets too voluminous (but if it does then that's probably
- * a bug elsewhere). There should probably be a ap_brigade_setaside()
- * function that co-ordinates the action of all the bucket setaside
- * functions to improve memory efficiency.
- */
-static apr_status_t transient_setaside(ap_bucket *b)
-{
-    ap_bucket_simple *bd;
-    const char *start, *end;
-    apr_size_t w;
-    
-    bd = b->data;
-    start = bd->start;
-    end = bd->end;
-    /* XXX: handle small heap buckets */
-    b = ap_bucket_make_heap(b, start, end-start, 1, &w);
-    if (b == NULL || w != end-start) {
-	return APR_ENOMEM;
-    }
-    free(bd);
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_transient(ap_bucket *b,
-		const char *buf, apr_size_t length)
-{
-    b = ap_bucket_make_immortal(b, buf, length);
-    if (b == NULL) {
-	return NULL;
-    }
-    b->type = &ap_transient_type;
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_transient(
-		const char *buf, apr_size_t length)
-{
-    ap_bucket_do_create(ap_bucket_make_transient(b, buf, length));
-}
-
-const ap_bucket_type ap_immortal_type = {
-    "IMMORTAL", 5,
-    free,
-    simple_read,
-    ap_bucket_setaside_notimpl,
-    simple_split,
-    simple_copy
-};
-
-APR_DECLARE_DATA const ap_bucket_type ap_transient_type = {
-    "TRANSIENT", 5,
-    ap_bucket_destroy_notimpl, 
-    simple_read,
-    transient_setaside,
-    simple_split,
-    simple_copy
-};
diff --git a/buckets/apr_buckets_socket.c b/buckets/apr_buckets_socket.c
deleted file mode 100644
index 996227b..0000000
--- a/buckets/apr_buckets_socket.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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_lib.h"
-#include "ap_buckets.h"
-#include <stdlib.h>
-
-/* XXX: We should obey the block flag */
-static apr_status_t socket_read(ap_bucket *a, const char **str,
-			      apr_size_t *len, ap_read_type block)
-{
-    apr_socket_t *p = a->data;
-    ap_bucket *b;
-    char *buf;
-    apr_status_t rv;
-    apr_int32_t timeout;
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_getsocketopt(p, APR_SO_TIMEOUT, &timeout);
-        apr_setsocketopt(p, APR_SO_TIMEOUT, 0);
-    }
-
-    buf = malloc(HUGE_STRING_LEN); /* XXX: check for failure? */
-    *str = buf;
-    *len = HUGE_STRING_LEN;
-    rv = apr_recv(p, buf, len);
-
-    if (block == AP_NONBLOCK_READ) {
-        apr_setsocketopt(p, APR_SO_TIMEOUT, timeout);
-    }
-
-    if (rv != APR_SUCCESS && rv != APR_EOF) {
-        *str = NULL;
-	free(buf);
-        return rv;
-    }
-    /*
-     * Change the current bucket to refer to what we read,
-     * even if we read nothing because we hit EOF.
-     */
-    ap_bucket_make_heap(a, buf, *len, 0, NULL);  /* XXX: check for failure? */
-    /*
-     * If there's more to read we have to keep the rest of the socket
-     * for later. XXX: Note that more complicated bucket types that
-     * refer to data not in memory and must therefore have a read()
-     * function similar to this one should be wary of copying this
-     * code because if they have a destroy function they probably
-     * want to migrate the bucket's subordinate structure from the
-     * old bucket to a raw new one and adjust it as appropriate,
-     * rather than destroying the old one and creating a completely
-     * new bucket.
-     *
-     * Even if there is nothing more to read, don't close the socket here
-     * as we have to use it to send any response :)  We could shut it 
-     * down for reading, but there is no benefit to doing so.
-     */
-    if (*len > 0) {
-        b = ap_bucket_create_socket(p);
-	AP_BUCKET_INSERT_AFTER(a, b);
-    }
-    return APR_SUCCESS;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_make_socket(ap_bucket *b, apr_socket_t *p)
-{
-    /*
-     * XXX: We rely on a cleanup on some pool or other to actually
-     * destroy the socket. We should probably explicitly call apr to
-     * destroy it instead.
-     *
-     * Note that typically the socket is allocated from the connection pool
-     * so it will disappear when the connection is finished. 
-     */
-    b->type     = &ap_socket_type;
-    b->length   = -1;
-    b->data     = p;
-
-    return b;
-}
-
-APR_DECLARE(ap_bucket *) ap_bucket_create_socket(apr_socket_t *p)
-{
-    ap_bucket_do_create(ap_bucket_make_socket(b, p));
-}
-
-APR_DECLARE_DATA const ap_bucket_type ap_socket_type = {
-    "SOCKET", 5,
-    ap_bucket_destroy_notimpl,
-    socket_read,
-    ap_bucket_setaside_notimpl, 
-    ap_bucket_split_notimpl,
-    ap_bucket_copy_notimpl
-};
diff --git a/crypto/.cvsignore b/crypto/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/crypto/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/crypto/Makefile.in b/crypto/Makefile.in
deleted file mode 100644
index 9fdbbd7..0000000
--- a/crypto/Makefile.in
+++ /dev/null
@@ -1,5 +0,0 @@
-
-TARGETS = ap_sha1.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/crypto/ap_sha1.c b/crypto/ap_sha1.c
deleted file mode 100644
index db25b54..0000000
--- a/crypto/ap_sha1.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- */
-
-/*
- * The exported function:
- *
- * 	 ap_sha1_base64(const char *clear, int len, char *out);
- *
- * provides a means to SHA1 crypt/encode a plaintext password in
- * a way which makes password files compatible with those commonly
- * used in netscape web and ldap installations. It was put together
- * by Clinton Wong <clintdw@netcom.com>, who also notes that:
- *
- * Note: SHA1 support is useful for migration purposes, but is less
- *     secure than Apache's password format, since Apache's (MD5)
- *     password format uses a random eight character salt to generate
- *     one of many possible hashes for the same password.  Netscape
- *     uses plain SHA1 without a salt, so the same password
- *     will always generate the same hash, making it easier
- *     to break since the search space is smaller.
- *
- * See also the documentation in support/SHA1 as to hints on how to
- * migrate an existing netscape installation and other supplied utitlites.
- *
- * This software also makes use of the following component:
- *
- * NIST Secure Hash Algorithm
- *  	heavily modified by Uwe Hollerbach uh@alumni.caltech edu
- *	from Peter C. Gutmann's implementation as found in
- *	Applied Cryptography by Bruce Schneier
- *	This code is hereby placed in the public domain
- */
-
-#include "ap_sha1.h"
-#include "ap_base64.h"
-#include "apr_strings.h"
-#include "apr_lib.h"
-#ifdef CHARSET_EBCDIC
-#include "apr_xlate.h"
-#endif /*CHARSET_EBCDIC*/
-#include <string.h>
-
-/* a bit faster & bigger, if defined */
-#define UNROLL_LOOPS
-
-/* NIST's proposed modification to SHA, 7/11/94 */
-#define USE_MODIFIED_SHA
-
-/* SHA f()-functions */
-#define f1(x,y,z)	((x & y) | (~x & z))
-#define f2(x,y,z)	(x ^ y ^ z)
-#define f3(x,y,z)	((x & y) | (x & z) | (y & z))
-#define f4(x,y,z)	(x ^ y ^ z)
-
-/* SHA constants */
-#define CONST1		0x5a827999L
-#define CONST2		0x6ed9eba1L
-#define CONST3		0x8f1bbcdcL
-#define CONST4		0xca62c1d6L
-
-/* 32-bit rotate */
-
-#define ROT32(x,n)	((x << n) | (x >> (32 - n)))
-
-#define FUNC(n,i)						\
-    temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n;	\
-    E = D; D = C; C = ROT32(B,30); B = A; A = temp
-
-#define SHA_BLOCKSIZE           64
-
-#ifdef CHARSET_EBCDIC
-static apr_xlate_t *ebcdic2ascii_xlate;
-
-APR_DECLARE(apr_status_t) ap_SHA1InitEBCDIC(apr_xlate_t *x)
-{
-    apr_status_t rv;
-    int onoff;
-
-    /* Only single-byte conversion is supported.
-     */
-    rv = apr_xlate_get_sb(x, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    ebcdic2ascii_xlate = x;
-    return APR_SUCCESS;
-}
-#endif
-
-typedef unsigned char AP_BYTE;
-
-/* do SHA transformation */
-static void sha_transform(AP_SHA1_CTX *sha_info)
-{
-    int i;
-    apr_uint32_t temp, A, B, C, D, E, W[80];
-
-    for (i = 0; i < 16; ++i) {
-	W[i] = sha_info->data[i];
-    }
-    for (i = 16; i < 80; ++i) {
-	W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
-#ifdef USE_MODIFIED_SHA
-	W[i] = ROT32(W[i], 1);
-#endif /* USE_MODIFIED_SHA */
-    }
-    A = sha_info->digest[0];
-    B = sha_info->digest[1];
-    C = sha_info->digest[2];
-    D = sha_info->digest[3];
-    E = sha_info->digest[4];
-#ifdef UNROLL_LOOPS
-    FUNC(1, 0);  FUNC(1, 1);  FUNC(1, 2);  FUNC(1, 3);  FUNC(1, 4);
-    FUNC(1, 5);  FUNC(1, 6);  FUNC(1, 7);  FUNC(1, 8);  FUNC(1, 9);
-    FUNC(1,10);  FUNC(1,11);  FUNC(1,12);  FUNC(1,13);  FUNC(1,14);
-    FUNC(1,15);  FUNC(1,16);  FUNC(1,17);  FUNC(1,18);  FUNC(1,19);
-
-    FUNC(2,20);  FUNC(2,21);  FUNC(2,22);  FUNC(2,23);  FUNC(2,24);
-    FUNC(2,25);  FUNC(2,26);  FUNC(2,27);  FUNC(2,28);  FUNC(2,29);
-    FUNC(2,30);  FUNC(2,31);  FUNC(2,32);  FUNC(2,33);  FUNC(2,34);
-    FUNC(2,35);  FUNC(2,36);  FUNC(2,37);  FUNC(2,38);  FUNC(2,39);
-
-    FUNC(3,40);  FUNC(3,41);  FUNC(3,42);  FUNC(3,43);  FUNC(3,44);
-    FUNC(3,45);  FUNC(3,46);  FUNC(3,47);  FUNC(3,48);  FUNC(3,49);
-    FUNC(3,50);  FUNC(3,51);  FUNC(3,52);  FUNC(3,53);  FUNC(3,54);
-    FUNC(3,55);  FUNC(3,56);  FUNC(3,57);  FUNC(3,58);  FUNC(3,59);
-
-    FUNC(4,60);  FUNC(4,61);  FUNC(4,62);  FUNC(4,63);  FUNC(4,64);
-    FUNC(4,65);  FUNC(4,66);  FUNC(4,67);  FUNC(4,68);  FUNC(4,69);
-    FUNC(4,70);  FUNC(4,71);  FUNC(4,72);  FUNC(4,73);  FUNC(4,74);
-    FUNC(4,75);  FUNC(4,76);  FUNC(4,77);  FUNC(4,78);  FUNC(4,79);
-#else /* !UNROLL_LOOPS */
-    for (i = 0; i < 20; ++i) {
-	FUNC(1,i);
-    }
-    for (i = 20; i < 40; ++i) {
-	FUNC(2,i);
-    }
-    for (i = 40; i < 60; ++i) {
-	FUNC(3,i);
-    }
-    for (i = 60; i < 80; ++i) {
-	FUNC(4,i);
-    }
-#endif /* !UNROLL_LOOPS */
-    sha_info->digest[0] += A;
-    sha_info->digest[1] += B;
-    sha_info->digest[2] += C;
-    sha_info->digest[3] += D;
-    sha_info->digest[4] += E;
-}
-
-union endianTest {
-    long Long;
-    char Char[sizeof(long)];
-};
-
-static char isLittleEndian(void)
-{
-    static union endianTest u;
-    u.Long = 1;
-    return (u.Char[0] == 1);
-}
-
-/* change endianness of data */
-
-/* count is the number of bytes to do an endian flip */
-static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
-{
-    int i;
-    AP_BYTE ct[4], *cp;
-
-    if (isLittleEndian()) {	/* do the swap only if it is little endian */
-	count /= sizeof(apr_uint32_t);
-	cp = (AP_BYTE *) buffer;
-	for (i = 0; i < count; ++i) {
-	    ct[0] = cp[0];
-	    ct[1] = cp[1];
-	    ct[2] = cp[2];
-	    ct[3] = cp[3];
-	    cp[0] = ct[3];
-	    cp[1] = ct[2];
-	    cp[2] = ct[1];
-	    cp[3] = ct[0];
-	    cp += sizeof(apr_uint32_t);
-	}
-    }
-}
-
-/* initialize the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Init(AP_SHA1_CTX *sha_info)
-{
-    sha_info->digest[0] = 0x67452301L;
-    sha_info->digest[1] = 0xefcdab89L;
-    sha_info->digest[2] = 0x98badcfeL;
-    sha_info->digest[3] = 0x10325476L;
-    sha_info->digest[4] = 0xc3d2e1f0L;
-    sha_info->count_lo = 0L;
-    sha_info->count_hi = 0L;
-    sha_info->local = 0;
-}
-
-/* update the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Update_binary(AP_SHA1_CTX *sha_info,
-                                     const unsigned char *buffer,
-                                     unsigned int count)
-{
-    unsigned int i;
-
-    if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
-	++sha_info->count_hi;
-    }
-    sha_info->count_lo += (apr_uint32_t) count << 3;
-    sha_info->count_hi += (apr_uint32_t) count >> 29;
-    if (sha_info->local) {
-	i = SHA_BLOCKSIZE - sha_info->local;
-	if (i > count) {
-	    i = count;
-	}
-	memcpy(((AP_BYTE *) sha_info->data) + sha_info->local, buffer, i);
-	count -= i;
-	buffer += i;
-	sha_info->local += i;
-	if (sha_info->local == SHA_BLOCKSIZE) {
-	    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	    sha_transform(sha_info);
-	}
-	else {
-	    return;
-	}
-    }
-    while (count >= SHA_BLOCKSIZE) {
-	memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
-	buffer += SHA_BLOCKSIZE;
-	count -= SHA_BLOCKSIZE;
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-    }
-    memcpy(sha_info->data, buffer, count);
-    sha_info->local = count;
-}
-
-APR_DECLARE(void) ap_SHA1Update(AP_SHA1_CTX *sha_info, const char *buf,
-                              unsigned int count)
-{
-#ifdef CHARSET_EBCDIC
-    int i;
-    const AP_BYTE *buffer = (const AP_BYTE *) buf;
-    apr_size_t inbytes_left, outbytes_left;
-
-    if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
-	++sha_info->count_hi;
-    }
-    sha_info->count_lo += (apr_uint32_t) count << 3;
-    sha_info->count_hi += (apr_uint32_t) count >> 29;
-    /* Is there a remainder of the previous Update operation? */
-    if (sha_info->local) {
-	i = SHA_BLOCKSIZE - sha_info->local;
-	if (i > count) {
-	    i = count;
-	}
-        inbytes_left = outbytes_left = i;
-        apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                              ((AP_BYTE *) sha_info->data) + sha_info->local,
-                              &outbytes_left);
-	count -= i;
-	buffer += i;
-	sha_info->local += i;
-	if (sha_info->local == SHA_BLOCKSIZE) {
-	    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	    sha_transform(sha_info);
-	}
-	else {
-	    return;
-	}
-    }
-    while (count >= SHA_BLOCKSIZE) {
-        inbytes_left = outbytes_left = SHA_BLOCKSIZE;
-        apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                              (AP_BYTE *) sha_info->data, &outbytes_left);
-	buffer += SHA_BLOCKSIZE;
-	count -= SHA_BLOCKSIZE;
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-    }
-    inbytes_left = outbytes_left = count;
-    apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                          (AP_BYTE *) sha_info->data, &outbytes_left);
-    sha_info->local = count;
-#else
-    ap_SHA1Update_binary(sha_info, (const unsigned char *) buf, count);
-#endif
-}
-
-/* finish computing the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Final(unsigned char digest[SHA_DIGESTSIZE],
-                             AP_SHA1_CTX *sha_info)
-{
-    int count, i, j;
-    apr_uint32_t lo_bit_count, hi_bit_count, k;
-
-    lo_bit_count = sha_info->count_lo;
-    hi_bit_count = sha_info->count_hi;
-    count = (int) ((lo_bit_count >> 3) & 0x3f);
-    ((AP_BYTE *) sha_info->data)[count++] = 0x80;
-    if (count > SHA_BLOCKSIZE - 8) {
-	memset(((AP_BYTE *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-	memset((AP_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
-    }
-    else {
-	memset(((AP_BYTE *) sha_info->data) + count, 0,
-	       SHA_BLOCKSIZE - 8 - count);
-    }
-    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-    sha_info->data[14] = hi_bit_count;
-    sha_info->data[15] = lo_bit_count;
-    sha_transform(sha_info);
-
-    for (i = 0, j = 0; j < SHA_DIGESTSIZE; i++) {
-	k = sha_info->digest[i];
-	digest[j++] = (unsigned char) ((k >> 24) & 0xff);
-	digest[j++] = (unsigned char) ((k >> 16) & 0xff);
-	digest[j++] = (unsigned char) ((k >> 8) & 0xff);
-	digest[j++] = (unsigned char) (k & 0xff);
-    }
-}
-
-
-APR_DECLARE(void) ap_sha1_base64(const char *clear, int len, char *out)
-{
-    int l;
-    AP_SHA1_CTX context;
-    AP_BYTE digest[SHA_DIGESTSIZE];
-
-    if (strncmp(clear, AP_SHA1PW_ID, AP_SHA1PW_IDLEN) == 0) {
-	clear += AP_SHA1PW_IDLEN;
-    }
-
-    ap_SHA1Init(&context);
-    ap_SHA1Update(&context, clear, len);
-    ap_SHA1Final(digest, &context);
-
-    /* private marker. */
-    apr_cpystrn(out, AP_SHA1PW_ID, AP_SHA1PW_IDLEN + 1);
-
-    /* SHA1 hash is always 20 chars */
-    l = ap_base64encode_binary(out + AP_SHA1PW_IDLEN, digest, sizeof(digest));
-    out[l + AP_SHA1PW_IDLEN] = '\0';
-
-    /*
-     * output of base64 encoded SHA1 is always 28 chars + AP_SHA1PW_IDLEN
-     */
-}
diff --git a/crypto/apr_sha1.c b/crypto/apr_sha1.c
deleted file mode 100644
index db25b54..0000000
--- a/crypto/apr_sha1.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- */
-
-/*
- * The exported function:
- *
- * 	 ap_sha1_base64(const char *clear, int len, char *out);
- *
- * provides a means to SHA1 crypt/encode a plaintext password in
- * a way which makes password files compatible with those commonly
- * used in netscape web and ldap installations. It was put together
- * by Clinton Wong <clintdw@netcom.com>, who also notes that:
- *
- * Note: SHA1 support is useful for migration purposes, but is less
- *     secure than Apache's password format, since Apache's (MD5)
- *     password format uses a random eight character salt to generate
- *     one of many possible hashes for the same password.  Netscape
- *     uses plain SHA1 without a salt, so the same password
- *     will always generate the same hash, making it easier
- *     to break since the search space is smaller.
- *
- * See also the documentation in support/SHA1 as to hints on how to
- * migrate an existing netscape installation and other supplied utitlites.
- *
- * This software also makes use of the following component:
- *
- * NIST Secure Hash Algorithm
- *  	heavily modified by Uwe Hollerbach uh@alumni.caltech edu
- *	from Peter C. Gutmann's implementation as found in
- *	Applied Cryptography by Bruce Schneier
- *	This code is hereby placed in the public domain
- */
-
-#include "ap_sha1.h"
-#include "ap_base64.h"
-#include "apr_strings.h"
-#include "apr_lib.h"
-#ifdef CHARSET_EBCDIC
-#include "apr_xlate.h"
-#endif /*CHARSET_EBCDIC*/
-#include <string.h>
-
-/* a bit faster & bigger, if defined */
-#define UNROLL_LOOPS
-
-/* NIST's proposed modification to SHA, 7/11/94 */
-#define USE_MODIFIED_SHA
-
-/* SHA f()-functions */
-#define f1(x,y,z)	((x & y) | (~x & z))
-#define f2(x,y,z)	(x ^ y ^ z)
-#define f3(x,y,z)	((x & y) | (x & z) | (y & z))
-#define f4(x,y,z)	(x ^ y ^ z)
-
-/* SHA constants */
-#define CONST1		0x5a827999L
-#define CONST2		0x6ed9eba1L
-#define CONST3		0x8f1bbcdcL
-#define CONST4		0xca62c1d6L
-
-/* 32-bit rotate */
-
-#define ROT32(x,n)	((x << n) | (x >> (32 - n)))
-
-#define FUNC(n,i)						\
-    temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n;	\
-    E = D; D = C; C = ROT32(B,30); B = A; A = temp
-
-#define SHA_BLOCKSIZE           64
-
-#ifdef CHARSET_EBCDIC
-static apr_xlate_t *ebcdic2ascii_xlate;
-
-APR_DECLARE(apr_status_t) ap_SHA1InitEBCDIC(apr_xlate_t *x)
-{
-    apr_status_t rv;
-    int onoff;
-
-    /* Only single-byte conversion is supported.
-     */
-    rv = apr_xlate_get_sb(x, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    ebcdic2ascii_xlate = x;
-    return APR_SUCCESS;
-}
-#endif
-
-typedef unsigned char AP_BYTE;
-
-/* do SHA transformation */
-static void sha_transform(AP_SHA1_CTX *sha_info)
-{
-    int i;
-    apr_uint32_t temp, A, B, C, D, E, W[80];
-
-    for (i = 0; i < 16; ++i) {
-	W[i] = sha_info->data[i];
-    }
-    for (i = 16; i < 80; ++i) {
-	W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
-#ifdef USE_MODIFIED_SHA
-	W[i] = ROT32(W[i], 1);
-#endif /* USE_MODIFIED_SHA */
-    }
-    A = sha_info->digest[0];
-    B = sha_info->digest[1];
-    C = sha_info->digest[2];
-    D = sha_info->digest[3];
-    E = sha_info->digest[4];
-#ifdef UNROLL_LOOPS
-    FUNC(1, 0);  FUNC(1, 1);  FUNC(1, 2);  FUNC(1, 3);  FUNC(1, 4);
-    FUNC(1, 5);  FUNC(1, 6);  FUNC(1, 7);  FUNC(1, 8);  FUNC(1, 9);
-    FUNC(1,10);  FUNC(1,11);  FUNC(1,12);  FUNC(1,13);  FUNC(1,14);
-    FUNC(1,15);  FUNC(1,16);  FUNC(1,17);  FUNC(1,18);  FUNC(1,19);
-
-    FUNC(2,20);  FUNC(2,21);  FUNC(2,22);  FUNC(2,23);  FUNC(2,24);
-    FUNC(2,25);  FUNC(2,26);  FUNC(2,27);  FUNC(2,28);  FUNC(2,29);
-    FUNC(2,30);  FUNC(2,31);  FUNC(2,32);  FUNC(2,33);  FUNC(2,34);
-    FUNC(2,35);  FUNC(2,36);  FUNC(2,37);  FUNC(2,38);  FUNC(2,39);
-
-    FUNC(3,40);  FUNC(3,41);  FUNC(3,42);  FUNC(3,43);  FUNC(3,44);
-    FUNC(3,45);  FUNC(3,46);  FUNC(3,47);  FUNC(3,48);  FUNC(3,49);
-    FUNC(3,50);  FUNC(3,51);  FUNC(3,52);  FUNC(3,53);  FUNC(3,54);
-    FUNC(3,55);  FUNC(3,56);  FUNC(3,57);  FUNC(3,58);  FUNC(3,59);
-
-    FUNC(4,60);  FUNC(4,61);  FUNC(4,62);  FUNC(4,63);  FUNC(4,64);
-    FUNC(4,65);  FUNC(4,66);  FUNC(4,67);  FUNC(4,68);  FUNC(4,69);
-    FUNC(4,70);  FUNC(4,71);  FUNC(4,72);  FUNC(4,73);  FUNC(4,74);
-    FUNC(4,75);  FUNC(4,76);  FUNC(4,77);  FUNC(4,78);  FUNC(4,79);
-#else /* !UNROLL_LOOPS */
-    for (i = 0; i < 20; ++i) {
-	FUNC(1,i);
-    }
-    for (i = 20; i < 40; ++i) {
-	FUNC(2,i);
-    }
-    for (i = 40; i < 60; ++i) {
-	FUNC(3,i);
-    }
-    for (i = 60; i < 80; ++i) {
-	FUNC(4,i);
-    }
-#endif /* !UNROLL_LOOPS */
-    sha_info->digest[0] += A;
-    sha_info->digest[1] += B;
-    sha_info->digest[2] += C;
-    sha_info->digest[3] += D;
-    sha_info->digest[4] += E;
-}
-
-union endianTest {
-    long Long;
-    char Char[sizeof(long)];
-};
-
-static char isLittleEndian(void)
-{
-    static union endianTest u;
-    u.Long = 1;
-    return (u.Char[0] == 1);
-}
-
-/* change endianness of data */
-
-/* count is the number of bytes to do an endian flip */
-static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
-{
-    int i;
-    AP_BYTE ct[4], *cp;
-
-    if (isLittleEndian()) {	/* do the swap only if it is little endian */
-	count /= sizeof(apr_uint32_t);
-	cp = (AP_BYTE *) buffer;
-	for (i = 0; i < count; ++i) {
-	    ct[0] = cp[0];
-	    ct[1] = cp[1];
-	    ct[2] = cp[2];
-	    ct[3] = cp[3];
-	    cp[0] = ct[3];
-	    cp[1] = ct[2];
-	    cp[2] = ct[1];
-	    cp[3] = ct[0];
-	    cp += sizeof(apr_uint32_t);
-	}
-    }
-}
-
-/* initialize the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Init(AP_SHA1_CTX *sha_info)
-{
-    sha_info->digest[0] = 0x67452301L;
-    sha_info->digest[1] = 0xefcdab89L;
-    sha_info->digest[2] = 0x98badcfeL;
-    sha_info->digest[3] = 0x10325476L;
-    sha_info->digest[4] = 0xc3d2e1f0L;
-    sha_info->count_lo = 0L;
-    sha_info->count_hi = 0L;
-    sha_info->local = 0;
-}
-
-/* update the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Update_binary(AP_SHA1_CTX *sha_info,
-                                     const unsigned char *buffer,
-                                     unsigned int count)
-{
-    unsigned int i;
-
-    if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
-	++sha_info->count_hi;
-    }
-    sha_info->count_lo += (apr_uint32_t) count << 3;
-    sha_info->count_hi += (apr_uint32_t) count >> 29;
-    if (sha_info->local) {
-	i = SHA_BLOCKSIZE - sha_info->local;
-	if (i > count) {
-	    i = count;
-	}
-	memcpy(((AP_BYTE *) sha_info->data) + sha_info->local, buffer, i);
-	count -= i;
-	buffer += i;
-	sha_info->local += i;
-	if (sha_info->local == SHA_BLOCKSIZE) {
-	    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	    sha_transform(sha_info);
-	}
-	else {
-	    return;
-	}
-    }
-    while (count >= SHA_BLOCKSIZE) {
-	memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
-	buffer += SHA_BLOCKSIZE;
-	count -= SHA_BLOCKSIZE;
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-    }
-    memcpy(sha_info->data, buffer, count);
-    sha_info->local = count;
-}
-
-APR_DECLARE(void) ap_SHA1Update(AP_SHA1_CTX *sha_info, const char *buf,
-                              unsigned int count)
-{
-#ifdef CHARSET_EBCDIC
-    int i;
-    const AP_BYTE *buffer = (const AP_BYTE *) buf;
-    apr_size_t inbytes_left, outbytes_left;
-
-    if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
-	++sha_info->count_hi;
-    }
-    sha_info->count_lo += (apr_uint32_t) count << 3;
-    sha_info->count_hi += (apr_uint32_t) count >> 29;
-    /* Is there a remainder of the previous Update operation? */
-    if (sha_info->local) {
-	i = SHA_BLOCKSIZE - sha_info->local;
-	if (i > count) {
-	    i = count;
-	}
-        inbytes_left = outbytes_left = i;
-        apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                              ((AP_BYTE *) sha_info->data) + sha_info->local,
-                              &outbytes_left);
-	count -= i;
-	buffer += i;
-	sha_info->local += i;
-	if (sha_info->local == SHA_BLOCKSIZE) {
-	    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	    sha_transform(sha_info);
-	}
-	else {
-	    return;
-	}
-    }
-    while (count >= SHA_BLOCKSIZE) {
-        inbytes_left = outbytes_left = SHA_BLOCKSIZE;
-        apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                              (AP_BYTE *) sha_info->data, &outbytes_left);
-	buffer += SHA_BLOCKSIZE;
-	count -= SHA_BLOCKSIZE;
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-    }
-    inbytes_left = outbytes_left = count;
-    apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
-                          (AP_BYTE *) sha_info->data, &outbytes_left);
-    sha_info->local = count;
-#else
-    ap_SHA1Update_binary(sha_info, (const unsigned char *) buf, count);
-#endif
-}
-
-/* finish computing the SHA digest */
-
-APR_DECLARE(void) ap_SHA1Final(unsigned char digest[SHA_DIGESTSIZE],
-                             AP_SHA1_CTX *sha_info)
-{
-    int count, i, j;
-    apr_uint32_t lo_bit_count, hi_bit_count, k;
-
-    lo_bit_count = sha_info->count_lo;
-    hi_bit_count = sha_info->count_hi;
-    count = (int) ((lo_bit_count >> 3) & 0x3f);
-    ((AP_BYTE *) sha_info->data)[count++] = 0x80;
-    if (count > SHA_BLOCKSIZE - 8) {
-	memset(((AP_BYTE *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
-	maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-	sha_transform(sha_info);
-	memset((AP_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
-    }
-    else {
-	memset(((AP_BYTE *) sha_info->data) + count, 0,
-	       SHA_BLOCKSIZE - 8 - count);
-    }
-    maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
-    sha_info->data[14] = hi_bit_count;
-    sha_info->data[15] = lo_bit_count;
-    sha_transform(sha_info);
-
-    for (i = 0, j = 0; j < SHA_DIGESTSIZE; i++) {
-	k = sha_info->digest[i];
-	digest[j++] = (unsigned char) ((k >> 24) & 0xff);
-	digest[j++] = (unsigned char) ((k >> 16) & 0xff);
-	digest[j++] = (unsigned char) ((k >> 8) & 0xff);
-	digest[j++] = (unsigned char) (k & 0xff);
-    }
-}
-
-
-APR_DECLARE(void) ap_sha1_base64(const char *clear, int len, char *out)
-{
-    int l;
-    AP_SHA1_CTX context;
-    AP_BYTE digest[SHA_DIGESTSIZE];
-
-    if (strncmp(clear, AP_SHA1PW_ID, AP_SHA1PW_IDLEN) == 0) {
-	clear += AP_SHA1PW_IDLEN;
-    }
-
-    ap_SHA1Init(&context);
-    ap_SHA1Update(&context, clear, len);
-    ap_SHA1Final(digest, &context);
-
-    /* private marker. */
-    apr_cpystrn(out, AP_SHA1PW_ID, AP_SHA1PW_IDLEN + 1);
-
-    /* SHA1 hash is always 20 chars */
-    l = ap_base64encode_binary(out + AP_SHA1PW_IDLEN, digest, sizeof(digest));
-    out[l + AP_SHA1PW_IDLEN] = '\0';
-
-    /*
-     * output of base64 encoded SHA1 is always 28 chars + AP_SHA1PW_IDLEN
-     */
-}
diff --git a/dbm/.cvsignore b/dbm/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/dbm/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/dbm/Makefile.in b/dbm/Makefile.in
deleted file mode 100644
index e8ef8a2..0000000
--- a/dbm/Makefile.in
+++ /dev/null
@@ -1,6 +0,0 @@
-TARGETS = apr_dbm.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
-
-SUBDIRS = sdbm .
diff --git a/dbm/apr_dbm.c b/dbm/apr_dbm.c
deleted file mode 100644
index 1e6eb30..0000000
--- a/dbm/apr_dbm.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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.h"
-#include "apr_errno.h"
-#include "apr_pools.h"
-
-#include "apu_private.h"
-#include "apr_dbm.h"
-
-#if APU_USE_SDBM
-#include "apr_sdbm.h"
-
-typedef SDBM *real_file_t;
-typedef sdbm_datum real_datum_t;
-
-#define APR_DBM_CLOSE(f)	sdbm_close(f)
-#define APR_DBM_FETCH(f, k)	sdbm_fetch((f), (k))
-#define APR_DBM_STORE(f, k, v)	sdbm_store((f), (k), (v), SDBM_REPLACE)
-#define APR_DBM_DELETE(f, k)	sdbm_delete((f), (k))
-#define APR_DBM_FIRSTKEY(f)	sdbm_firstkey(f)
-#define APR_DBM_NEXTKEY(f, k)	sdbm_nextkey(f)
-#define APR_DBM_FREEDPTR(dptr)	if (0) ; else	/* stop "no effect" warning */
-
-#define APR_DBM_DBMODE_RO       APR_READ
-#define APR_DBM_DBMODE_RW       (APR_READ | APR_WRITE)
-#define APR_DBM_DBMODE_RWCREATE (APR_READ | APR_WRITE | APR_CREATE)
-
-#elif APU_USE_GDBM
-#include <gdbm.h>
-#include <stdlib.h>     /* for free() */
-
-typedef GDBM_FILE real_file_t;
-typedef datum real_datum_t;
-
-#define APR_DBM_CLOSE(f)	gdbm_close(f)
-#define APR_DBM_FETCH(f, k)	gdbm_fetch((f), (k))
-#define APR_DBM_STORE(f, k, v)	g2s(gdbm_store((f), (k), (v), GDBM_REPLACE))
-#define APR_DBM_DELETE(f, k)	g2s(gdbm_delete((f), (k)))
-#define APR_DBM_FIRSTKEY(f)	gdbm_firstkey(f)
-#define APR_DBM_NEXTKEY(f, k)	gdbm_nextkey((f), (k))
-#define APR_DBM_FREEDPTR(dptr)	((dptr) ? free(dptr) : 0)
-
-#define NEEDS_CLEANUP
-
-#define APR_DBM_DBMODE_RO       GDBM_READER
-#define APR_DBM_DBMODE_RW       GDBM_WRITER
-#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
-
-/* map a GDBM error to an apr_status_t */
-static apr_status_t g2s(int gerr)
-{
-    if (gerr == -1) {
-        /* ### need to fix this */
-        return APR_EINVAL;
-    }
-
-    return APR_SUCCESS;
-}
-
-#else
-#error a DBM implementation was not specified
-#endif
-
-
-struct apr_dbm_t
-{
-    apr_pool_t *pool;
-    real_file_t file;
-
-    int errcode;
-    const char *errmsg;
-};
-
-/* apr_datum <=> real_datum casting/conversions */
-#define A2R_DATUM(d)    (*(real_datum_t *)&(d))
-#define R2A_DATUM(d)    (*(apr_datum_t *)&(d))
-
-
-#ifdef NEEDS_CLEANUP
-
-static apr_status_t datum_cleanup(void *dptr)
-{
-    APR_DBM_FREEDPTR(dptr);
-    return APR_SUCCESS;
-}
-
-#define REG_CLEANUP(db, pdatum) \
-    if ((pdatum)->dptr) \
-        apr_register_cleanup((db)->pool, (pdatum)->dptr, \
-                             datum_cleanup, apr_null_cleanup); \
-    else
-
-#else /* NEEDS_CLEANUP */
-
-#define REG_CLEANUP(db, pdatum) if (0) ; else   /* stop "no effect" warning */
-
-#endif /* NEEDS_CLEANUP */
-
-static apr_status_t set_error(apr_dbm_t *db)
-{
-    apr_status_t rv = APR_SUCCESS;
-
-#if APU_USE_SDBM
-
-    if ((db->errcode = sdbm_error(db->file)) == 0) {
-        db->errmsg = NULL;
-    }
-    else {
-        db->errmsg = "I/O error occurred.";
-        rv = APR_EINVAL;        /* ### need something better */
-    }
-
-    /* captured it. clear it now. */
-    sdbm_clearerr(db->file);
-
-#elif APU_USE_GDBM
-
-    if ((db->errcode = gdbm_errno) == GDBM_NO_ERROR) {
-        db->errmsg = NULL;
-    }
-    else {
-        db->errmsg = gdbm_strerror(gdbm_errno);
-        rv = APR_EINVAL;        /* ### need something better */
-    }
-
-    /* captured it. clear it now. */
-    gdbm_errno = GDBM_NO_ERROR;
-
-#endif
-
-    return rv;
-}
-
-apr_status_t apr_dbm_open(apr_dbm_t **pdb, const char *pathname, int mode,
-                          apr_pool_t *pool)
-{
-    real_file_t file;
-    int dbmode;
-
-    *pdb = NULL;
-
-    switch (mode) {
-    case APR_DBM_READONLY:
-        dbmode = APR_DBM_DBMODE_RO;
-        break;
-    case APR_DBM_READWRITE:
-        dbmode = APR_DBM_DBMODE_RW;
-        break;
-    case APR_DBM_RWCREATE:
-        dbmode = APR_DBM_DBMODE_RWCREATE;
-        break;
-    default:
-        return APR_EINVAL;
-    }
-
-#if APU_USE_SDBM
-    {
-        apr_status_t rv;
-
-        rv = sdbm_open(&file, pathname, dbmode, APR_OS_DEFAULT, pool);
-        if (rv != APR_SUCCESS)
-            return rv;
-    }
-#elif APU_USE_GDBM
-    {
-        /* Note: stupid cast to get rid of "const" on the pathname */
-        file = gdbm_open((char *) pathname, 0, dbmode, 0660, NULL);
-        if (file == NULL)
-            return APR_EINVAL;      /* ### need a better error */
-    }
-#endif
-
-    /* we have an open database... return it */
-    *pdb = apr_pcalloc(pool, sizeof(**pdb));
-    (*pdb)->pool = pool;
-    (*pdb)->file = file;
-
-    return APR_SUCCESS;
-}
-
-void apr_dbm_close(apr_dbm_t *db)
-{
-    APR_DBM_CLOSE(db->file);
-}
-
-apr_status_t apr_dbm_fetch(apr_dbm_t *db, apr_datum_t key, apr_datum_t *pvalue)
-{
-    *(real_datum_t *) pvalue = APR_DBM_FETCH(db->file, A2R_DATUM(key));
-
-    REG_CLEANUP(db, pvalue);
-
-    /* store the error info into DB, and return a status code. Also, note
-       that *pvalue should have been cleared on error. */
-    return set_error(db);
-}
-
-apr_status_t apr_dbm_store(apr_dbm_t *db, apr_datum_t key, apr_datum_t value)
-{
-    apr_status_t rv;
-
-    rv = APR_DBM_STORE(db->file, A2R_DATUM(key), A2R_DATUM(value));
-
-    /* ### is this the right handling of set_error() and rv? */
-
-    /* store the error info into DB, and return a status code. Also, note
-       that *pvalue should have been cleared on error. */
-    (void) set_error(db);
-
-    return rv;
-}
-
-apr_status_t apr_dbm_delete(apr_dbm_t *db, apr_datum_t key)
-{
-    apr_status_t rv;
-
-    rv = APR_DBM_DELETE(db->file, A2R_DATUM(key));
-
-    /* ### is this the right handling of set_error() and rv? */
-
-    /* store the error info into DB, and return a status code. Also, note
-       that *pvalue should have been cleared on error. */
-    (void) set_error(db);
-
-    return rv;
-}
-
-int apr_dbm_exists(apr_dbm_t *db, apr_datum_t key)
-{
-    int exists;
-
-#if APU_USE_SDBM
-    {
-	sdbm_datum value = sdbm_fetch(db->file, A2R_DATUM(key));
-	sdbm_clearerr(db->file);	/* don't need the error */
-	exists = value.dptr != NULL;
-    }
-#elif APU_USE_GDBM
-    exists = gdbm_exists(db->file, A2R_DATUM(key)) != 0;
-#endif
-    return exists;
-}
-
-apr_status_t apr_dbm_firstkey(apr_dbm_t *db, apr_datum_t *pkey)
-{
-    *(real_datum_t *) pkey = APR_DBM_FIRSTKEY(db->file);
-
-    REG_CLEANUP(db, pkey);
-
-    /* store the error info into DB, and return a status code. Also, note
-       that *pvalue should have been cleared on error. */
-    return set_error(db);
-}
-
-apr_status_t apr_dbm_nextkey(apr_dbm_t *db, apr_datum_t *pkey)
-{
-    *(real_datum_t *) pkey = APR_DBM_NEXTKEY(db->file, A2R_DATUM(*pkey));
-
-    REG_CLEANUP(db, pkey);
-
-    /* store the error info into DB, and return a status code. Also, note
-       that *pvalue should have been cleared on error. */
-    return set_error(db);
-}
-
-void apr_dbm_freedatum(apr_dbm_t *db, apr_datum_t data)
-{
-#ifdef NEEDS_CLEANUP
-    (void) apr_run_cleanup(db->pool, data.dptr, datum_cleanup);
-#else
-    APR_DBM_FREEDPTR(data.dptr);
-#endif
-}
-
-/* XXX: This is wrong... need to return a canonical errcode as part
- * of this package, and follow the apr_dso_error prototype.
- */
-void apr_dbm_geterror(apr_dbm_t *db, int *errcode, const char **errmsg)
-{
-    *errcode = db->errcode;
-    *errmsg = db->errmsg;
-}
diff --git a/dbm/sdbm/.cvsignore b/dbm/sdbm/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/dbm/sdbm/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/dbm/sdbm/Makefile.in b/dbm/sdbm/Makefile.in
deleted file mode 100644
index 88b1557..0000000
--- a/dbm/sdbm/Makefile.in
+++ /dev/null
@@ -1,5 +0,0 @@
-
-TARGETS = sdbm.lo sdbm_hash.lo sdbm_lock.lo sdbm_pair.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/dbm/sdbm/sdbm.c b/dbm/sdbm/sdbm.c
deleted file mode 100644
index d765999..0000000
--- a/dbm/sdbm/sdbm.c
+++ /dev/null
@@ -1,613 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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: oz@nexus.yorku.ca
- * ex-public domain, ported to APR for Apache 2
- * core routines
- */
-
-#include "apr.h"
-#include "apr_file_io.h"
-#include "apr_strings.h"
-#include "apr_errno.h"
-#include "apr_sdbm.h"
-
-#include "sdbm_tune.h"
-#include "sdbm_pair.h"
-#include "sdbm_private.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->pagf);
-        }
-        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 */
-}
diff --git a/dbm/sdbm/sdbm_hash.c b/dbm/sdbm/sdbm_hash.c
deleted file mode 100644
index f7da717..0000000
--- a/dbm/sdbm/sdbm_hash.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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: oz@nexus.yorku.ca
- * status: ex-public domain. keep it that way.
- *
- * hashing routine
- */
-
-#include "apr_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;
-}
diff --git a/dbm/sdbm/sdbm_lock.c b/dbm/sdbm/sdbm_lock.c
deleted file mode 100644
index 9af6e05..0000000
--- a/dbm/sdbm/sdbm_lock.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 "apr_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);
-}
diff --git a/dbm/sdbm/sdbm_pair.c b/dbm/sdbm/sdbm_pair.c
deleted file mode 100644
index b9a6d30..0000000
--- a/dbm/sdbm/sdbm_pair.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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: oz@nexus.yorku.ca
- * status: ex-public domain.
- *
- * page-level routines
- */
-
-#include "apr_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;
-}
diff --git a/dbm/sdbm/sdbm_pair.h b/dbm/sdbm/sdbm_pair.h
deleted file mode 100644
index bd369f9..0000000
--- a/dbm/sdbm/sdbm_pair.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 */
-
diff --git a/dbm/sdbm/sdbm_private.h b/dbm/sdbm/sdbm_private.h
deleted file mode 100644
index 52227b2..0000000
--- a/dbm/sdbm/sdbm_private.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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: oz@nexus.yorku.ca
- */
-
-#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 */
diff --git a/dbm/sdbm/sdbm_tune.h b/dbm/sdbm/sdbm_tune.h
deleted file mode 100644
index 38fea10..0000000
--- a/dbm/sdbm/sdbm_tune.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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: oz@nexus.yorku.ca
- */
-
-#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 */
diff --git a/encoding/.cvsignore b/encoding/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/encoding/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/encoding/Makefile.in b/encoding/Makefile.in
deleted file mode 100644
index 182137d..0000000
--- a/encoding/Makefile.in
+++ /dev/null
@@ -1,5 +0,0 @@
-
-TARGETS = ap_base64.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/encoding/ap_base64.c b/encoding/ap_base64.c
deleted file mode 100644
index 15bcba6..0000000
--- a/encoding/ap_base64.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- *
- * Portions of this software are based upon public domain software
- * originally written at the National Center for Supercomputing Applications,
- * University of Illinois, Urbana-Champaign.
- */
-
-/* base64 encoder/decoder. Originally part of main/util.c
- * but moved here so that support/ab and ap_sha1.c could
- * use it. This meant removing the apr_palloc()s and adding
- * ugly 'len' functions, which is quite a nasty cost.
- */
-
-#include "ap_base64.h"
-#ifdef CHARSET_EBCDIC
-#include "apr_xlate.h"
-#endif				/* CHARSET_EBCDIC */
-
-/* aaaack but it's fast and const should make it shared text page. */
-static const unsigned char pr2six[256] =
-{
-#ifndef CHARSET_EBCDIC
-    /* ASCII table */
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
-    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
-    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
-#else /*CHARSET_EBCDIC*/
-    /* EBCDIC table */
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
-    64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
-    64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64,  0,  1,  2,  3,  4,  5,  6,  7,  8, 64, 64, 64, 64, 64, 64,
-    64,  9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
-    64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
-#endif /*CHARSET_EBCDIC*/
-};
-
-#ifdef CHARSET_EBCDIC
-static apr_xlate_t *xlate_to_ebcdic;
-static unsigned char os_toascii[256];
-
-APR_DECLARE(apr_status_t) ap_base64init_ebcdic(apr_xlate_t *to_ascii,
-                                             apr_xlate_t *to_ebcdic)
-{
-    int i;
-    apr_size_t inbytes_left, outbytes_left;
-    apr_status_t rv;
-    int onoff;
-    
-    /* Only single-byte conversion is supported.
-     */
-    rv = apr_xlate_get_sb(to_ascii, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    rv = apr_xlate_get_sb(to_ebcdic, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    xlate_to_ebcdic = to_ebcdic;
-    for (i = 0; i < sizeof(os_toascii); i++) {
-        os_toascii[i] = i;
-    }
-    inbytes_left = outbytes_left = sizeof(os_toascii);
-    apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
-                          os_toascii, &outbytes_left);
-
-    return APR_SUCCESS;
-}
-#endif /*CHARSET_EBCDIC*/
-
-APR_DECLARE(int) ap_base64decode_len(const char *bufcoded)
-{
-    int nbytesdecoded;
-    register const unsigned char *bufin;
-    register int nprbytes;
-
-    bufin = (const unsigned char *) bufcoded;
-    while (pr2six[*(bufin++)] <= 63);
-
-    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
-
-    return nbytesdecoded + 1;
-}
-
-APR_DECLARE(int) ap_base64decode(char *bufplain, const char *bufcoded)
-{
-#ifdef CHARSET_EBCDIC
-    apr_size_t inbytes_left, outbytes_left;
-#endif				/* CHARSET_EBCDIC */
-    int len;
-    
-    len = ap_base64decode_binary((unsigned char *) bufplain, bufcoded);
-#ifdef CHARSET_EBCDIC
-    inbytes_left = outbytes_left = len;
-    apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
-                          bufplain, &outbytes_left);
-#endif				/* CHARSET_EBCDIC */
-    bufplain[len] = '\0';
-    return len;
-}
-
-/* This is the same as ap_base64decode() except on EBCDIC machines, where
- * the conversion of the output to ebcdic is left out.
- */
-APR_DECLARE(int) ap_base64decode_binary(unsigned char *bufplain,
-				   const char *bufcoded)
-{
-    int nbytesdecoded;
-    register const unsigned char *bufin;
-    register unsigned char *bufout;
-    register int nprbytes;
-
-    bufin = (const unsigned char *) bufcoded;
-    while (pr2six[*(bufin++)] <= 63);
-    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
-
-    bufout = (unsigned char *) bufplain;
-    bufin = (const unsigned char *) bufcoded;
-
-    while (nprbytes > 4) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
-	bufin += 4;
-	nprbytes -= 4;
-    }
-
-    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
-    if (nprbytes > 1) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
-    }
-    if (nprbytes > 2) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
-    }
-    if (nprbytes > 3) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
-    }
-
-    nbytesdecoded -= (4 - nprbytes) & 3;
-    return nbytesdecoded;
-}
-
-static const char basis_64[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-APR_DECLARE(int) ap_base64encode_len(int len)
-{
-    return ((len + 2) / 3 * 4) + 1;
-}
-
-APR_DECLARE(int) ap_base64encode(char *encoded, const char *string, int len)
-{
-#ifndef CHARSET_EBCDIC
-    return ap_base64encode_binary(encoded, (const unsigned char *) string, len);
-#else				/* CHARSET_EBCDIC */
-    int i;
-    char *p;
-
-    p = encoded;
-    for (i = 0; i < len - 2; i += 3) {
-	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
-	*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
-	                ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
-	*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
-	                ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
-	*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
-    }
-    if (i < len) {
-	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
-	if (i == (len - 1)) {
-	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
-	    *p++ = '=';
-	}
-	else {
-	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
-	                    ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
-	    *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
-	}
-	*p++ = '=';
-    }
-
-    *p++ = '\0';
-    return p - encoded;
-#endif				/* CHARSET_EBCDIC */
-}
-
-/* This is the same as ap_base64encode() except on EBCDIC machines, where
- * the conversion of the input to ascii is left out.
- */
-APR_DECLARE(int) ap_base64encode_binary(char *encoded,
-                                      const unsigned char *string, int len)
-{
-    int i;
-    char *p;
-
-    p = encoded;
-    for (i = 0; i < len - 2; i += 3) {
-	*p++ = basis_64[(string[i] >> 2) & 0x3F];
-	*p++ = basis_64[((string[i] & 0x3) << 4) |
-	                ((int) (string[i + 1] & 0xF0) >> 4)];
-	*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
-	                ((int) (string[i + 2] & 0xC0) >> 6)];
-	*p++ = basis_64[string[i + 2] & 0x3F];
-    }
-    if (i < len) {
-	*p++ = basis_64[(string[i] >> 2) & 0x3F];
-	if (i == (len - 1)) {
-	    *p++ = basis_64[((string[i] & 0x3) << 4)];
-	    *p++ = '=';
-	}
-	else {
-	    *p++ = basis_64[((string[i] & 0x3) << 4) |
-	                    ((int) (string[i + 1] & 0xF0) >> 4)];
-	    *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
-	}
-	*p++ = '=';
-    }
-
-    *p++ = '\0';
-    return p - encoded;
-}
diff --git a/encoding/apr_base64.c b/encoding/apr_base64.c
deleted file mode 100644
index 15bcba6..0000000
--- a/encoding/apr_base64.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- *
- * Portions of this software are based upon public domain software
- * originally written at the National Center for Supercomputing Applications,
- * University of Illinois, Urbana-Champaign.
- */
-
-/* base64 encoder/decoder. Originally part of main/util.c
- * but moved here so that support/ab and ap_sha1.c could
- * use it. This meant removing the apr_palloc()s and adding
- * ugly 'len' functions, which is quite a nasty cost.
- */
-
-#include "ap_base64.h"
-#ifdef CHARSET_EBCDIC
-#include "apr_xlate.h"
-#endif				/* CHARSET_EBCDIC */
-
-/* aaaack but it's fast and const should make it shared text page. */
-static const unsigned char pr2six[256] =
-{
-#ifndef CHARSET_EBCDIC
-    /* ASCII table */
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
-    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
-    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
-#else /*CHARSET_EBCDIC*/
-    /* EBCDIC table */
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
-    64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
-    64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
-    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
-    64,  0,  1,  2,  3,  4,  5,  6,  7,  8, 64, 64, 64, 64, 64, 64,
-    64,  9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
-    64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
-#endif /*CHARSET_EBCDIC*/
-};
-
-#ifdef CHARSET_EBCDIC
-static apr_xlate_t *xlate_to_ebcdic;
-static unsigned char os_toascii[256];
-
-APR_DECLARE(apr_status_t) ap_base64init_ebcdic(apr_xlate_t *to_ascii,
-                                             apr_xlate_t *to_ebcdic)
-{
-    int i;
-    apr_size_t inbytes_left, outbytes_left;
-    apr_status_t rv;
-    int onoff;
-    
-    /* Only single-byte conversion is supported.
-     */
-    rv = apr_xlate_get_sb(to_ascii, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    rv = apr_xlate_get_sb(to_ebcdic, &onoff);
-    if (rv) {
-        return rv;
-    }
-    if (!onoff) { /* If conversion is not single-byte-only */
-        return APR_EINVAL;
-    }
-    xlate_to_ebcdic = to_ebcdic;
-    for (i = 0; i < sizeof(os_toascii); i++) {
-        os_toascii[i] = i;
-    }
-    inbytes_left = outbytes_left = sizeof(os_toascii);
-    apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
-                          os_toascii, &outbytes_left);
-
-    return APR_SUCCESS;
-}
-#endif /*CHARSET_EBCDIC*/
-
-APR_DECLARE(int) ap_base64decode_len(const char *bufcoded)
-{
-    int nbytesdecoded;
-    register const unsigned char *bufin;
-    register int nprbytes;
-
-    bufin = (const unsigned char *) bufcoded;
-    while (pr2six[*(bufin++)] <= 63);
-
-    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
-
-    return nbytesdecoded + 1;
-}
-
-APR_DECLARE(int) ap_base64decode(char *bufplain, const char *bufcoded)
-{
-#ifdef CHARSET_EBCDIC
-    apr_size_t inbytes_left, outbytes_left;
-#endif				/* CHARSET_EBCDIC */
-    int len;
-    
-    len = ap_base64decode_binary((unsigned char *) bufplain, bufcoded);
-#ifdef CHARSET_EBCDIC
-    inbytes_left = outbytes_left = len;
-    apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
-                          bufplain, &outbytes_left);
-#endif				/* CHARSET_EBCDIC */
-    bufplain[len] = '\0';
-    return len;
-}
-
-/* This is the same as ap_base64decode() except on EBCDIC machines, where
- * the conversion of the output to ebcdic is left out.
- */
-APR_DECLARE(int) ap_base64decode_binary(unsigned char *bufplain,
-				   const char *bufcoded)
-{
-    int nbytesdecoded;
-    register const unsigned char *bufin;
-    register unsigned char *bufout;
-    register int nprbytes;
-
-    bufin = (const unsigned char *) bufcoded;
-    while (pr2six[*(bufin++)] <= 63);
-    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
-    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
-
-    bufout = (unsigned char *) bufplain;
-    bufin = (const unsigned char *) bufcoded;
-
-    while (nprbytes > 4) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
-	bufin += 4;
-	nprbytes -= 4;
-    }
-
-    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
-    if (nprbytes > 1) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
-    }
-    if (nprbytes > 2) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
-    }
-    if (nprbytes > 3) {
-	*(bufout++) =
-	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
-    }
-
-    nbytesdecoded -= (4 - nprbytes) & 3;
-    return nbytesdecoded;
-}
-
-static const char basis_64[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-APR_DECLARE(int) ap_base64encode_len(int len)
-{
-    return ((len + 2) / 3 * 4) + 1;
-}
-
-APR_DECLARE(int) ap_base64encode(char *encoded, const char *string, int len)
-{
-#ifndef CHARSET_EBCDIC
-    return ap_base64encode_binary(encoded, (const unsigned char *) string, len);
-#else				/* CHARSET_EBCDIC */
-    int i;
-    char *p;
-
-    p = encoded;
-    for (i = 0; i < len - 2; i += 3) {
-	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
-	*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
-	                ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
-	*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
-	                ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
-	*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
-    }
-    if (i < len) {
-	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
-	if (i == (len - 1)) {
-	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
-	    *p++ = '=';
-	}
-	else {
-	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
-	                    ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
-	    *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
-	}
-	*p++ = '=';
-    }
-
-    *p++ = '\0';
-    return p - encoded;
-#endif				/* CHARSET_EBCDIC */
-}
-
-/* This is the same as ap_base64encode() except on EBCDIC machines, where
- * the conversion of the input to ascii is left out.
- */
-APR_DECLARE(int) ap_base64encode_binary(char *encoded,
-                                      const unsigned char *string, int len)
-{
-    int i;
-    char *p;
-
-    p = encoded;
-    for (i = 0; i < len - 2; i += 3) {
-	*p++ = basis_64[(string[i] >> 2) & 0x3F];
-	*p++ = basis_64[((string[i] & 0x3) << 4) |
-	                ((int) (string[i + 1] & 0xF0) >> 4)];
-	*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
-	                ((int) (string[i + 2] & 0xC0) >> 6)];
-	*p++ = basis_64[string[i + 2] & 0x3F];
-    }
-    if (i < len) {
-	*p++ = basis_64[(string[i] >> 2) & 0x3F];
-	if (i == (len - 1)) {
-	    *p++ = basis_64[((string[i] & 0x3) << 4)];
-	    *p++ = '=';
-	}
-	else {
-	    *p++ = basis_64[((string[i] & 0x3) << 4) |
-	                    ((int) (string[i + 1] & 0xF0) >> 4)];
-	    *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
-	}
-	*p++ = '=';
-    }
-
-    *p++ = '\0';
-    return p - encoded;
-}
diff --git a/hooks/.cvsignore b/hooks/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/hooks/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/hooks/Makefile.in b/hooks/Makefile.in
deleted file mode 100644
index 247f7bc..0000000
--- a/hooks/Makefile.in
+++ /dev/null
@@ -1,5 +0,0 @@
-
-TARGETS = ap_hooks.lo
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/hooks/ap_hooks.c b/hooks/ap_hooks.c
deleted file mode 100644
index 5044cdc..0000000
--- a/hooks/ap_hooks.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "apr_pools.h"
-#include "apr_tables.h"
-#include "apr.h"
-#include "ap_hooks.h"
-
-
-#if 0
-#define apr_palloc(pool,size)	malloc(size)
-#endif
-
-APR_DECLARE_DATA apr_pool_t *ap_global_hook_pool = NULL;
-APR_DECLARE_DATA int ap_debug_module_hooks = 0;
-APR_DECLARE_DATA const char *ap_debug_module_name = NULL;
-
-/* NB: This must echo the LINK_##name structure */
-typedef struct
-{
-    void (*dummy)(void *);
-    const char *szName;
-    const char * const *aszPredecessors;
-    const char * const *aszSuccessors;
-    int nOrder;
-} TSortData;
-
-typedef struct tsort_
-{
-    void *pData;
-    int nPredecessors;
-    struct tsort_ **ppPredecessors;
-    struct tsort_ *pNext;
-} TSort;
-
-static int crude_order(const void *a_,const void *b_)
-{
-    const TSortData *a=a_;
-    const TSortData *b=b_;
-
-    return a->nOrder-b->nOrder;
-}
-
-static TSort *prepare(apr_pool_t *p,TSortData *pItems,int nItems)
-{
-    TSort *pData=apr_palloc(p,nItems*sizeof *pData);
-    int n;
-    
-    qsort(pItems,nItems,sizeof *pItems,crude_order);
-    for(n=0 ; n < nItems ; ++n) {
-	pData[n].nPredecessors=0;
-	pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
-	pData[n].pNext=NULL;
-	pData[n].pData=&pItems[n];
-    }
-
-    for(n=0 ; n < nItems ; ++n) {
-	int i,k;
-
-	for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
-	    for(k=0 ; k < nItems ; ++k)
-		if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
-		    int l;
-
-		    for(l=0 ; l < pData[n].nPredecessors ; ++l)
-			if(pData[n].ppPredecessors[l] == &pData[k])
-			    goto got_it;
-		    pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
-		    ++pData[n].nPredecessors;
-		got_it:
-		    break;
-		}
-	for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
-	    for(k=0 ; k < nItems ; ++k)
-		if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
-		    int l;
-
-		    for(l=0 ; l < pData[k].nPredecessors ; ++l)
-			if(pData[k].ppPredecessors[l] == &pData[n])
-			    goto got_it2;
-		    pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
-		    ++pData[k].nPredecessors;
-		got_it2:
-		    break;
-		}
-    }
-
-    return pData;
-}
-
-static TSort *tsort(TSort *pData,int nItems)
-{
-    int nTotal;
-    TSort *pHead=NULL;
-    TSort *pTail=NULL;
-
-    for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
-	int n,i,k;
-
-	for(n=0 ; ; ++n) {
-	    if(n == nItems)
-		assert(0);      /* // we have a loop... */
-	    if(!pData[n].pNext && !pData[n].nPredecessors)
-		break;
-	}
-	if(pTail)
-	    pTail->pNext=&pData[n];
-	else
-	    pHead=&pData[n];
-	pTail=&pData[n];
-	pTail->pNext=pTail;     /* // fudge it so it looks linked */
-	for(i=0 ; i < nItems ; ++i)
-	    for(k=0 ; pData[i].ppPredecessors[k] ; ++k)
-		if(pData[i].ppPredecessors[k] == &pData[n]) {
-		    --pData[i].nPredecessors;
-		    break;
-		}
-    }
-    pTail->pNext=NULL;  /* // unfudge the tail */
-    return pHead;
-}
-
-static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,const char *szName)
-{
-    apr_pool_t *p;
-    TSort *pSort;
-    apr_array_header_t *pNew;
-    int n;
-
-    apr_create_pool(&p, ap_global_hook_pool);
-    pSort=prepare(p,(TSortData *)pHooks->elts,pHooks->nelts);
-    pSort=tsort(pSort,pHooks->nelts);
-    pNew=apr_make_array(ap_global_hook_pool,pHooks->nelts,sizeof(TSortData));
-    if(ap_debug_module_hooks)
-	printf("Sorting %s:",szName);
-    for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
-	TSortData *pHook;
-	assert(n < pHooks->nelts);
-	pHook=apr_push_array(pNew);
-	memcpy(pHook,pSort->pData,sizeof *pHook);
-	if(ap_debug_module_hooks)
-	    printf(" %s",pHook->szName);
-    }
-    if(ap_debug_module_hooks)
-	fputc('\n',stdout);
-    return pNew;
-}
-
-static apr_array_header_t *s_aHooksToSort;
-typedef struct
-{
-    const char *szHookName;
-    apr_array_header_t **paHooks;
-} HookSortEntry;
-
-APR_DECLARE(void) ap_hook_sort_register(const char *szHookName,
-                                      apr_array_header_t **paHooks)
-{
-    HookSortEntry *pEntry;
-
-    if(!s_aHooksToSort)
-	s_aHooksToSort=apr_make_array(ap_global_hook_pool,1,sizeof(HookSortEntry));
-    pEntry=apr_push_array(s_aHooksToSort);
-    pEntry->szHookName=szHookName;
-    pEntry->paHooks=paHooks;
-}
-
-APR_DECLARE(void) ap_sort_hooks()
-{
-    int n;
-
-    for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
-	HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
-	*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
-    }
-}
-    
-APR_DECLARE(void) ap_hook_deregister_all(void)
-{
-    int n;    
-
-    for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
-        HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
-        *pEntry->paHooks=NULL;
-    }
-    s_aHooksToSort=NULL;
-}
-
-APR_DECLARE(void) ap_show_hook(const char *szName,const char * const *aszPre,
-		             const char * const *aszSucc)
-{
-    int nFirst;
-
-    printf("  Hooked %s",szName);
-    if(aszPre) {
-	fputs(" pre(",stdout);
-	nFirst=1;
-	while(*aszPre) {
-	    if(!nFirst)
-		fputc(',',stdout);
-	    nFirst=0;
-	    fputs(*aszPre,stdout);
-	    ++aszPre;
-	}
-	fputc(')',stdout);
-    }
-    if(aszSucc) {
-	fputs(" succ(",stdout);
-	nFirst=1;
-	while(*aszSucc) {
-	    if(!nFirst)
-		fputc(',',stdout);
-	    nFirst=0;
-	    fputs(*aszSucc,stdout);
-	    ++aszSucc;
-	}
-	fputc(')',stdout);
-    }
-    fputc('\n',stdout);
-}
-
-#if 0
-void main()
-{
-    const char *aszAPre[]={"b","c",NULL};
-    const char *aszBPost[]={"a",NULL};
-    const char *aszCPost[]={"b",NULL};
-    TSortData t1[]=
-    {
-	{ "a",aszAPre,NULL },
-	{ "b",NULL,aszBPost },
-	{ "c",NULL,aszCPost }
-    };
-    TSort *pResult;
-
-    pResult=prepare(t1,3);
-    pResult=tsort(pResult,3);
-
-    for( ; pResult ; pResult=pResult->pNext)
-	printf("%s\n",pResult->pData->szName);
-}
-#endif
diff --git a/hooks/apr_hooks.c b/hooks/apr_hooks.c
deleted file mode 100644
index 5044cdc..0000000
--- a/hooks/apr_hooks.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "apr_pools.h"
-#include "apr_tables.h"
-#include "apr.h"
-#include "ap_hooks.h"
-
-
-#if 0
-#define apr_palloc(pool,size)	malloc(size)
-#endif
-
-APR_DECLARE_DATA apr_pool_t *ap_global_hook_pool = NULL;
-APR_DECLARE_DATA int ap_debug_module_hooks = 0;
-APR_DECLARE_DATA const char *ap_debug_module_name = NULL;
-
-/* NB: This must echo the LINK_##name structure */
-typedef struct
-{
-    void (*dummy)(void *);
-    const char *szName;
-    const char * const *aszPredecessors;
-    const char * const *aszSuccessors;
-    int nOrder;
-} TSortData;
-
-typedef struct tsort_
-{
-    void *pData;
-    int nPredecessors;
-    struct tsort_ **ppPredecessors;
-    struct tsort_ *pNext;
-} TSort;
-
-static int crude_order(const void *a_,const void *b_)
-{
-    const TSortData *a=a_;
-    const TSortData *b=b_;
-
-    return a->nOrder-b->nOrder;
-}
-
-static TSort *prepare(apr_pool_t *p,TSortData *pItems,int nItems)
-{
-    TSort *pData=apr_palloc(p,nItems*sizeof *pData);
-    int n;
-    
-    qsort(pItems,nItems,sizeof *pItems,crude_order);
-    for(n=0 ; n < nItems ; ++n) {
-	pData[n].nPredecessors=0;
-	pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
-	pData[n].pNext=NULL;
-	pData[n].pData=&pItems[n];
-    }
-
-    for(n=0 ; n < nItems ; ++n) {
-	int i,k;
-
-	for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
-	    for(k=0 ; k < nItems ; ++k)
-		if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
-		    int l;
-
-		    for(l=0 ; l < pData[n].nPredecessors ; ++l)
-			if(pData[n].ppPredecessors[l] == &pData[k])
-			    goto got_it;
-		    pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
-		    ++pData[n].nPredecessors;
-		got_it:
-		    break;
-		}
-	for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
-	    for(k=0 ; k < nItems ; ++k)
-		if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
-		    int l;
-
-		    for(l=0 ; l < pData[k].nPredecessors ; ++l)
-			if(pData[k].ppPredecessors[l] == &pData[n])
-			    goto got_it2;
-		    pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
-		    ++pData[k].nPredecessors;
-		got_it2:
-		    break;
-		}
-    }
-
-    return pData;
-}
-
-static TSort *tsort(TSort *pData,int nItems)
-{
-    int nTotal;
-    TSort *pHead=NULL;
-    TSort *pTail=NULL;
-
-    for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
-	int n,i,k;
-
-	for(n=0 ; ; ++n) {
-	    if(n == nItems)
-		assert(0);      /* // we have a loop... */
-	    if(!pData[n].pNext && !pData[n].nPredecessors)
-		break;
-	}
-	if(pTail)
-	    pTail->pNext=&pData[n];
-	else
-	    pHead=&pData[n];
-	pTail=&pData[n];
-	pTail->pNext=pTail;     /* // fudge it so it looks linked */
-	for(i=0 ; i < nItems ; ++i)
-	    for(k=0 ; pData[i].ppPredecessors[k] ; ++k)
-		if(pData[i].ppPredecessors[k] == &pData[n]) {
-		    --pData[i].nPredecessors;
-		    break;
-		}
-    }
-    pTail->pNext=NULL;  /* // unfudge the tail */
-    return pHead;
-}
-
-static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,const char *szName)
-{
-    apr_pool_t *p;
-    TSort *pSort;
-    apr_array_header_t *pNew;
-    int n;
-
-    apr_create_pool(&p, ap_global_hook_pool);
-    pSort=prepare(p,(TSortData *)pHooks->elts,pHooks->nelts);
-    pSort=tsort(pSort,pHooks->nelts);
-    pNew=apr_make_array(ap_global_hook_pool,pHooks->nelts,sizeof(TSortData));
-    if(ap_debug_module_hooks)
-	printf("Sorting %s:",szName);
-    for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
-	TSortData *pHook;
-	assert(n < pHooks->nelts);
-	pHook=apr_push_array(pNew);
-	memcpy(pHook,pSort->pData,sizeof *pHook);
-	if(ap_debug_module_hooks)
-	    printf(" %s",pHook->szName);
-    }
-    if(ap_debug_module_hooks)
-	fputc('\n',stdout);
-    return pNew;
-}
-
-static apr_array_header_t *s_aHooksToSort;
-typedef struct
-{
-    const char *szHookName;
-    apr_array_header_t **paHooks;
-} HookSortEntry;
-
-APR_DECLARE(void) ap_hook_sort_register(const char *szHookName,
-                                      apr_array_header_t **paHooks)
-{
-    HookSortEntry *pEntry;
-
-    if(!s_aHooksToSort)
-	s_aHooksToSort=apr_make_array(ap_global_hook_pool,1,sizeof(HookSortEntry));
-    pEntry=apr_push_array(s_aHooksToSort);
-    pEntry->szHookName=szHookName;
-    pEntry->paHooks=paHooks;
-}
-
-APR_DECLARE(void) ap_sort_hooks()
-{
-    int n;
-
-    for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
-	HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
-	*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
-    }
-}
-    
-APR_DECLARE(void) ap_hook_deregister_all(void)
-{
-    int n;    
-
-    for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
-        HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
-        *pEntry->paHooks=NULL;
-    }
-    s_aHooksToSort=NULL;
-}
-
-APR_DECLARE(void) ap_show_hook(const char *szName,const char * const *aszPre,
-		             const char * const *aszSucc)
-{
-    int nFirst;
-
-    printf("  Hooked %s",szName);
-    if(aszPre) {
-	fputs(" pre(",stdout);
-	nFirst=1;
-	while(*aszPre) {
-	    if(!nFirst)
-		fputc(',',stdout);
-	    nFirst=0;
-	    fputs(*aszPre,stdout);
-	    ++aszPre;
-	}
-	fputc(')',stdout);
-    }
-    if(aszSucc) {
-	fputs(" succ(",stdout);
-	nFirst=1;
-	while(*aszSucc) {
-	    if(!nFirst)
-		fputc(',',stdout);
-	    nFirst=0;
-	    fputs(*aszSucc,stdout);
-	    ++aszSucc;
-	}
-	fputc(')',stdout);
-    }
-    fputc('\n',stdout);
-}
-
-#if 0
-void main()
-{
-    const char *aszAPre[]={"b","c",NULL};
-    const char *aszBPost[]={"a",NULL};
-    const char *aszCPost[]={"b",NULL};
-    TSortData t1[]=
-    {
-	{ "a",aszAPre,NULL },
-	{ "b",NULL,aszBPost },
-	{ "c",NULL,aszCPost }
-    };
-    TSort *pResult;
-
-    pResult=prepare(t1,3);
-    pResult=tsort(pResult,3);
-
-    for( ; pResult ; pResult=pResult->pNext)
-	printf("%s\n",pResult->pData->szName);
-}
-#endif
diff --git a/include/apr_base64.h b/include/apr_base64.h
deleted file mode 100644
index 56050f7..0000000
--- a/include/apr_base64.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- *
- * The apr_vsnprintf/apr_snprintf functions are based on, and used with the
- * permission of, the  SIO stdio-replacement strx_* functions by Panos
- * Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
- */
-
-#ifndef APACHE_BASE64_H
-#define APACHE_BASE64_H
-
-#include "apr_general.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @package Base64 Encoding
- */
-
-/* Simple BASE64 encode/decode functions.
- * 
- * As we might encode binary strings, hence we require the length of
- * the incoming plain source. And return the length of what we decoded.
- *
- * The decoding function takes any non valid char (i.e. whitespace, \0
- * or anything non A-Z,0-9 etc as terminal.
- * 
- * plain strings/binary sequences are not assumed '\0' terminated. Encoded
- * strings are neither. But probably should.
- *
- */
-
-/**
- * Given the length of an un-encrypted string, get the length of the 
- * encrypted string.
- * @param len the length of an unencrypted string.
- * @return the length of the string after it is encrypted
- * @deffunc int ap_base64encode_len(int len)
- */ 
-APR_DECLARE(int) ap_base64encode_len(int len);
-
-/**
- * Encode a text string using base64encoding.
- * @param coded_dst The destination string for the encoded string.
- * @param plain_src The original string in plain text
- * @param len_plain_src The length of the plain text string
- * @return the length of the encoded string
- * @deffunc int ap_base64encode(char *coded_dst, const char *plain_src, int len_plain_src)
- */ 
-APR_DECLARE(int) ap_base64encode(char * coded_dst, const char *plain_src,int len_plain_src);
-
-/**
- * Encode an EBCDIC string using base64encoding.
- * @param coded_dst The destination string for the encoded string.
- * @param plain_src The original string in plain text
- * @param len_plain_src The length of the plain text string
- * @return the length of the encoded string
- * @deffunc int ap_base64encode_binary(char *coded_dst, const char *plain_src, int len_plain_src)
- */ 
-APR_DECLARE(int) ap_base64encode_binary(char * coded_dst, const unsigned char *plain_src,int len_plain_src);
-
-/**
- * Determine the length of a plain text string given the encoded version
- * @param coded_src The encoded string
- * @return the length of the plain text string
- * @deffunc int ap_base64decode_len(const char *coded_src)
- */ 
-APR_DECLARE(int) ap_base64decode_len(const char * coded_src);
-
-/**
- * Decode a string to plain text
- * @param plain_dst The destination string for the plain text
- * @param coded_src The encoded string 
- * @return the length of the plain text string
- * @deffunc int ap_base64decode(char *plain_dst, const char *coded_src)
- */ 
-APR_DECLARE(int) ap_base64decode(char * plain_dst, const char *coded_src);
-
-/**
- * Decode an EBCDIC string to plain text
- * @param plain_dst The destination string for the plain text
- * @param coded_src The encoded string 
- * @return the length of the plain text string
- * @deffunc int ap_base64decode_binary(char *plain_dst, const char *coded_src)
- */ 
-APR_DECLARE(int) ap_base64decode_binary(unsigned char * plain_dst, const char *coded_src);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* !APACHE_BASE64_H */
diff --git a/include/apr_buckets.h b/include/apr_buckets.h
deleted file mode 100644
index b37faef..0000000
--- a/include/apr_buckets.h
+++ /dev/null
@@ -1,1117 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 AP_BUCKETS_H
-#define AP_BUCKETS_H
-
-#include "apr_network_io.h"
-#include "apr_file_io.h"
-#include "apr_general.h"
-#include "apr_mmap.h"
-#include "apr_errno.h"
-#include "ap_ring.h"
-#include "apr.h"
-#if APR_HAVE_SYS_UIO_H
-#include <sys/uio.h>	/* for struct iovec */
-#endif
-#if APR_HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-
-/**
- * @package Bucket Brigades
- */
-
-typedef enum {AP_BLOCK_READ, AP_NONBLOCK_READ} ap_read_type;
-
-/*
- * The one-sentence buzzword-laden overview: Bucket brigades represent
- * a complex data stream that can be passed through a layered IO
- * system without unnecessary copying. A longer overview follows...
- *
- * A bucket brigade is a doubly linked list of buckets, so we
- * aren't limited to inserting at the front and removing at the end.
- * Buckets are only passed around as members of a brigade, although
- * singleton buckets can occur for short periods of time.
- *
- * Buckets are data stores of varous types. They can refer to data in
- * memory, or part of a file or mmap area, or the output of a process,
- * etc. Buckets also have some type-dependent accessor functions:
- * read, split, copy, setaside, and destroy.
- *
- * read returns the address and size of the data in the bucket. If the
- * data isn't in memory then it is read in and the bucket changes type
- * so that it can refer to the new location of the data. If all the
- * data doesn't fit in the bucket then a new bucket is inserted into
- * the brigade to hold the rest of it.
- *
- * split divides the data in a bucket into two regions. After a split
- * the original bucket refers to the first part of the data and a new
- * bucket inserted into the brigade after the original bucket refers
- * to the second part of the data. Reference counts are maintained as
- * necessary.
- *
- * setaside ensures that the data in the bucket has a long enough
- * lifetime. Sometimes it is convenient to create a bucket referring
- * to data on the stack in the expectation that it will be consumed
- * (output to the network) before the stack is unwound. If that
- * expectation turns out not to be valid, the setaside function is
- * called to move the data somewhere safer.
- *
- * copy makes a duplicate of the bucket structure as long as it's
- * possible to have multiple references to a single copy of the
- * data itself.  Not all bucket types can be copied.
- *
- * destroy maintains the reference counts on the resources used by a
- * bucket and frees them if necessary.
- *
- * Note: all of the above functions have wrapper macros (ap_bucket_read(),
- * ap_bucket_destroy(), etc), and those macros should be used rather
- * than using the function pointers directly.
- *
- * To write a bucket brigade, they are first made into an iovec, so that we
- * don't write too little data at one time.  Currently we ignore compacting the
- * buckets into as few buckets as possible, but if we really want good
- * performance, then we need to compact the buckets before we convert to an
- * iovec, or possibly while we are converting to an iovec.
- */
-
-/**
- * Forward declaration of the main types.
- */
-
-typedef struct ap_bucket_brigade ap_bucket_brigade;
-
-typedef struct ap_bucket ap_bucket;
-
-typedef struct ap_bucket_type ap_bucket_type;
-struct ap_bucket_type {
-    /**
-     * The name of the bucket type
-     */
-    const char *name;
-    /** 
-     * The number of functions this bucket understands.  Can not be less than
-     * five.
-     */
-    int num_func;
-    /**
-     * Free the private data and any resources used by the bucket
-     *  (if they aren't shared with another bucket).
-     * @param data The private data pointer from the bucket to be destroyed
-     */
-    void (*destroy)(void *data);
-
-    /**
-     * Read the data from the bucket. This is guaranteed to be implemented
-     *  for all bucket types.
-     * @param b The bucket to read from
-     * @param str A place to store the data read.  Allocation should only be
-     *            done if absolutely necessary. 
-     * @param len The amount of data read.
-     * @param block Should this read function block if there is more data that
-     *              cannot be read immediately.
-     * @deffunc apr_status_t read(ap_bucket *b, const char **str, apr_size_t *len, ap_read_type block)
-     */
-    apr_status_t (*read)(ap_bucket *b, const char **str, apr_size_t *len, ap_read_type block);
-    
-    /**
-     * Make it possible to set aside the data. Buckets containing data that
-     *  dies when the stack is un-wound must convert the bucket into a heap
-     *  bucket. For most bucket types, though, this is a no-op and this
-     *  function will return APR_ENOTIMPL.
-     * @param e The bucket to convert
-     * @deffunc apr_status_t setaside(ap_bucket *e)
-     */
-    apr_status_t (*setaside)(ap_bucket *e);
-
-    /**
-     * Split one bucket in two at the specified position by duplicating
-     *  the bucket structure (not the data) and modifying any necessary
-     *  start/end/offset information.  If it's not possible to do this
-     *  for the bucket type (perhaps the length of the data is indeterminate,
-     *  as with pipe and socket buckets), then APR_ENOTIMPL is returned.
-     * @see ap_bucket_split_any().
-     * @param e The bucket to split
-     * @param point The offset of the first byte in the new bucket
-     * @deffunc apr_status_t split(ap_bucket *e, apr_off_t point)
-     */
-    apr_status_t (*split)(ap_bucket *e, apr_off_t point);
-
-    /**
-     * Copy the bucket structure (not the data), assuming that this is
-     *  possible for the bucket type. If it's not, APR_ENOTIMPL is returned.
-     * @param e The bucket to copy
-     * @param c Returns a pointer to the new bucket
-     * @deffunc apr_status_t copy
-     */
-    apr_status_t (*copy)(ap_bucket *e, ap_bucket **c);
-
-};
-
-/**
- * ap_bucket_t structures are allocated on the malloc() heap and
- * their lifetime is controlled by the parent ap_bucket_brigade
- * structure. Buckets can move from one brigade to another e.g. by
- * calling ap_brigade_concat(). In general the data in a bucket has
- * the same lifetime as the bucket and is freed when the bucket is
- * destroyed; if the data is shared by more than one bucket (e.g.
- * after a split) the data is freed when the last bucket goes away.
- */
-struct ap_bucket {
-    /** Links to the rest of the brigade */
-    AP_RING_ENTRY(ap_bucket) link;
-    /** The type of bucket.  */
-    const ap_bucket_type *type;
-    /** The length of the data in the bucket.  This could have been implemented
-     *  with a function, but this is an optimization, because the most
-     *  common thing to do will be to get the length.  If the length is unknown,
-     *  the value of this field will be -1.
-     */
-    apr_off_t length;
-    /** type-dependent data hangs off this pointer */
-    void *data;	
-};
-
-/** A list of buckets */
-struct ap_bucket_brigade {
-    /** The pool to associate the brigade with.  The data is not allocated out
-     *  of the pool, but a cleanup is registered with this pool.  If the 
-     *  brigade is destroyed by some mechanism other than pool destruction,
-     *  the destroying function is responsible for killing the cleanup.
-     */
-    apr_pool_t *p;
-    /** The buckets in the brigade are on this list. */
-    /*
-     * XXX: the ap_bucket_list structure doesn't actually need a name tag
-     * because it has no existence independent of struct ap_bucket_brigade;
-     * the ring macros are designed so that you can leave the name tag
-     * argument empty in this situation but apparently the Windows compiler
-     * doesn't like that.
-     */
-    AP_RING_HEAD(ap_bucket_list, ap_bucket) list;
-};
-
-/**
- * Wrappers around the RING macros to reduce the verbosity of the code
- * that handles bucket brigades.
- */
-/**
- * Determine if this bucket is the start of the list
- * @param b The bucket to test
- * @return true or false
- * @deffunc int AP_BRIGADE_SENTINEL(ap_bucket *b)
- */
-#define AP_BRIGADE_SENTINEL(b)	AP_RING_SENTINEL(&(b)->list, ap_bucket, link)
-
-/**
- * Determine if the bucket brigade is empty
- * @param b The brigade to check
- * @return true or false
- * @deffunc AP_BRIGADE_EMPTY(ap_bucket_brigade *b)
- */
-#define AP_BRIGADE_EMPTY(b)	AP_RING_EMPTY(&(b)->list, ap_bucket, link)
-
-/**
- * Return the first bucket in a brigade
- * @param b The brigade to query
- * @return The first bucket in the brigade
- * @deffunc ap_bucket *AP_BUCKET_FIRST(ap_bucket_brigade *b)
- */
-#define AP_BRIGADE_FIRST(b)	AP_RING_FIRST(&(b)->list)
-/**
- * Return the last bucket in a brigade
- * @param b The brigade to query
- * @return The last bucket in the brigade
- * @deffunc ap_bucket *AP_BUCKET_LAST(ap_bucket_brigade *b)
- */
-#define AP_BRIGADE_LAST(b)	AP_RING_LAST(&(b)->list)
-
-/**
- * Iterate through a bucket brigade
- * @param e The current bucket
- * @param b The brigade to iterate over
- * @tip This is the same as either:
- * <pre>
- *		e = AP_BUCKET_FIRST(b);
- * 		while (!AP_BUCKET_SENTINEL(e)) {
- *		    ...
- * 		    e = AP_BUCKET_NEXT(e);
- * 		}
- *     OR
- * 		for (e = AP_BUCKET_FIRST(b); !AP_BUCKET_SENTINEL(e); e = AP_BUCKET_NEXT(e)) {
- *		    ...
- * 		}
- * @deffunc void AP_BRIGADE_FOREACH(ap_bucket *e, ap_bucket_brigade *b)
- */
-#define AP_BRIGADE_FOREACH(e, b)					\
-	AP_RING_FOREACH((e), &(b)->list, ap_bucket, link)
-
-/**
- * Insert a list of buckets at the front of a brigade
- * @param b The brigade to add to
- * @param e The first bucket in a list of buckets to insert
- * @deffunc void AP_BRIGADE_INSERT_HEAD(ap_bucket_brigade *b, ap_bucket *e)
- */
-#define AP_BRIGADE_INSERT_HEAD(b, e)					\
-	AP_RING_INSERT_HEAD(&(b)->list, (e), ap_bucket, link)
-/**
- * Insert a list of buckets at the end of a brigade
- * @param b The brigade to add to
- * @param e The first bucket in a list of buckets to insert
- * @deffunc void AP_BRIGADE_INSERT_HEAD(ap_bucket_brigade *b, ap_bucket *e)
- */
-#define AP_BRIGADE_INSERT_TAIL(b, e)					\
-	AP_RING_INSERT_TAIL(&(b)->list, (e), ap_bucket, link)
-
-/**
- * Concatenate two brigades together
- * @param a The first brigade
- * @param b The second brigade
- * @deffunc void AP_BRIGADE_CONCAT(ap_bucket_brigade *a, ap_bucket_brigade *b)
- */
-#define AP_BRIGADE_CONCAT(a, b)						\
-	AP_RING_CONCAT(&(a)->list, &(b)->list, ap_bucket, link)
-
-/**
- * Insert a list of buckets before a specified bucket
- * @param a The buckets to insert
- * @param b The bucket to insert before
- * @deffunc void AP_BUCKET_INSERT_BEFORE(ap_bucket *a, ap_bucket *b)
- */
-#define AP_BUCKET_INSERT_BEFORE(a, b)					\
-	AP_RING_INSERT_BEFORE((a), (b), link)
-/**
- * Insert a list of buckets after a specified bucket
- * @param a The buckets to insert
- * @param b The bucket to insert after
- * @deffunc void AP_BUCKET_INSERT_AFTER(ap_bucket *a, ap_bucket *b)
- */
-#define AP_BUCKET_INSERT_AFTER(a, b)					\
-	AP_RING_INSERT_AFTER((a), (b), link)
-
-/**
- * Get the next bucket in the list
- * @param e The current bucket
- * @return The next bucket
- * @deffunc ap_bucket *AP_BUCKET_NEXT(ap_bucket *e)
- */
-#define AP_BUCKET_NEXT(e)	AP_RING_NEXT((e), link)
-/**
- * Get the previous bucket in the list
- * @param e The current bucket
- * @return The previous bucket
- * @deffunc ap_bucket *AP_BUCKET_PREV(ap_bucket *e)
- */
-#define AP_BUCKET_PREV(e)	AP_RING_PREV((e), link)
-
-/**
- * Remove a bucket from its bucket brigade
- * @param e The bucket to remove
- * @deffunc void AP_BUCKET_REMOVE(ap_bucket *e)
- */
-#define AP_BUCKET_REMOVE(e)	AP_RING_REMOVE((e), link)
-
-/**
- * Determine if a bucket is a FLUSH bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_FLUSH(ap_bucket *e)
- */
-#define AP_BUCKET_IS_FLUSH(e)       (e->type == &ap_flush_type)
-/**
- * Determine if a bucket is an EOS bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_EOS(ap_bucket *e)
- */
-#define AP_BUCKET_IS_EOS(e)         (e->type == &ap_eos_type)
-/**
- * Determine if a bucket is a FILE bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_FILE(ap_bucket *e)
- */
-#define AP_BUCKET_IS_FILE(e)        (e->type == &ap_file_type)
-/**
- * Determine if a bucket is a PIPE bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_PIPE(ap_bucket *e)
- */
-#define AP_BUCKET_IS_PIPE(e)        (e->type == &ap_pipe_type)
-/**
- * Determine if a bucket is a SOCKET bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_SOCKET(ap_bucket *e)
- */
-#define AP_BUCKET_IS_SOCKET(e)      (e->type == &ap_socket_type)
-/**
- * Determine if a bucket is a HEAP bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_HEAP(ap_bucket *e)
- */
-#define AP_BUCKET_IS_HEAP(e)        (e->type == &ap_heap_type)
-/**
- * Determine if a bucket is a TRANSIENT bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_TRANSIENT(ap_bucket *e)
- */
-#define AP_BUCKET_IS_TRANSIENT(e)   (e->type == &ap_transient_type)
-/**
- * Determine if a bucket is a IMMORTAL bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_IMMORTAL(ap_bucket *e)
- */
-#define AP_BUCKET_IS_IMMORTAL(e)    (e->type == &ap_immortal_type)
-/**
- * Determine if a bucket is a MMAP bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_MMAP(ap_bucket *e)
- */
-#define AP_BUCKET_IS_MMAP(e)        (e->type == &ap_mmap_type)
-/**
- * Determine if a bucket is a POOL bucket
- * @param e The bucket to inspect
- * @return true or false
- * @deffunc int AP_BUCKET_IS_POOL(ap_bucket *e)
- */
-#define AP_BUCKET_IS_POOL(e)        (e->type == &ap_pool_type)
-
-/*
- * General-purpose reference counting for the varous bucket types.
- *
- * Any bucket type that keeps track of the resources it uses (i.e.
- * most of them except for IMMORTAL, TRANSIENT, and EOS) needs to
- * attach a reference count to the resource so that it can be freed
- * when the last bucket that uses it goes away. Resource-sharing may
- * occur because of bucket splits or buckets that refer to globally
- * cached data. */
-
-typedef struct ap_bucket_refcount ap_bucket_refcount;
-/**
- * The structure used to manage the shared resource must start with an
- * ap_bucket_refcount which is updated by the general-purpose refcount
- * code. A pointer to the bucket-type-dependent private data structure
- * can be cast to a pointer to an ap_bucket_refcount and vice versa.
- */
-struct ap_bucket_refcount {
-    /** The number of references to this bucket */
-    int          refcount;
-};
-
-typedef struct ap_bucket_shared ap_bucket_shared;
-/**
- * The data pointer of a refcounted bucket points to an
- * ap_bucket_shared structure which describes the region of the shared
- * object that this bucket refers to. The ap_bucket_shared isn't a
- * fully-fledged bucket type: it is a utility type that proper bucket
- * types are based on.
- */
-struct ap_bucket_shared {
-    /** start of the data in the bucket relative to the private base pointer */
-    apr_off_t start;
-    /** end of the data in the bucket relative to the private base pointer */
-    apr_off_t end;
-    /** pointer to the real private data of the bucket,
-     * which starts with an ap_bucket_refcount */
-    void *data;
-};
-
-/*  *****  Non-reference-counted bucket types  *****  */
-
-
-typedef struct ap_bucket_simple ap_bucket_simple;
-/**
- * TRANSIENT and IMMORTAL buckets don't have much to do with looking
- * after the memory that they refer to so they share a lot of their
- * implementation.
- */
-struct ap_bucket_simple {
-    /** The start of the data in the bucket */
-    const char    *start;
-    /** The end of the data in the bucket */
-    const char    *end;
-};
-
-typedef struct ap_bucket_pool ap_bucket_pool;
-/**
- * A bucket referring to data allocated out of a pool
- */
-struct ap_bucket_pool {
-    /** Number of buckets using this memory */
-    ap_bucket_refcount  refcount;
-    /** The start of the data actually allocated.  This should never be
-     * modified, it is only used to free the bucket.
-     */
-    const char *base;
-    /** The pool the data was allocated out of */
-    apr_pool_t  *p;
-    /** This is a hack, because we call ap_destroy_bucket with the ->data
-     *  pointer, so the pool cleanup needs to be registered with that pointer,
-     *  but the whole point of the cleanup is to convert the bucket to another
-     *  type.  To do that conversion, we need a pointer to the bucket itself.
-     *  This gives us a pointer to the original bucket.
-     */
-    ap_bucket *b;
-};
-
-/*  *****  Reference-counted bucket types  *****  */
-
-
-typedef struct ap_bucket_heap ap_bucket_heap;
-/**
- * A bucket referring to data allocated off the heap.
- */
-struct ap_bucket_heap {
-    /** Number of buckets using this memory */
-    ap_bucket_refcount  refcount;
-    /** The start of the data actually allocated.  This should never be
-     * modified, it is only used to free the bucket.
-     */
-    char    *base;
-    /** how much memory was allocated.  This may not be necessary */
-    size_t  alloc_len;
-};
-
-typedef struct ap_bucket_mmap ap_bucket_mmap;
-/**
- * A bucket referring to an mmap()ed file
- */
-struct ap_bucket_mmap {
-    /** Number of buckets using this memory */
-    ap_bucket_refcount  refcount;
-    /** The mmap this sub_bucket refers to */
-    apr_mmap_t *mmap;
-};
-
-typedef struct ap_bucket_file ap_bucket_file;
-/**
- * A bucket referring to an file
- */
-struct ap_bucket_file {
-    /** The file this bucket refers to */
-    apr_file_t *fd;
-    /** The offset into the file */
-    apr_off_t offset;
-};
-
-/*  *****  Bucket Brigade Functions  *****  */
-/**
- * Create a new bucket brigade.  The bucket brigade is originally empty.
- * @param The pool to associate with the brigade.  Data is not allocated out
- *        of the pool, but a cleanup is registered.
- * @return The empty bucket brigade
- * @deffunc ap_bucket_brigade *ap_brigade_create(apr_pool_t *p)
- */
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_create(apr_pool_t *p);
-
-/**
- * destroy an entire bucket brigade.  This includes destroying all of the
- * buckets within the bucket brigade's bucket list. 
- * @param b The bucket brigade to destroy
- * @deffunc apr_status_t ap_brigade_destroy(ap_bucket_brigade *b)
- */
-APR_DECLARE(apr_status_t) ap_brigade_destroy(ap_bucket_brigade *b);
-
-/**
- * Split a bucket brigade into two, such that the given bucket is the
- * first in the new bucket brigade. This function is useful when a
- * filter wants to pass only the initial part of a brigade to the next
- * filter.
- * @param b The brigade to split
- * @param e The first element of the new brigade
- * @return The new brigade
- * @deffunc ap_bucket_brigade *ap_brigade_split(ap_bucket_brigade *b, ap_bucket *e)
- */
-APR_DECLARE(ap_bucket_brigade *) ap_brigade_split(ap_bucket_brigade *b,
-						 ap_bucket *e);
-
-/**
- * Partition a bucket brigade at a given offset (in bytes from the start of
- * the brigade).  This is useful whenever a filter wants to use known ranges
- * of bytes from the brigade; the ranges can even overlap.
- * @param b The brigade to partition
- * @param point The offset at which to partition the brigade
- * @return A pointer to the first bucket after the partition;
- *         or NULL in any error condition (including partition past the end)
- * @deffunc ap_bucket *ap_brigade_partition(ap_bucket_brigade *b, apr_off_t point)
- */
-APR_DECLARE(ap_bucket *) ap_brigade_partition(ap_bucket_brigade *b, apr_off_t point);
-
-#if APR_NOT_DONE_YET
-/**
- * consume nbytes from beginning of b -- call ap_bucket_destroy as
- * appropriate, and/or modify start on last element 
- * @param b The brigade to consume data from
- * @param nbytes The number of bytes to consume
- * @deffunc void ap_brigade_consume(ap_bucket_brigade *b, int nbytes)
- */
-APR_DECLARE(void) ap_brigade_consume(ap_bucket_brigade *b, int nbytes);
-#endif
-
-/**
- * create an iovec of the elements in a bucket_brigade... return number 
- * of elements used.  This is useful for writing to a file or to the
- * network efficiently.
- * @param The bucket brigade to create the iovec out of
- * @param The iovec to create
- * @param The number of elements in the iovec
- * @return The number of iovec elements actually filled out.
- * @deffunc int ap_brigade_to_iovec(ap_bucket_brigade *b, struct iovec *vec, int nvec);
- */
-APR_DECLARE(int) ap_brigade_to_iovec(ap_bucket_brigade *b, 
-				    struct iovec *vec, int nvec);
-
-/**
- * This function writes a list of strings into a bucket brigade.  We just 
- * allocate a new heap bucket for each string.
- * @param b The bucket brigade to add to
- * @param va A list of strings to add
- * @return The number of bytes added to the brigade
- * @deffunc int ap_brigade_vputstrs(ap_bucket_brigade *b, va_list va)
- */
-APR_DECLARE(int) ap_brigade_vputstrs(ap_bucket_brigade *b, va_list va);
-
-/**
- * This function writes an unspecified number of strings into a bucket brigade.
- * We just allocate a new heap bucket for each string.
- * @param b The bucket brigade to add to
- * @param ... The strings to add
- * @return The number of bytes added to the brigade
- * @deffunc int ap_brigade_putstrs(ap_bucket_brigade *b, ...)
- */
-APR_DECLARE_NONSTD(int) ap_brigade_putstrs(ap_bucket_brigade *b, ...);
-
-/**
- * Evaluate a printf and put the resulting string into a bucket at the end 
- * of the bucket brigade.
- * @param b The brigade to write to
- * @param fmt The format of the string to write
- * @param ... The arguments to fill out the format
- * @return The number of bytes added to the brigade
- * @deffunc int ap_brigade_printf(ap_bucket_brigade *b, const char *fmt, ...) 
- */
-APR_DECLARE_NONSTD(int) ap_brigade_printf(ap_bucket_brigade *b, const char *fmt, ...);
-
-/**
- * Evaluate a printf and put the resulting string into a bucket at the end 
- * of the bucket brigade.
- * @param b The brigade to write to
- * @param fmt The format of the string to write
- * @param va The arguments to fill out the format
- * @return The number of bytes added to the brigade
- * @deffunc int ap_brigade_vprintf(ap_bucket_brigade *b, const char *fmt, va_list va) 
- */
-APR_DECLARE(int) ap_brigade_vprintf(ap_bucket_brigade *b, const char *fmt, va_list va);
-
-
-/*  *****  Bucket Functions  *****  */
-/**
- * Initialize the core implemented bucket types.  Once this is done,
- * it is possible to add new bucket types to the server
- * @param p The pool to allocate the array out of.
- * @deffunc void ap_init_bucket_types(apr_pool_t *p)
- */
-void ap_init_bucket_types(apr_pool_t *p);
-
-/**
- * free the resources used by a bucket. If multiple buckets refer to
- * the same resource it is freed when the last one goes away.
- * @param e The bucket to destroy
- * @deffunc void ap_bucket_destroy(ap_bucket *e)
- */
-#define ap_bucket_destroy(e) \
-    { \
-    e->type->destroy(e->data); \
-    free(e); \
-    }
-
-/**
- * read the data from the bucket
- * @param e The bucket to read from
- * @param str The location to store the data in
- * @param len The amount of data read
- * @param block Whether the read function blocks
- * @deffunc apr_status_t ap_bucket_read(ap_bucket *e, const char **str, apr_size_t *len, ap_read_type block)
- */
-#define ap_bucket_read(e,str,len,block) e->type->read(e, str, len, block)
-
-/**
- * Setaside data so that stack data is not destroyed on returning from
- * the function
- * @param e The bucket to setaside
- * @deffunc apr_status_t ap_bucket_setaside(ap_bucket *e)
- */
-#define ap_bucket_setaside(e) e->type->setaside(e)
-
-/**
- * Split one bucket in two.
- * @param e The bucket to split
- * @param point The offset to split the bucket at
- * @deffunc apr_status_t ap_bucket_split(ap_bucket *e, apr_off_t point)
- */
-#define ap_bucket_split(e,point) e->type->split(e, point)
-
-/**
- * Copy a bucket.
- * @param e The bucket to copy
- * @param c Returns a pointer to the new bucket
- * @deffunc apr_status_t ap_bucket_copy(ap_bucket *e, ap_bucket **c)
- */
-#define ap_bucket_copy(e,c) e->type->copy(e, c)
-
-/* Bucket type handling */
-
-/**
- * A place holder function that signifies that the setaside function was not
- * implemented for this bucket
- * @param data The bucket to setaside
- * @return APR_ENOTIMPL
- * @deffunc apr_status_t ap_bucket_setaside_notimpl(ap_bucket *data)
- */ 
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_setaside_notimpl(ap_bucket *data);
-/**
- * A place holder function that signifies that the split function was not
- * implemented for this bucket
- * @param data The bucket to split
- * @param point The location to split the bucket
- * @return APR_ENOTIMPL
- * @deffunc apr_status_t ap_bucket_split_notimpl(ap_bucket *data)
- */ 
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_notimpl(ap_bucket *data, 
-                                                 apr_off_t point);
-/**
- * A place holder function that signifies that the copy function was not
- * implemented for this bucket
- * @param e The bucket to copy
- * @param c Returns a pointer to the new bucket
- * @return APR_ENOTIMPL
- * @deffunc apr_status_t ap_bucket_copy_notimpl(ap_bucket *e, ap_bucket **c)
- */
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_notimpl(ap_bucket *e,
-                                                        ap_bucket **c);
-/**
- * A place holder function that signifies that the destroy function was not
- * implemented for this bucket
- * @param data The bucket to destroy
- * @deffunc void ap_bucket_destroy(ap_bucket *data)
- */ 
-APR_DECLARE_NONSTD(void) ap_bucket_destroy_notimpl(void *data);
-/* There is no ap_bucket_read_notimpl, because it is a required function
- */
-
-/**
- * Register a new bucket type
- * @param type The new bucket type to register
- * @return The offset into the array in which the bucket types are stored
- */
-int ap_insert_bucket_type(const ap_bucket_type *type);
-
-/* All of the bucket types implemented by the core */
-/**
- * The flush bucket type.  This signifies that all data should be flushed to
- * the next filter.  The flush bucket should be sent with the other buckets.
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_flush_type;
-/**
- * The EOS bucket type.  This signifies that there will be no more data, ever.
- * All filters MUST send all data to the next filter when they receive a
- * bucket of this type
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_eos_type;
-/**
- * The FILE bucket type.  This bucket represents a file on disk
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_file_type;
-/**
- * The HEAP bucket type.  This bucket represents a data allocated out of the
- * heap.
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_heap_type;
-/**
- * The MMAP bucket type.  This bucket represents an MMAP'ed file
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_mmap_type;
-/**
- * The POOL bucket type.  This bucket represents a data that was allocated
- * out of a pool.  IF this bucket is still available when the pool is cleared,
- * the data is copied on to the heap.
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_pool_type;
-/**
- * The PIPE bucket type.  This bucket represents a pipe to another program.
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_pipe_type;
-/**
- * The IMMORTAL bucket type.  This bucket represents a segment of data that
- * the creator is willing to take responsability for.  The core will do
- * nothing with the data in an immortal bucket
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_immortal_type;
-/**
- * The TRANSIENT bucket type.  This bucket represents a data allocated off
- * the stack.  When the setaside function is called, this data is copied on
- * to the heap
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_transient_type;
-/**
- * The SOCKET bucket type.  This bucket represents a socket to another machine
- */
-APR_DECLARE_DATA extern const ap_bucket_type ap_socket_type;
-
-
-/*  *****  Shared reference-counted buckets  *****  */
-
-/**
- * Initialize a bucket containing reference-counted data that may be
- * shared. The caller must allocate the bucket if necessary and
- * initialize its type-dependent fields, and allocate and initialize
- * its own private data structure. This function should only be called
- * by type-specific bucket creation functions.
- * @param b The bucket to initialize,
- *          or NULL if a new one should be allocated
- * @param data A pointer to the private data structure
- *             with the reference count at the start
- * @param start The start of the data in the bucket
- *              relative to the private base pointer
- * @param end The end of the data in the bucket
- *            relative to the private base pointer
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_shared(ap_bucket_refcount *r, apr_off_t start, apr_off_t end) 
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_shared(ap_bucket *b, void *data,
-					      apr_off_t start, apr_off_t end);
-
-/**
- * Decrement the refcount of the data in the bucket and free the
- * ap_bucket_shared structure. This function should only be called by
- * type-specific bucket destruction functions.
- * @param data The private data pointer from the bucket to be destroyed
- * @return NULL if nothing needs to be done,
- *         otherwise a pointer to the private data structure which
- *         must be destroyed because its reference count is zero
- * @deffunc void *ap_bucket_destroy_shared(ap_bucket *b)
- */
-APR_DECLARE(void *) ap_bucket_destroy_shared(void *data);
-
-/**
- * Split a bucket into two at the given point, and adjust the refcount
- * to the underlying data. Most reference-counting bucket types will
- * be able to use this function as their split function without any
- * additional type-specific handling.
- * @param b The bucket to be split
- * @param point The offset of the first byte in the new bucket
- * @return APR_EINVAL if the point is not within the bucket;
- *         APR_ENOMEM if allocation failed;
- *         or APR_SUCCESS
- * @deffunc apr_status_t ap_bucket_split_shared(ap_bucket *b, apr_off_t point)
- */
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_split_shared(ap_bucket *b, apr_off_t point);
-
-/**
- * Copy a refcounted bucket, incrementing the reference count. Most
- * reference-counting bucket types will be able to use this function
- * as their copy function without any additional type-specific handling.
- * @param a The bucket to copy
- * @param c Returns a pointer to the new bucket
- * @return APR_ENOMEM if allocation failed;
-           or APR_SUCCESS
- * @deffunc apr_status_t ap_bucket_copy_shared(ap_bucket *a, ap_bucket **c)
- */
-APR_DECLARE_NONSTD(apr_status_t) ap_bucket_copy_shared(ap_bucket *a, ap_bucket **c);
-
-
-/*  *****  Functions to Create Buckets of varying type  *****  */
-/*
- * Each bucket type foo has two initialization functions:
- * ap_bucket_make_foo which sets up some already-allocated memory as a
- * bucket of type foo; and ap_bucket_create_foo which allocates memory
- * for the bucket, calls ap_bucket_make_foo, and initializes the
- * bucket's list pointers. The ap_bucket_make_foo functions are used
- * inside the bucket code to change the type of buckets in place;
- * other code should call ap_bucket_create_foo. All the initialization
- * functions change nothing if they fail.
- */
-
-/*
- * This macro implements the guts of ap_bucket_create_foo
- */
-#define ap_bucket_do_create(do_make)		\
-    do {					\
-	ap_bucket *b, *ap__b;			\
-	b = calloc(1, sizeof(*b));		\
-	if (b == NULL) {			\
-	    return NULL;			\
-	}					\
-	ap__b = do_make;			\
-	if (ap__b == NULL) {			\
-	    free(b);				\
-	    return NULL;			\
-	}					\
-	AP_RING_ELEM_INIT(ap__b, link);		\
-	return ap__b;				\
-    } while(0)
-
-
-/**
- * Create an End of Stream bucket.  This indicates that there is no more data
- * coming from down the filter stack.  All filters should flush at this point.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_eos(void)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_eos(void);
-/**
- * Make the bucket passed in an EOS bucket.  This indicates that there is no 
- * more data coming from down the filter stack.  All filters should flush at 
- * this point.
- * @param b The bucket to make into an EOS bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_eos(ap_bucket *b)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_eos(ap_bucket *b);
-
-/**
- * Create a flush  bucket.  This indicates that filters should flush their
- * data.  There is no guarantee that they will flush it, but this is the
- * best we can do.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_flush(void)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_flush(void);
-/**
- * Make the bucket passed in a FLUSH  bucket.  This indicates that filters 
- * should flush their data.  There is no guarantee that they will flush it, 
- * but this is the best we can do.
- * @param b The bucket to make into a FLUSH bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_flush(ap_bucket *b)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_flush(ap_bucket *b);
-
-/**
- * Create a bucket referring to long-lived data.
- * @param buf The data to insert into the bucket
- * @param nbyte The size of the data to insert.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_transient(const char *buf, apr_size_t nbyte, apr_size_t *w)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_immortal(
-		const char *buf, apr_size_t nbyte);
-/**
- * Make the bucket passed in a bucket refer to long-lived data
- * @param b The bucket to make into a IMMORTAL bucket
- * @param buf The data to insert into the bucket
- * @param nbyte The size of the data to insert.
- * @param w The number of bytes added to the bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_immortal(ap_bucket *b, const char *buf, apr_size_t nbyte, apr_size_t *w)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_immortal(ap_bucket *b,
-		const char *buf, apr_size_t nbyte);
-
-/**
- * Create a bucket referring to data on the stack.
- * @param buf The data to insert into the bucket
- * @param nbyte The size of the data to insert.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_transient(const char *buf, apr_size_t nbyte, apr_size_t *w)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_transient(
-		const char *buf, apr_size_t nbyte);
-/**
- * Make the bucket passed in a bucket refer to stack data
- * @param b The bucket to make into a TRANSIENT bucket
- * @param buf The data to insert into the bucket
- * @param nbyte The size of the data to insert.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_transient(ap_bucket *b, const char *buf, apr_size_t nbyte)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_transient(ap_bucket *b,
-		const char *buf, apr_size_t nbyte);
-
-/**
- * Create a bucket referring to memory on the heap. If the caller asks
- * for the data to be copied, this function always allocates 4K of
- * memory so that more data can be added to the bucket without
- * requiring another allocation. Therefore not all the data may be put
- * into the bucket. If copying is not requested then the bucket takes
- * over responsibility for free()ing the memory.
- * @param buf The buffer to insert into the bucket
- * @param nbyte The size of the buffer to insert.
- * @param copy Whether to copy the data into newly-allocated memory or not
- * @param w The number of bytes actually copied into the bucket.
- *          If copy is zero then this return value can be ignored by passing a NULL pointer.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_heap(const char *buf, apr_size_t nbyte, int copy, apr_size_t *w)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_heap(
-		const char *buf, apr_size_t nbyte, int copy, apr_size_t *w);
-/**
- * Make the bucket passed in a bucket refer to heap data
- * @param b The bucket to make into a HEAP bucket
- * @param buf The buffer to insert into the bucket
- * @param nbyte The size of the buffer to insert.
- * @param copy Whether to copy the data into newly-allocated memory or not
- * @param w The number of bytes actually copied into the bucket.
- *          If copy is zero then this return value can be ignored by passing a NULL pointer.
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_heap(ap_bucket *b, const char *buf, apr_size_t nbyte, int copy, apr_size_t *w)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_heap(ap_bucket *b,
-		const char *buf, apr_size_t nbyte, int copy, apr_size_t *w);
-
-/**
- * Create a bucket referring to memory allocated out of a pool.
- * @param buf The buffer to insert into the bucket
- * @param p The pool the memory was allocated out of
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_pool(const char *buf, apr_size_t *length, apr_pool_t *p)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_pool(const char *buf,  
-                                            apr_size_t length, apr_pool_t *p);
-/**
- * Make the bucket passed in a bucket refer to pool data
- * @param b The bucket to make into a HEAP bucket
- * @param buf The buffer to insert into the bucket
- * @param p The pool the memory was allocated out of
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_pool(ap_bucket *b, const char *buf, apr_size_t *length, apr_pool_t *p)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_pool(ap_bucket *b,
-		const char *buf, apr_size_t length, apr_pool_t *p);
-
-/**
- * Create a bucket referring to mmap()ed memory.
- * @param mmap The mmap to insert into the bucket
- * @param start The offset of the first byte in the mmap
- *              that this bucket refers to
- * @param length The number of bytes referred to by this bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_mmap(const apr_mmap_t *mm, apr_size_t start, apr_size_t length)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_mmap(
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length);
-/**
- * Make the bucket passed in a bucket refer to an MMAP'ed file
- * @param b The bucket to make into a MMAP bucket
- * @param mmap The mmap to insert into the bucket
- * @param start The offset of the first byte in the mmap
- *              that this bucket refers to
- * @param length The number of bytes referred to by this bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_mmap(ap_bucket *b, const apr_mmap_t *mm, apr_size_t start, apr_size_t length)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_mmap(ap_bucket *b,
-		apr_mmap_t *mm, apr_off_t start, apr_size_t length);
-
-/**
- * Create a bucket referring to a socket.
- * @param thissocket The socket to put in the bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_socket(apr_socket_t *thissocket)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_socket(apr_socket_t *thissock);
-/**
- * Make the bucket passed in a bucket refer to a socket
- * @param b The bucket to make into a SOCKET bucket
- * @param thissocket The socket to put in the bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_socket(ap_bucket *b, apr_socket_t *thissocket)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_socket(ap_bucket *b, apr_socket_t *thissock);
-
-/**
- * Create a bucket referring to a pipe.
- * @param thispipe The pipe to put in the bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_pipe(apr_file_t *thispipe)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_pipe(apr_file_t *thispipe);
-/**
- * Make the bucket passed in a bucket refer to a pipe
- * @param b The bucket to make into a PIPE bucket
- * @param thispipe The pipe to put in the bucket
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_pipe(ap_bucket *b, apr_file_t *thispipe)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_pipe(ap_bucket *b, apr_file_t *thispipe);
-
-/**
- * Create a bucket referring to a file.
- * @param fd The file to put in the bucket
- * @param offset The offset where the data of interest begins in the file
- * @param len The amount of data in the file we are interested in
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_create_file(apr_file_t *fd, apr_off_t offset, apr_size_t len)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_create_file(apr_file_t *fd, apr_off_t offset, apr_size_t len);
-/**
- * Make the bucket passed in a bucket refer to a file
- * @param b The bucket to make into a FILE bucket
- * @param fd The file to put in the bucket
- * @param offset The offset where the data of interest begins in the file
- * @param len The amount of data in the file we are interested in
- * @return The new bucket, or NULL if allocation failed
- * @deffunc ap_bucket *ap_bucket_make_file(ap_bucket *b, apr_file_t *fd, apr_off_t offset, apr_size_t len)
- */
-APR_DECLARE(ap_bucket *) ap_bucket_make_file(ap_bucket *b, apr_file_t *fd, 
-                                            apr_off_t offset, apr_size_t len);
-
-#endif /* !AP_BUCKETS_H */
diff --git a/include/apr_dbm.h b/include/apr_dbm.h
deleted file mode 100644
index b3fb355..0000000
--- a/include/apr_dbm.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 APR_DBM_H
-#define APR_DBM_H
-
-#include "apr.h"
-#include "apr_errno.h"
-#include "apr_pools.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @package APR-UTIL DBM library
- */
-
-/**
- * Structure for referencing a dbm
- * @defvar apr_dbm_t
- */
-typedef struct apr_dbm_t apr_dbm_t;
-
-/**
- * Structure for referencing the datum record within a dbm
- * @defvar apr_datum_t
- */
-typedef struct
-{
-    char *dptr;
-    apr_size_t dsize;
-} apr_datum_t;
-
-/* modes to open the DB */
-#define APR_DBM_READONLY        1       /* open for read-only access */
-#define APR_DBM_READWRITE       2       /* open for read-write access */
-#define APR_DBM_RWCREATE        3       /* open for r/w, create if needed */
-
-/**
- * Open a dbm file by file name
- * @param dbm The newly opened database
- * @param name The dbm file name to open
- * @param mode The flag value
- * <PRE>
- *           APR_DBM_READONLY   open for read-only access
- *           APR_DBM_READWRITE  open for read-write access
- *           APR_DBM_RWCREATE   open for r/w, create if needed
- * </PRE>
- * @param cntxt The pool to use when creating the dbm
- * @tip The dbm name may not be a true file name, as many dbm packages
- * append suffixes for seperate data and index files.
- */
-apr_status_t apr_dbm_open(apr_dbm_t **dbm, const char *name, int mode,
-                          apr_pool_t *cntxt);
-/**
- * Close a dbm file previously opened by apr_dbm_open
- * @param dbm The database to close
- */
-void apr_dbm_close(apr_dbm_t *db);
-/**
- * Fetch a dbm record value by key
- * @param dbm The database 
- * @param key The key datum to find this record
- * @param value The value datum retrieved for this record
- */
-apr_status_t apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
-                           apr_datum_t *pvalue);
-/**
- * Store a dbm record value by key
- * @param dbm The database 
- * @param key The key datum to store this record by
- * @param value The value datum to store in this record
- */
-apr_status_t apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key, apr_datum_t value);
-/**
- * Delete a dbm record value by key
- * @param dbm The database 
- * @param key The key datum of the record to delete
- */
-apr_status_t apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key);
-/**
- * Search for a key within the dbm
- * @param dbm The database 
- * @param key The datum describing a key to test
- */
-int apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key);
-/**
- * Retrieve the first record key from a dbm
- * @param dbm The database 
- * @param key The key datum of the first record
- */
-apr_status_t apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey);
-/**
- * Retrieve the next record key from a dbm
- * @param dbm The database 
- * @param key The key datum of the next record
- */
-apr_status_t apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey);
-
-/* XXX: This is bogus.  If this is a pool-managed dbm wrapper, we
- * don't free datum.  If it isn't why pass pools? 
- */
-void apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data);
-
-/* XXX: Need to change errcode to be handled canonically, and modify
- * the prototype to follow apr_dso_error etc.
- */
-void apr_dbm_geterror(apr_dbm_t *dbm, int *errcode, const char **errmsg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* !APR_DBM_H */
-
-
diff --git a/include/apr_hooks.h b/include/apr_hooks.h
deleted file mode 100644
index a36b6ff..0000000
--- a/include/apr_hooks.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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 APACHE_AP_HOOKS_H
-#define APACHE_AP_HOOKS_H
-
-/* For apr_array_header_t */
-#include "apr_tables.h"
-
-/**
- * @package Apache hooks functions
- */
-
-#define AP_DECLARE_EXTERNAL_HOOK(link,ret,name,args) \
-typedef ret HOOK_##name args; \
-link##_DECLARE(void) ap_hook_##name(HOOK_##name *pf, const char* const* aszPre, \
-                                    const char * const *aszSucc, int nOrder); \
-link##_DECLARE(ret) ap_run_##name args; \
-typedef struct _LINK_##name \
-    { \
-    HOOK_##name *pFunc; \
-    const char *szName; \
-    const char * const *aszPredecessors; \
-    const char * const *aszSuccessors; \
-    int nOrder; \
-    } LINK_##name;
-
-#define AP_HOOK_STRUCT(members) \
-static struct { members } _hooks;
-
-#define AP_HOOK_LINK(name) \
-    apr_array_header_t *link_##name;
-
-#define AP_IMPLEMENT_EXTERNAL_HOOK_BASE(link,name) \
-link##_DECLARE(void) ap_hook_##name(HOOK_##name *pf,const char * const *aszPre, \
-                                    const char * const *aszSucc,int nOrder) \
-    { \
-    LINK_##name *pHook; \
-    if(!_hooks.link_##name) \
-	{ \
-	_hooks.link_##name=apr_make_array(ap_global_hook_pool,1,sizeof(LINK_##name)); \
-	ap_hook_sort_register(#name,&_hooks.link_##name); \
-	} \
-    pHook=apr_push_array(_hooks.link_##name); \
-    pHook->pFunc=pf; \
-    pHook->aszPredecessors=aszPre; \
-    pHook->aszSuccessors=aszSucc; \
-    pHook->nOrder=nOrder; \
-    pHook->szName=ap_debug_module_name; \
-    if(ap_debug_module_hooks) \
-	ap_show_hook(#name,aszPre,aszSucc); \
-    }
-
-/**
- * Implement a hook that has no return code, and therefore runs all of the
- * registered functions
- * @param link The linkage declaration prefix of the hook
- * @param name The name of the hook
- * @param args_decl The declaration of the arguments for the hook
- * @param args_used The names for the arguments for the hook
- * @deffunc void AP_IMPLEMENT_EXTERNAL_HOOK_VOID(link, name, args_decl, args_use)
- * @tip The link prefix FOO corresponds to FOO_DECLARE() macros, which
- * provide export linkage from the module that IMPLEMENTs the hook, and
- * import linkage from external modules that link to the hook's module.
- */
-#define AP_IMPLEMENT_EXTERNAL_HOOK_VOID(link,name,args_decl,args_use) \
-AP_IMPLEMENT_EXTERNAL_HOOK_BASE(link,name) \
-link##_DECLARE(void) ap_run_##name args_decl \
-    { \
-    LINK_##name *pHook; \
-    int n; \
-\
-    if(!_hooks.link_##name) \
-	return; \
-\
-    pHook=(LINK_##name *)_hooks.link_##name->elts; \
-    for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
-	pHook[n].pFunc args_use; \
-    }
-
-/* FIXME: note that this returns ok when nothing is run. I suspect it should
-   really return decline, but that breaks Apache currently - Ben
-*/
-/**
- * Implement a hook that runs until one of the functions returns something
- * other than OK or DECLINE
- * @param link The linkage declaration prefix of the hook
- * @param name The name of the hook
- * @param args_decl The declaration of the arguments for the hook
- * @param args_used The names for the arguments for the hook
- * @deffunc int AP_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(link, name, args_decl, args_use)
- * @tip The link prefix FOO corresponds to FOO_DECLARE() macros, which
- * provide export linkage from the module that IMPLEMENTs the hook, and
- * import linkage from external modules that link to the hook's module.
- */
-#define AP_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(link,ret,name,args_decl,args_use,ok,decline) \
-AP_IMPLEMENT_EXTERNAL_HOOK_BASE(link,name) \
-link##_DECLARE(ret) ap_run_##name args_decl \
-    { \
-    LINK_##name *pHook; \
-    int n; \
-    ret rv; \
-\
-    if(!_hooks.link_##name) \
-	return ok; \
-\
-    pHook=(LINK_##name *)_hooks.link_##name->elts; \
-    for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
-	{ \
-	rv=pHook[n].pFunc args_use; \
-\
-	if(rv != ok && rv != decline) \
-	    return rv; \
-	} \
-    return ok; \
-    }
-
-
-/**
- * Implement a hook that runs until the first function returns something
- * other than DECLINE
- * @param link The linkage declaration prefix of the hook
- * @param name The name of the hook
- * @param args_decl The declaration of the arguments for the hook
- * @param args_used The names for the arguments for the hook
- * @deffunc int AP_IMPLEMENT_HOOK_RUN_FIRST(link, name, args_decl, args_use)
- * @tip The link prefix FOO corresponds to FOO_DECLARE() macros, which
- * provide export linkage from the module that IMPLEMENTs the hook, and
- * import linkage from external modules that link to the hook's module.
- */
-#define AP_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(link,ret,name,args_decl,args_use,decline) \
-AP_IMPLEMENT_EXTERNAL_HOOK_BASE(link,name) \
-link##_DECLARE(ret) ap_run_##name args_decl \
-    { \
-    LINK_##name *pHook; \
-    int n; \
-    ret rv; \
-\
-    if(!_hooks.link_##name) \
-	return decline; \
-\
-    pHook=(LINK_##name *)_hooks.link_##name->elts; \
-    for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
-	{ \
-	rv=pHook[n].pFunc args_use; \
-\
-	if(rv != decline) \
-	    return rv; \
-	} \
-    return decline; \
-    }
-
-     /* Hook orderings */
-#define AP_HOOK_REALLY_FIRST	(-10)
-#define AP_HOOK_FIRST		0
-#define AP_HOOK_MIDDLE		10
-#define AP_HOOK_LAST		20
-#define AP_HOOK_REALLY_LAST	30
-
-/**
- * The global pool used to allocate any memory needed by the hooks.
- * @defvar apr_pool_t *ap_global_hook_pool
- */ 
-extern APR_DECLARE_DATA apr_pool_t *ap_global_hook_pool;
-
-/**
- * A global variable to determine if debugging information about the
- * hooks functions should be printed
- * @defvar apr_pool_t *ap_debug_module_hooks
- */ 
-extern APR_DECLARE_DATA int ap_debug_module_hooks;
-
-/**
- * The name of the module that is currently registering a function
- * @defvar apr_pool_t *ap_debug_module_name
- */ 
-extern APR_DECLARE_DATA const char *ap_debug_module_name;
-
-/**
- * Register a hook function to be sorted
- * @param szHookName The name of the Hook the function is registered for
- * @param aHooks The array which stores all of the functions for this hook
- * @deffunc void ap_hook_sort_register(const char *szHookName, ap_arry_header_t **aHooks)
- */
-APR_DECLARE(void) ap_hook_sort_register(const char *szHookName, 
-                                       apr_array_header_t **aHooks);
-/**
- * Sort all of the registerd functions for a given hook
- * @deffunc void ap_sort_hooks(void)
- */
-APR_DECLARE(void) ap_sort_hooks(void);
-
-/**
- * Print all of the information about the current hook.  This is used for
- * debugging purposes.
- * @param szName The name of the hook
- * @param aszPre All of the functions in the predecessor array
- * @param aszSucc All of the functions in the successor array
- * @deffunc void ap_show_hook(const char *szName, const char *const *aszPre, const char *const *aszSucc)
- */
-APR_DECLARE(void) ap_show_hook(const char *szName,const char * const *aszPre,
-                              const char * const *aszSucc);
-
-/**
- * Remove all currently registered functions.
- * @deffunc void ap_hook_deregister_all(void)
- */
-APR_DECLARE(void) ap_hook_deregister_all(void);
-
-#endif /* ndef(AP_HOOKS_H) */
diff --git a/include/apr_ring.h b/include/apr_ring.h
deleted file mode 100644
index 614c28e..0000000
--- a/include/apr_ring.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- */
-
-/*
- * This code draws heavily from the 4.4BSD <sys/queue.h> macros
- * and Dean Gaudet's "splim/ring.h".
- * <http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/queue.h>
- * <http://www.arctic.org/~dean/splim/>
- *
- * We'd use Dean's code directly if we could guarantee the
- * availability of inline functions.
- */
-
-#ifndef AP_RING_H
-#define AP_RING_H
-
-/*
- * for offsetof()
- */
-#include <stddef.h>
-
-/*
- * A ring is a kind of doubly-linked list that can be manipulated
- * without knowing where its head is.
- */
-
-/*
- * A struct on a ring contains a field linking it to the other
- * elements in the ring, e.g.
- *
- *      struct my_item_t {
- *          AP_RING_ENTRY(my_item_t) link;
- *          int foo;
- *          char *bar;
- *      };
- *
- * A struct may be put on more than one ring if it has more than one
- * AP_RING_ENTRY field.
- */
-#define AP_RING_ENTRY(elem)						\
-    struct {								\
-	struct elem *next;						\
-	struct elem *prev;						\
-    }
-
-/*
- * Each ring is managed via its head, which is a struct declared like this:
- *
- *      AP_RING_HEAD(my_ring_t, my_item_t);
- *      struct my_ring_t ring, *ringp;
- *
- * This struct looks just like the element link struct so that we can
- * be sure that the typecasting games will work as expected.
- *
- * The first element in the ring is next after the head, and the last
- * element is just before the head.
- */
-#define AP_RING_HEAD(head, elem)					\
-    struct head {							\
-	struct elem *next;						\
-	struct elem *prev;						\
-    }
-
-/*
- * The head itself isn't an element, but in order to get rid of all
- * the special cases when dealing with the ends of the ring, we play
- * typecasting games to make it look like one. The sentinel is the
- * magic pointer value that occurs before the first and after the last
- * elements in the ring, computed from the address of the ring's head.
- *
- * Note that for strict C standards compliance you should put the
- * AP_RING_ENTRY first in struct elem unless the head is always part
- * of a larger object with enough earlier fields to accommodate the
- * offsetof() computed below. You can usually ignore this caveat.
- */
-#define AP_RING_SENTINEL(hp, elem, link)				\
-    (struct elem *)((char *)(hp) - offsetof(struct elem, link))
-
-/*
- * Accessor macros. Use these rather than footling inside the
- * structures directly so that you can more easily change to a
- * different flavour of list from BSD's <sys/queue.h>.
- */
-#define AP_RING_FIRST(hp)	(hp)->next
-#define AP_RING_LAST(hp)	(hp)->prev
-#define AP_RING_NEXT(ep, link)	(ep)->link.next
-#define AP_RING_PREV(ep, link)	(ep)->link.prev
-
-/*
- * Empty rings and singleton elements.
- */
-#define AP_RING_INIT(hp, elem, link) do {				\
-	AP_RING_FIRST((hp)) = AP_RING_SENTINEL((hp), elem, link);	\
-	AP_RING_LAST((hp))  = AP_RING_SENTINEL((hp), elem, link);	\
-    } while (0)
-
-#define AP_RING_EMPTY(hp, elem, link)					\
-    (AP_RING_FIRST((hp)) == AP_RING_SENTINEL((hp), elem, link))
-
-#define AP_RING_ELEM_INIT(ep, link) do {				\
-	AP_RING_NEXT((ep), link) = (ep);				\
-	AP_RING_PREV((ep), link) = (ep);				\
-    } while (0)
-
-/*
- * Adding elements.
- */
-#define AP_RING_SPLICE_BEFORE(lep, ep1, epN, link) do {			\
-	AP_RING_NEXT((epN), link) = (lep);				\
-	AP_RING_PREV((ep1), link) = AP_RING_PREV((lep), link);		\
-	AP_RING_NEXT(AP_RING_PREV((lep), link), link) = (ep1);		\
-	AP_RING_PREV((lep), link) = (epN);				\
-    } while (0)
-
-#define AP_RING_SPLICE_AFTER(lep, ep1, epN, link) do {			\
-	AP_RING_PREV((ep1), link) = (lep);				\
-	AP_RING_NEXT((epN), link) = AP_RING_NEXT((lep), link);		\
-	AP_RING_PREV(AP_RING_NEXT((lep), link), link) = (epN);		\
-	AP_RING_NEXT((lep), link) = (ep1);				\
-    } while (0)
-
-#define AP_RING_INSERT_BEFORE(lep, nep, link)				\
-	AP_RING_SPLICE_BEFORE((lep), (nep), (nep), link)
-
-#define AP_RING_INSERT_AFTER(lep, nep, link)				\
-	AP_RING_SPLICE_AFTER((lep), (nep), (nep), link)
-
-/*
- * These macros work when the ring is empty: inserting before the head
- * or after the tail of an empty ring using the macros above doesn't work.
- */
-#define AP_RING_SPLICE_HEAD(hp, ep1, epN, elem, link)			\
-	AP_RING_SPLICE_AFTER(AP_RING_SENTINEL((hp), elem, link),	\
-			     (ep1), (epN), link)
-
-#define AP_RING_SPLICE_TAIL(hp, ep1, epN, elem, link)			\
-	AP_RING_SPLICE_BEFORE(AP_RING_SENTINEL((hp), elem, link),	\
-			     (ep1), (epN), link)
-
-#define AP_RING_INSERT_HEAD(hp, nep, elem, link)			\
-	AP_RING_SPLICE_HEAD((hp), (nep), (nep), elem, link)
-
-#define AP_RING_INSERT_TAIL(hp, nep, elem, link)			\
-	AP_RING_SPLICE_TAIL((hp), (nep), (nep), elem, link)
-
-/*
- * Concatenating ring h2 onto the end of ring h1 leaves h2 empty.
- */
-#define AP_RING_CONCAT(h1, h2, elem, link) do {				\
-	if (!AP_RING_EMPTY((h2), elem, link)) {				\
-	    AP_RING_SPLICE_BEFORE(AP_RING_SENTINEL((h1), elem, link),	\
-				  AP_RING_FIRST((h2)),			\
-				  AP_RING_LAST((h2)), link);		\
-	    AP_RING_INIT((h2), elem, link);				\
-	}								\
-    } while (0)
-
-/*
- * Removing elements. Be warned that the unspliced elements are left
- * with dangling pointers at either end!
- */
-#define AP_RING_UNSPLICE(ep1, epN, link) do {				\
-	AP_RING_NEXT(AP_RING_PREV((ep1), link), link) =			\
-		     AP_RING_NEXT((epN), link);				\
-	AP_RING_PREV(AP_RING_NEXT((epN), link), link) =			\
-		     AP_RING_PREV((ep1), link);				\
-    } while (0)
-
-#define AP_RING_REMOVE(ep, link)					\
-    AP_RING_UNSPLICE((ep), (ep), link)
-
-/*
- * Iteration.
- */
-#define AP_RING_FOREACH(ep, hp, elem, link)				\
-    for ((ep)  = AP_RING_FIRST((hp));					\
-	 (ep) != AP_RING_SENTINEL((hp), elem, link);			\
-	 (ep)  = AP_RING_NEXT((ep), link))
-
-#define AP_RING_FOREACH_REVERSE(ep, hp, elem, link)			\
-    for ((ep)  = AP_RING_LAST((hp));					\
-	 (ep) != AP_RING_SENTINEL((hp), elem, link);			\
-	 (ep)  = AP_RING_PREV((ep), link))
-
-#ifdef AP_RING_DEBUG
-#include <stdio.h>
-#define AP_RING_CHECK_ONE(msg, ptr)					\
-	fprintf(stderr, "*** %s %p\n", msg, ptr)
-#define AP_RING_CHECK(hp, elem, link, msg)				\
-	AP_RING_CHECK_ELEM(AP_RING_SENTINEL(hp, elem, link), elem, link, msg)
-#define AP_RING_CHECK_ELEM(ep, elem, link, msg) do {			\
-	struct elem *start = (ep);					\
-	struct elem *this = start;					\
-	fprintf(stderr, "*** ring check start -- %s\n", msg);		\
-	do {								\
-	    fprintf(stderr, "\telem %p\n", this);			\
-	    fprintf(stderr, "\telem->next %p\n",			\
-		    AP_RING_NEXT(this, link));				\
-	    fprintf(stderr, "\telem->prev %p\n",			\
-		    AP_RING_PREV(this, link));				\
-	    fprintf(stderr, "\telem->next->prev %p\n",			\
-		    AP_RING_PREV(AP_RING_NEXT(this, link), link));	\
-	    fprintf(stderr, "\telem->prev->next %p\n",			\
-		    AP_RING_NEXT(AP_RING_PREV(this, link), link));	\
-	    if (AP_RING_PREV(AP_RING_NEXT(this, link), link) != this) {	\
-		fprintf(stderr, "\t*** this->next->prev != this\n");	\
-		break;							\
-	    }								\
-	    if (AP_RING_NEXT(AP_RING_PREV(this, link), link) != this) {	\
-		fprintf(stderr, "\t*** this->prev->next != this\n");	\
-		break;							\
-	    }								\
-	    this = AP_RING_NEXT(this, link);				\
-	} while (this != start);					\
-	fprintf(stderr, "*** ring check end\n");			\
-    } while (0)
-#else
-#define AP_RING_CHECK_ONE(msg, ptr)
-#define AP_RING_CHECK(hp, elem, link, msg)
-#define AP_RING_CHECK_ELEM(ep, elem, link, msg)
-#endif
-
-#endif /* !AP_RING_H */
diff --git a/include/apr_sha1.h b/include/apr_sha1.h
deleted file mode 100644
index 96e3ab8..0000000
--- a/include/apr_sha1.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* ====================================================================
- * 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 apache@apache.org.
- *
- * 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/>.
- *
- * NIST Secure Hash Algorithm
- * 	heavily modified by Uwe Hollerbach uh@alumni.caltech edu
- * 	from Peter C. Gutmann's implementation as found in
- * 	Applied Cryptography by Bruce Schneier
- * 	This code is hereby placed in the public domain
- */
-
-#ifndef APACHE_SHA1_H
-#define APACHE_SHA1_H
-
-#include "apr_general.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @package SHA1 library
- */
-
-#define SHA_DIGESTSIZE 20
-
-/**
- * Define the Magic String prefix that identifies a password as being
- * hashed using our algorithm.
- * @defvar AP_SHA1PW_ID "{SHA}"
- */
-#define AP_SHA1PW_ID "{SHA}"
-#define AP_SHA1PW_IDLEN 5
-
-typedef struct AP_SHA1_CTX AP_SHA1_CTX;
-
-/**
- * SHA1 context structure
- */
-struct AP_SHA1_CTX {
-    /** message digest */
-    apr_uint32_t digest[5];
-    /** 64-bit bit counts */
-    apr_uint32_t count_lo, count_hi;
-    /** SHA data buffer */
-    apr_uint32_t data[16];
-    /** unprocessed amount in data */
-    int local;
-};
-
-/**
- * Provide a means to SHA1 crypt/encode a plaintext password in a way which
- * makes password file compatible with those commonly use in netscape web
- * and ldap installations.
- * @param clear The plaintext password
- * @param len The length of the plaintext password
- * @param out The encrypted/encoded password
- * @tip SHA1 support is useful for migration purposes, but is less
- *     secure than Apache's password format, since Apache's (MD5)
- *     password format uses a random eight character salt to generate
- *     one of many possible hashes for the same password.  Netscape
- *     uses plain SHA1 without a salt, so the same password
- *     will always generate the same hash, making it easier
- *     to break since the search space is smaller.
- * @deffunc void ap_sha1_base64(const char *clear, int len, char *out)
- */
-APR_DECLARE(void) ap_sha1_base64(const char *clear, int len, char *out);
-
-/**
- * Initialize the SHA digest
- * @param context The SHA context to initialize
- * @deffunc void ap_SHA1Init(AP_SHA1_CTX *context);
- */
-APR_DECLARE(void) ap_SHA1Init(AP_SHA1_CTX *context);
-
-/**
- * Update the SHA digest
- * @param context The SHA1 context to update
- * @param input The buffer to add to the SHA digest
- * @param inputLen The length of the input buffer
- * @deffunc void ap_SHA1Update(AP_SHA1_CTX *context, const char *input, unsigned int inputLen)
- */
-APR_DECLARE(void) ap_SHA1Update(AP_SHA1_CTX *context, const char *input,
-                              unsigned int inputLen);
-
-/**
- * Update the SHA digest with binary data
- * @param context The SHA1 context to update
- * @param input The buffer to add to the SHA digest
- * @param inputLen The length of the input buffer
- * @deffunc void ap_SHA1Update_binary(AP_SHA1_CTX *context, const unsigned char *input, unsigned int inputLen)
- */
-APR_DECLARE(void) ap_SHA1Update_binary(AP_SHA1_CTX *context,
-                                     const unsigned char *input,
-                                     unsigned int inputLen);
-
-/**
- * Finish computing the SHA digest
- * @param digest the output buffer in which to store the digest
- * @param context The context to finalize
- * @deffunc void ap_SHA1Final(unsigned char digest[SHA_DIGESTSIZE], AP_SHA1_CTX *context)
- */
-APR_DECLARE(void) ap_SHA1Final(unsigned char digest[SHA_DIGESTSIZE],
-                             AP_SHA1_CTX *context);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* !APACHE_SHA1_H */
diff --git a/libaprutil.def b/libaprutil.def
deleted file mode 100644
index 5b2a460..0000000
--- a/libaprutil.def
+++ /dev/null
@@ -1,63 +0,0 @@
-; aprutil.def :
-
-LIBRARY apr-util
-DESCRIPTION ''
-
-EXPORTS
-; Add new API calls to the end of this list.
-ap_SHA1Final
-ap_SHA1Init
-ap_SHA1Update
-ap_SHA1Update_binary
-ap_base64decode
-ap_base64decode_binary
-ap_base64decode_len
-ap_base64encode
-ap_base64encode_binary
-ap_base64encode_len
-ap_sha1_base64
-
-ap_init_bucket_types
-ap_bucket_create_pool
-ap_bucket_create_socket
-ap_bucket_create_transient
-ap_bucket_destroy_shared
-ap_bucket_make_shared
-ap_bucket_split_shared
-ap_bucket_create_eos
-ap_bucket_create_file
-ap_bucket_create_flush
-ap_bucket_create_heap
-ap_bucket_create_immortal
-ap_bucket_create_pipe
-ap_bucket_create_mmap
-ap_file_type
-ap_flush_type
-ap_pipe_type
-ap_eos_type
-ap_mmap_type
-
-ap_brigade_create
-ap_brigade_destroy
-ap_brigade_split
-ap_brigade_vprintf
-ap_brigade_vputstrs
-
-ap_debug_module_hooks
-ap_debug_module_name
-ap_global_hook_pool
-ap_hook_deregister_all
-ap_hook_sort_register
-ap_show_hook
-ap_sort_hooks
-
-apr_dbm_open
-apr_dbm_geterror
-apr_dbm_close
-apr_dbm_fetch
-apr_dbm_store
-apr_dbm_delete
-apr_dbm_exists
-apr_dbm_firstkey
-apr_dbm_nextkey
-apr_dbm_freedatum
diff --git a/libaprutil.dsp b/libaprutil.dsp
deleted file mode 100644
index 69e7d62..0000000
--- a/libaprutil.dsp
+++ /dev/null
@@ -1,100 +0,0 @@
-# Microsoft Developer Studio Project File - Name="aprutildll" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=aprutildll - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "aprutildll.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "aprutildll.mak" CFG="aprutildll - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "aprutildll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "aprutildll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "aprutildll - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
-# ADD CPP /nologo /MD /W3 /O2 /I "./include" /I "../apr/include" /I "./include/private" /I "./src/dbm/sdbm" /D "NDEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /Fd"Release\apr-utildll" /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib /nologo /base:"0x6ED0000" /subsystem:windows /dll /map /machine:I386 /out:"Release/apr-util.dll"
-# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib /nologo /base:"0x6ED0000" /subsystem:windows /dll /map /machine:I386 /out:"Release/apr-util.dll"
-
-!ELSEIF  "$(CFG)" == "aprutildll - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
-# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "./include" /I "../apr/include" /I "./include/private" /I "./src/dbm/sdbm" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /D "APU_USE_SDBM" /Fd"Debug\apr-utildll" /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib /nologo /base:"0x6ED0000" /subsystem:windows /dll /map /debug /machine:I386 /out:"Debug/apr-util.dll"
-# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib /nologo /base:"0x6ED00000" /subsystem:windows /dll /debug /machine:I386 /out:"Debug/apr-util.dll"
-# SUBTRACT LINK32 /incremental:no /map
-
-!ENDIF 
-
-# Begin Target
-
-# Name "aprutildll - Win32 Release"
-# Name "aprutildll - Win32 Debug"
-# Begin Source File
-
-SOURCE=.\src\misc\win32\aprutil.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\aprutil.def
-# End Source File
-# End Target
-# End Project
diff --git a/misc/win32/libaprutil.c b/misc/win32/libaprutil.c
deleted file mode 100644
index e807ac5..0000000
--- a/misc/win32/libaprutil.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Placeholder to force aprutil.dll creation with no LNK4001 error
- *
- * However, this isn't a bad place to store dynamic-only functions 
- * that determine which version of apr the application has loaded.
- * These functions are of (less?) importance to static-bound apps.
- */
diff --git a/src/misc/win32/libaprutil.c b/src/misc/win32/libaprutil.c
deleted file mode 100644
index e807ac5..0000000
--- a/src/misc/win32/libaprutil.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Placeholder to force aprutil.dll creation with no LNK4001 error
- *
- * However, this isn't a bad place to store dynamic-only functions 
- * that determine which version of apr the application has loaded.
- * These functions are of (less?) importance to static-bound apps.
- */
diff --git a/uri/.cvsignore b/uri/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/uri/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/uri/Makefile.in b/uri/Makefile.in
deleted file mode 100644
index 704d02c..0000000
--- a/uri/Makefile.in
+++ /dev/null
@@ -1,3 +0,0 @@
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
diff --git a/xml/.cvsignore b/xml/.cvsignore
deleted file mode 100644
index 2c9b930..0000000
--- a/xml/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-*.lo
-*.la
-.libs
diff --git a/xml/Makefile.in b/xml/Makefile.in
deleted file mode 100644
index 704d02c..0000000
--- a/xml/Makefile.in
+++ /dev/null
@@ -1,3 +0,0 @@
-
-top_builddir = @top_builddir@
-include $(top_builddir)/build/rules.mk
